Вопрос

Мне было интересно, как я могу заставить пользователя, который запросил страницу с помощью Http, использовать безопасную версию https?

Я использую Websphere 6.1 в качестве сервера приложений и Rad 7 в качестве среды разработки.

Спасибо, Дэмиен

Это было полезно?

Решение

Одним из способов сделать это в вашем приложении, а не в конфигурации сервера, является использование Фильтр (указанный в вашем web.xml), чтобы проверить, ServletRequest.getScheme() имеет значение «http» или «https» и перенаправляет пользователя на соответствующий URL-адрес (используя HttpServletResponse.sendRedirect(String url)).

Другие советы

Вы можете добавить следующую запись в свой web.xml, и она обеспечит преобразование всех запросов в https.

<!--********************************
   *** SSL Security Constraint  ***
   *****************************-->
   <security-constraint>
       <web-resource-collection>
           <web-resource-name>SSL</web-resource-name>
           <url-pattern>/*</url-pattern>
       </web-resource-collection>
       <user-data-constraint>
           <transport-guarantee>CONFIDENTIAL</transport-guarantee>
       </user-data-constraint>
   </security-constraint>

<!--********************************* -->

Websphere не является полноценным http-сервером.У него есть «Транспортные цепочки», которые действуют как HTTP-сервер.

Обычно вы ставите HTTP-сервер впереди.IBM предоставляет IHS (IBM HTTP Server), который представляет собой слегка модифицированный HTTP-сервер Apache.HTTP-сервер настраивается с помощью файла httpd.conf.Там вы добавляете редиректы таким образом, чтобы запросы по http перенаправлялись на https.

Возможно, вы сможете предоставить подробную информацию о вашей инфраструктуре.

Я согласен.Я думаю, что использование фильтра позволит добиться этого.Вот фильтр, который я написал для балансировки нагрузки и перенаправления портов, но вам будет легко понять, как его отредактировать в соответствии с вашими потребностями.

публичный класс RequestWrapperFilter реализует фильтр {

public void doFilter(ServletRequest servletRequest,
        ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {

    HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
    HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;

    String requestWrapperClassName = (String) (httpRequest
            .getAttribute(LoadBalancerRequestWrapper.class.getName()));

    String initiatingServerName = httpRequest.getServerName();

    if (requestWrapperClassName == null
            && initiatingServerName.equals(loadBalancerHostName)) {

        httpRequest = new LoadBalancerRequestWrapper(AuthenticationUtil
                .getHttpServletRequest(httpRequest));
    }

    filterChain.doFilter(httpRequest, httpResponse);
}

}

/**
 * The custom implementation of the request wrapper. It simply overrides the
 * getScheme() and getServerPort() methods to perform the redirect
 * filtering.
 * 
 * 
 */
private static class LoadBalancerRequestWrapper extends
        HttpServletRequestWrapper {

    /**
     * Default Constructor. Simply declares the Wrapper as injected.
     * 
     * @param httpServletRequest
     *            the app-server HttpServletRequest.
     * 
     */
    public LoadBalancerRequestWrapper(HttpServletRequest httpServletRequest) {
        super(httpServletRequest);
    }

    /**
     * The overridden scheme.
     * 
     */
    public final String getScheme() {
        if (loadBalancerHttpScheme.equals(EMPTY_STRING)) {
            return super.getScheme();
        }

        return loadBalancerHttpScheme;
    }
}

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top