访问Tomcat应用程序时,Spring Security Context为null,而不是尾部斜杠

时间:2016-07-19 16:05:29

标签: spring tomcat servlets spring-security

我在Tomcat 7上部署了一个基于Spring的Web应用程序。我要做的是将application.war存档复制到webapps目录并启动服务器,因此我的应用程序根目录在{{1}下可用}。

然后我想添加Spring安全性(3.2.4)。我的目的是保护整个应用程序,而不仅仅是部分应用程序。我有Spring安全配置:

https://localhost:8443/application/

<beans:beans xmlns="http://www.springframework.org/schema/security" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.2.xsd"> <http auto-config="true"> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <authentication-manager> <authentication-provider> <user-service> <user name="admin" password="admin" authorities="ROLE_USER" /> </user-service> </authentication-provider> </authentication-manager> </beans:beans>

web.xml

这是一个基本配置,可以在官方文档和许多教程中找到。一切正常,当我没有经过身份验证时Spring会将我重定向到它的默认登录页面。然后我可以登录并可以访问应用程序,直到会话到期或我导航到注销URL。

当我访问没有尾部斜杠的应用程序根目录时,问题就开始出现了:<filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>

Spring无法找到安全上下文:

https://localhost:8443/application

然后我被重定向到登录页面,但是在我登录后,我被重定向到没有斜杠的原始URL,Spring再次失败,我再次看到登录表单。

有人知道为什么会这样吗?我的配置很少,使用开箱即用的默认值。用例也非常简单,但这并不像预期的那样令人感到奇怪。我觉得我缺少一些基本的东西,无论是使用Spring还是Tomcat。

任何帮助将不胜感激,谢谢。

3 个答案:

答案 0 :(得分:1)

问题在于JSESSIONID cookie路径 - Tomcat将其自动设置为/application/,因此任何访问应用程序root而没有斜杠的请求都被视为需要身份验证的新用户。将Cookie路径设置为/application可以解决我的问题。

答案 1 :(得分:0)

试试这个

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>
         org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/</url-pattern>
</filter-mapping>

答案 2 :(得分:0)

<http auto-config="true">
    <!-- my be this can`t match -->
    <intercept-url pattern="/**" access="ROLE_USER" />
     <!-- add this  for try -->
     <intercept-url pattern="/" access="ROLE_USER" />
</http>