Принудительно использовать HTTPS в Websphere 6.1
Вопрос
Мне было интересно, как я могу заставить пользователя, который запросил страницу с помощью 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;
}
}
}