【问题标题】:Spring Security and AJP proxySpring Security 和 AJP 代理
【发布时间】:2011-08-29 03:10:37
【问题描述】:

我将 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

附: 谷歌没有找到与这个问题更相关的东西,这似乎很奇怪。我是唯一一个使用 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>

【问题讨论】:

    标签: tomcat spring-security mod-proxy ajp


    【解决方案1】:

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

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

    另一个选项可能是在应用服务器上重写重定向 URL,然后再将其传递给客户端,例如。 G。使用an outbound-rule from org.tuckey's great URLRewriteFilter(类似于 mod_rewrite,但适用于 Java EE Web 应用程序)。当然,您必须在 web.xml 中处理正确的过滤器排序,因为 Spring Security 也将过滤器用于其逻辑。

    【讨论】:

    • 谢谢!最后,我使用了 Apache mod_rewrite。查看我的问题的更新。
    猜你喜欢
    • 2021-01-02
    • 2016-01-31
    • 2015-09-17
    • 2018-08-22
    • 2015-11-19
    • 2013-12-31
    • 2013-07-16
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多