我希望在发生会话超时时将用户重定向到登录页面。这与弹簧安全性开箱即用,但仅限于非ajax调用。
在ajax-call上你必须自己对会话超时作出反应。因此我创造了
我自己的过滤器(在this question中实现的过滤器),用于检查会话是否超时。过滤器通过spring security config中的custom-filter
标记进行注册。
<http use-expressions="true">
<custom-filter ref="customTimeoutHandler" after="LAST"/>
</http>
问题是,过滤器无法识别会话超时。如果我检查request.isRequestedSessionIdValid()
,即使会话超时,它也会返回true
。当我手动输入新的安全URL时,标准的spring安全过滤器会正确识别超时并重定向到登录页面。
这里有什么问题?如何识别春季安全会话超时?
更新
看起来,spring security的会话管理过滤器用一个新的匿名会话取代了超时会话。因此,每当我检查会话超时时,它都返回true
,因为新的匿名会话当然不是超时的。
答案 0 :(得分:2)
您可以查看SecurityContext
。
抓住Authentication
object和check the authorities寻找ANONYMOUS
个。类似的东西:
SecurityContext sc = SecurityContextHolder.getContext();
Authentication a = sc.getAuthentication();
if(!a.isAuthenticated() || a.getAuthorities().contains(new GrantedAuthorityImpl("ROLE_ANONYMOUS"))) {
//user not authenticated or ANONYMOUS
} else {
//user authenticated
}
答案 1 :(得分:0)
This solution对我来说就像是一种魅力。
基本概念是指向servlet而不是登录页面。然后,servlet确定请求是否是ajax请求,如果是,则将重定向作为xml片段返回到登录页面。浏览器可以解释该片段并重定向到登录页面。
答案 2 :(得分:0)
我正在开发包括gwt / gwtp和spring security的企业应用程序。 我添加了会话超时的一些问题,casue下默认使用的SimpleRedirectInvalidSessionStrategy正在执行response.sendRedirect(),我想重定向的html页面响应是由gwt com.google.gwt.user.client.rpc.InvocationException吞下的异常消息。并且没有发生实际的重定向。
解决这个问题
1。我定义了我的cosutom session-manamgemt-filter
为此,您需要在spring-security.xml配置文件集中
<session-management session-fixation-protection="none"/>
到今年春天,secuirty将不会采用默认会话管理过滤器。
定义会话管理过滤器
在此输入代码
{
<custom-filter position="SESSION_MANAGEMENT_FILTER" ref="mySessionManagmentFilter"/>
<beans:bean id="mySessionManagmentFilter"
class="org.springframework.security.web.session.SessionManagementFilter">
<beans:constructor-arg index="0" ref="mySessionSecurityContextRepository"/>
<beans:constructor-arg index="1" ref="mySessionAutenticationStrategy"/>
<beans:property name="invalidSessionStrategy">
<beans:ref local="myInvalidSessionStrategy"/>
</beans:property>
</beans:bean>
<beans:bean id="mySessionSecurityContextRepository"
class='org.springframework.security.web.context.HttpSessionSecurityContextRepository'>
<beans:property name='allowSessionCreation' value='false'/>
</beans:bean>
<beans:bean id="mySessionAutenticationStrategy"
class="org.springframework.security.web.authentication.session.ConcurrentSessionControlStrategy">
<beans:constructor-arg name="sessionRegistry" ref="sessionRegistry"/>
<beans:property name="maximumSessions" value="1"/>
<beans:property name="exceptionIfMaximumExceeded" value="false"/>
<beans:property name="alwaysCreateSession" value="true"/>
</beans:bean>
<beans:bean id="myInvalidSessionStrategy"
class="com.my.project.MyInvalidSessionStrategy">
<beans:constructor-arg value="/login.jsp?timeout=1"/>
</beans:bean>
}
这里是custom - MyInvalidSessionStrategy {
public class MyInvalidSessionStrategy implements InvalidSessionStrategy {
private final Logger logger = LoggerFactory.getLogger(getClass());
private final String destinationUrl;
public OperationalInvalidSessionStrategy(String invalidSessionUrl) {
this.destinationUrl = invalidSessionUrl;
}
@Override
public void onInvalidSessionDetected(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
String exMsg =session timeout ! , need to redirect to login page
logger.warn(exMsg);
throw new TimeOutException(exMsg);
}
}
}
因此,当超时发生时,新实现会抛出异常.. 例外可以是卡车上的gwt回调onFailure方法
检查异常的类型,onFailure方法将用户重定向到登录页面。
与Window.Location.replace(GWT.getHostPageBaseURL() + "/login.jsp")