Java 如何在会话超时时对Spring安全性重新身份验证后的页面应用常规筛选器

Java 如何在会话超时时对Spring安全性重新身份验证后的页面应用常规筛选器,java,spring,spring-security,Java,Spring,Spring Security,因此,我正在开发一个使用Spring安全性进行身份验证的应用程序。下面是我遇到问题的场景。用户在页面上,并且会话过期。通过刷新或尝试该页面上的内容,用户将重定向到登录页面以再次登录。我们确实有一个安全默认目标,即默认主页,但是根据spring身份验证的功能,如果您没有另外指定,它将返回到以前的位置(如果有)(我们需要此功能)。然而,还有其他因素会影响一个人是否能看到一个页面,并且这些因素在登录时会被重置,因此我们希望通过与他们通过浏览器加载页面时相同的过滤器,因此,由于没有,他们处于无法通过在网

因此,我正在开发一个使用Spring安全性进行身份验证的应用程序。下面是我遇到问题的场景。用户在页面上,并且会话过期。通过刷新或尝试该页面上的内容,用户将重定向到登录页面以再次登录。我们确实有一个安全默认目标,即默认主页,但是根据spring身份验证的功能,如果您没有另外指定,它将返回到以前的位置(如果有)(我们需要此功能)。然而,还有其他因素会影响一个人是否能看到一个页面,并且这些因素在登录时会被重置,因此我们希望通过与他们通过浏览器加载页面时相同的过滤器,因此,由于没有,他们处于无法通过在网站上导航进入的状态(也就是说,菜单是不同的,因为在他们的常规登录中,他们不应该看到刷新的页面——要看到这一点,他们必须更改为不同类型的用户,这在会话中不会被记住)。因此,如果他们已通过常规筛选,则该页面将不被允许,因为会话过期时该页面的权限已丢失。我希望这是有意义的。简单的解决方案是在重新验证后强制所有人返回主页,但人们喜欢刷新/重新验证/返回页面功能

这是Spring security的配置。我想知道是否有一种机制可以强制页面执行与单击链接相同的重新加载过程,即验证特定用户当时可以看到的内容的过滤器。此重新验证过程似乎跳过了这一步。有什么建议吗

我想要的与这个问题相反,因为他们想要强制返回默认页面,这是一个简单的设置:

很抱歉出现了文字墙,并提前感谢您提供的任何见解

<bean id="authenticatedVoter" class="org.springframework.security.access.vote.AuthenticatedVoter" />
<bean id="roleVoter" class="com.dummy.admin.security.DummyRoleVoter">
    <property name="rolePrefix" value="" />
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
    <property name="decisionVoters">
        <list>
            <ref bean="roleVoter" />
            <ref bean="authenticatedVoter" />
        </list>
     </property>
</bean>

<security:http auto-config="true" access-decision-manager-ref="accessDecisionManager">
    <security:form-login login-page="/login.htm" 
                         login-processing-url="/loginProcess" 
                         default-target-url="/default.htm" 
                         authentication-failure-url="/login.htm?login_error=1" />
    <security:logout logout-url="/logout" logout-success-url="/login.htm" />
    <security:access-denied-handler error-page="/accessdenied.htm"/>
    <security:intercept-url pattern="/**" access="DUMMY" />
</security:http>

<bean id="customAuthenticationProvider" class="com.dummy.admin.security.CustomAuthenticationProvider"/>

<security:authentication-manager>
    <security:authentication-provider ref="customAuthenticationProvider"/>
</security:authentication-manager>


我不太了解您问题的细节(“他们必须更改为不同类型的用户”等),但如果您在尝试刷新页面后再次登录,当您被重定向到最初请求的页面时,所应用的访问控制检查没有任何差异,这似乎是您所要求的。(顺便说一句,“过滤器”在这里是一个糟糕的选择,因为我以为您指的是Spring Security应用的servlet过滤器,但我想您不是,因为您只有一个过滤器链).Hmmm,看起来不像是同一个servlet筛选器链启动了。我指的是更改为不同类型的用户-当您登录时,您是“团队a”的一部分。团队a允许某些页面。您也可以成为“团队B”的一部分,并且您可以将菜单项更改为“团队B”,现在您看到了不同的页面。但是,当您刷新重新身份验证时,您将返回到团队a,只是它允许显示团队B页面。在正常路径中,servlet筛选器链中有一个检查,而这似乎没有在此处触发,这使我感到困惑。从调试日志中应该可以明显看出是哪个筛选器为请求调用。每个都会依次登录。还要确保您不仅看到浏览器中的缓存页面,也就是说,请求实际上已发送。这就是我想知道的,我感觉它正在使用缓存页面,因为我在日志中没有看到过滤器,或者在调试时。我个人宁愿强制新登录返回到主页,但人们喜欢能够刷新并重新验证。这是在我们对多个团队进行此更改之前。我无法找到强制重新加载的内容,并且仅在重新验证的情况下不使用缓存。使用浏览器调试插件(例如firebug或chrome的devtools)验证响应是否缓存。如果不缓存,请在服务器端设置适当的HTTP响应头以防止缓存。如果我记得,Spring支持开箱即用。只需查找即可。