Spring 安全会话管理和 Spring MVC 视图解析器错误

Posted

技术标签:

【中文标题】Spring 安全会话管理和 Spring MVC 视图解析器错误【英文标题】:Spring security session management and Spring MVC view resolver error 【发布时间】:2013-07-02 07:46:33 【问题描述】:

我正在开发一个 Spring MVC Web 应用程序。上周我开始在我的项目中添加 Sping Secuirty。我面临的问题涉及会话管理。 这是我的 spring-security.xml 的 http 部分

    <http auto-config="true">
        <intercept-url pattern="/css" filters="none"/>
        <intercept-url pattern="/js" filters="none"/>
        <intercept-url pattern="/logout" filters="none"/>
        <intercept-url pattern="/loginfailed" filters="none"/>
        <intercept-url pattern="/login" filters="none"/>
        <intercept-url pattern="/**" access="ROLE_USER" />
        <form-login login-page="/login" default-target-url="/hello"
        authentication-failure-url="/loginfailed" />
        <session-management invalid-session-url="/login.jsp?error=sessionExpired" session-authentication-error-url="/login.jsp?error=alreadyLogin">
           <concurrency-control max-sessions="1"  expired-url="/login.jsp?error=sessionExpiredDuplicateLogin" error-if-maximum-exceeded="false"/>
        </session-management>
    </http>

登录/注销工作正常,但是当我尝试通过尝试从不同的浏览器登录来使用户会话无效时 invalid-session-url="/login.jsp?error=sessionExpired" 失败。浏览器被重定向,因为我看到正在发送对 login.jsp?error=sessionExpired 的 GET 请求。但是,网页显示错误,指出资源不可用。我怀疑这与

有关
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="viewClass">
    <value>org.springframework.web.servlet.view.JstlView</value>
  </property>
  <property name="prefix">
    <value>/WEB-INF/pages/</value>
  </property>
  <property name="suffix">
    <value>.jsp</value>
  </property>
</bean>

在我的 dispatcher-servlet.xml 中。但是,我不知道如何解决这个问题。 login.jsp 位于WEB-INF/pages/

【问题讨论】:

【参考方案1】:

您正在重定向到 jsp 而不是映射的 url。

会话管理标签应该是:

<session-management invalid-session-url="/login?error=sessionExpired" session-authentication-error-url="/login?error=alreadyLogin">
       <concurrency-control max-sessions="1"  expired-url="/login?error=sessionExpiredDuplicateLogin" error-if-maximum-exceeded="false"/>
</session-management>

【讨论】:

【参考方案2】:

在我看来,Spring MVC DispatcherServlet 找不到 /login.jsp 的映射,因为 it's not set as a view that accessible without controller。我还假设您已将 /login 映射到 login.jsp(您没有提供足够的信息来确认这一点),但如果是这种情况,只需使用 expired-url="/login?error=sessionExpiredDuplicateLogin

【讨论】:

谢谢你!工作正常!顺便说一句,我有点迷失试图理解无效会话 url、会话身份验证错误 url、过期 url 之间的区别。我知道有文档,但也许您可以向我指出一个可以提供更详细信息的资源。 static.springsource.org/spring-security/site/docs/3.1.x/…

以上是关于Spring 安全会话管理和 Spring MVC 视图解析器错误的主要内容,如果未能解决你的问题,请参考以下文章

如何为特定 url 启用 spring 安全会话管理

如何在 Spring MVC-Spring Security 应用程序中处理 GWT RPC 调用的会话过期异常

如何为单页 AngularJS 应用程序实现基本的 Spring 安全性(会话管理)

Spring Security、Spring MVC 和登录会话

Spring MVC集成测试弹簧安全问题,怎么解决

在 Rails 和 Spring MVC 之间共享会话