我将Spring Security和Apache代理用于Web应用程序。使用标准mod_proxy时一切正常,但在切换到AJP代理后,Spring安全重定向出现了问题。
Apache配置:
<VirtualHost *:80>
ServerName domain.com
ProxyPass / ajp://localhost:8009/Context/
ProxyPassReverse / ajp://localhost:8009/Context/
</VirtualHost>
当我致电http://domain.com/login时,我会看到一个登录表单。
当我提交表单时,我会转到http://domain.com/auth并获得身份验证。
然后Spring Security应重定向到http://domain.com/index,但会重定向到http://domain.com/Context/index
如何摆脱上下文路径?为什么Spring Security会在任何地方添加它?
在Spring Security网站上有一个类似的问题,但没有人回答:
http://forum.springsource.org/showthread.php?95141-Why-is-spring-security-including-the-context-path
P.S。 谷歌没有发现任何与此问题更相关的内容似乎很奇怪。我是唯一使用Spring Security + AJP的人吗?也许这是一个错误的模式?
解决方案:
<VirtualHost *:80>
ServerName domain.com
RewriteEngine on
RewriteRule ^/Context/(.*)$ /$1 [R=301]
ProxyPass / ajp://localhost:8009/Context/
ProxyPassReverse / ajp://localhost:8009/Context/
</VirtualHost>
答案 0 :(得分:4)
Spring Security是Web应用程序上下文感知,这意味着它的重定向将始终基于当前的Web应用程序上下文。这是设计使然,因为您的应用服务器可能正在运行几个不应相互干扰的不同Web应用程序。
您是否只在服务器上运行此应用程序,并且可以将其作为ROOT应用程序部署在Tomcat上(例如将其放入webapps/ROOT/
)?这将消除您的上下文前缀并解决您的问题。
另一个选项可能是在将应用服务器传递给客户端之前重写应用服务器上的重定向URL,例如: G。使用an outbound-rule
from org.tuckey's great URLRewriteFilter
(类似于mod_rewrite,但适用于Java EE Web应用程序)。当然,您必须在web.xml
中处理正确的过滤器排序,因为Spring Security也会使用过滤器作为其逻辑。