Как мне узнать, подлежит ли HttpServletRequestили нет? - PullRequest
0 голосов
/ 26 марта 2011

В моем web.xml есть сервлет с ограничением безопасности, как показано ниже:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

Выше принудительно переключается на протокол https и работает нормально. Но на защищенных страницах есть несколько относительных ссылок на незащищенные страницы. Когда пользователи нажимают на них, они открываются через https, чего я хочу избежать. Преобразование относительных ссылок в абсолютные не вариант. Спецификация сервлета не предоставляет средства принудительного использования незащищенного соединения, поэтому я собираюсь реализовать фильтр, который перенаправляет пользователя на http:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    if(!isSubjectToAuthConstraint(request)) {
        // Check protocol and redirect to http if https
        // ....
    } else {
        // Do nothing, managed by servlet spec
        filterChain.doFilter(request, response);
    }
}

Так что мне нужно знать, находится ли запрос под защитой или нет. Откуда я знаю программно ? Возможно ли это вообще?

1 Ответ

2 голосов
/ 17 ноября 2011

Hy, в обычном случае порт https равен 443. При вводе в браузере https://www.example.com:443/welcome.html браузер расширяет его до https://www.example.com/welcome.html

Возможно, это то, что вам нужно:

String serverAddress = "";    
String serverName = request.getServerName( );
String serverPort = "" + request.getServerPort( );

if( request.isSecure( ) ) {
  serverAddress = "https://" + serverName + ":" + serverPort;
} else {
  serverAddress = "http://" + serverName + ":" + serverPort;
}
...