我们有一个使用Spring 3.0.3的Java 1.6上的应用程序构建,它使用Spring Security 3.0.5并使用Spring Web和RestEasy 2.1.0实现REST API。 我需要将此应用程序(服务器)置于代理之后,该代理将HTTPS请求流量从REST API客户端应用程序转换为HTTP流量。此更改为登录请求创建“跨域”方案:客户端发送HTTPS登录请求,服务器使用HTTP的重定向URL进行应答。目前它回复:
”http://192.168.0.10:8090/index.html;jsessionid=64FD79...86D”
,
我需要的是:
”/index.html;jsessionid=64FD79...86D”
我们提供了解决方案,使服务器以“相对”URL而不是“绝对”URL进行响应。所以我尝试在这里实现与描述情况类似的东西:
我已经使用contextRelative =" true"设置了RedirectStrategy bean。并从我的LoginSuccessHandler扩展类中的AbstractAuthenticationTargetUrlRequestHandler覆盖redirectStrategy setter,我看到HttpServletResponse对象的redirectStrategy属性按预期设置为true。仍然没有解决问题。
当使用encodeRedirectURL(" otherLogin")更改HttpServletResponse对象的redirectURLCC属性时,设置类似
的内容 ”http://192.168.0.10:8090/otherLogin”
而不是我需要的东西。我需要删除URL的整个协议+ ipaddress部分。响应对象的URL属性无法进行更改,因为它由Filter和FilterChain接口实现包装。
请提出任何想法。我想这种事情应该在web.xml或auth-AplicationContext.xml文件中解决,而不是代码。
最诚挚的问候。
答案 0 :(得分:5)
Spring Security在发送重定向时使用以下逻辑:
public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) throws IOException {
String redirectUrl = calculateRedirectUrl(request.getContextPath(), url);
redirectUrl = response.encodeRedirectURL(redirectUrl);
if (logger.isDebugEnabled()) {
logger.debug("Redirecting to '" + redirectUrl + "'");
}
response.sendRedirect(redirectUrl);
}
sendRedirect
方法需要按以下方式运行:
此方法可以接受相对URL; servlet容器必须 在发送之前将相对URL转换为绝对URL 回应客户。
这意味着无论配置或上下文设置如何,deafult都会获得绝对的URL。
您有多种选择:
AJP
而不是HTTP反向代理,或者使用某些应用程序服务器支持的公共URL传递HTTP标头),例如: documentation for Tomcat ProxyPassReverse
org.springframework.security.web.RedirectStrategy
,您将在其中手动设置Location
响应标头和HTTP 302状态代码,这应该允许您根据需要发送上下文相对重定向答案 1 :(得分:1)
并非完全相对,但您可能希望使用org.springframework.web.servlet.view.UrlBasedViewResolver
查看第4个选项,使用外部主机名重写重定向的URL,如本答案中所述:Override the default redirect URL in a SpringMVC application。
答案 2 :(得分:1)
这应该可以在Apache上实现:
ProxyPreserveHost Off
ProxyPass / http://192.168.0.10:8090
ProxyPassReverse / http://192.168.0.10:8090
并在具有端口的代理主机上再添加一个代理反向。 例如,假设您的服务器名称是proxy.example.com,第四行将是:
ProxyPassReverse / http://proxy.exemple.com:8090
看看这个答案:Sending redirect in Tomcat web application behind a Apache 2 proxy (mod_proxy)