退出系统的后置处理(2)

SecurityContext保存在HttpSession中,当用户退出系统时必须清除之,否则SecurityContext将一直保存在HttpSession中,需要等到Session过期后才会被清除,这将造成额外的内存消耗。从另外一个方面说,在退出系统时常常需要执行一些相关的操作,如记录用户退出系统的日志、将登录信息保存到Cookie中等。

Acegi为完成以上一系列由退出系统引发的操作,专门提供了一个退出过滤器:org.acegisecurity.ui.logout.LogoutFilter,它允许我们通过配置完成相关的操作:

代码清单 11 applicationContext-acegi-plugin.xml

退出系统后置处理配置

<bean id="filterChainProxy"
class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value>
…
/**=httpSessionContextIntegrationFilter,authenticationProcessingFilter,logoutFilter ①
</value>
</property>
</bean>
<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">②退出系统过滤器
<constructor-arg> ②-1退出系统前需要执行的操作
<list>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler" />
</list>
</constructor-arg>
<constructor-arg value="/index.jsp" />②-2退出系统后转向的URL
②-3用于响应退出系统请求的URL
<property name="filterProcessesUrl" value="/j_acegi_logout"/>
</bean>
… 

 

在①处,我们在过滤器链中添加一个logoutFilter,它负责处理用户退出系统的操作。退出系统过滤器需要以下三方面的信息:

1) 哪一个URL是退出系统的HTTP请求,这通过filterProcessesUrl属性指定,②-3所示。LogoutFilter默认的退出系统URL即是“/j_acegi_logout”,这里显式进行配置是为了说明可以根据需要进行调整;

2) 退出系统时需要执行哪些处理器,通过LogoutFilter的构造函数指定,如②-1所示。处理器必须实现org.acegisecurity.ui.logout.LogoutHandler接口,Acegi为该接口提供了两个实现类,分别是SecurityContextLogoutHandler和 TokenBasedRememberMeServices,前者将SecurityContext从HttpSession中删除,而后者将Anthentication中的用户名/密码保存到客户端的Cookie中,以便下次用户访问系统时直接通过Cookie中的用户名/密码进行自动登录。我们将在下一节学习到TokenBasedRememberMeServices的知识。

3) 退出系统后转向哪个URL,通过构造函数参数指定,如②-2所示。

配置好退出系统过滤器后,在需要在系统页面中提供一个退出系统的操作链接:

<A href="<c:url value="/j_acegi_logout"/>">退出系统</A>

注意粗体所示代码代表退出系统所对应的URL,它必须和LogoutFilter的filterProcessesUrl属性一致。这样,当用户点击页面中的“退出系统”链接后,LogoutFilter拦截这个URL请求,并调用SecurityContextLogoutHandler将SecurityContext从HttpSession中清除掉,最后转向/index.jsp页面。

你可能感兴趣的:(bean,UI,jsp,J#,Acegi)