Spring Security和AJP代理

And*_*gin 8 tomcat mod-proxy ajp spring-security

我将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>
Run Code Online (Sandbox Code Playgroud)

当我打电话给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

PS谷歌没有发现任何与此问题有关的内容似乎很奇怪.我是唯一使用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>
Run Code Online (Sandbox Code Playgroud)

Axe*_*auf 4

Spring Security 是 Web 应用程序上下文感知的,这意味着它的重定向将始终基于当前的 Web 应用程序上下文。这是设计使然,因为您的应用程序服务器可能正在运行多个不同的 Web 应用程序,这些应用程序不应相互干扰。

您是否仅在服务器上运行此应用程序,并且可以将其部署为 Tomcat 上的 ROOT 应用程序(例如将其放入webapps/ROOT/)?这将消除您的上下文前缀并解决您的问题。

另一种选择可能是在将应用程序服务器上的重定向 URL 传递到客户端之前重写它,例如使用来自outbound-ruleorg.tuckey 的 GreatURLRewriteFilter(如 mod_rewrite,但适用于 Java EE Web 应用程序)。当然,您必须注意过滤器的正确顺序,web.xml因为 Spring Security 也使用过滤器来实现其逻辑。