在jsp页面里,Object obj =SecurityContextHolder.getContext().getAuthentication();
obj值是null。
但是我的认证已经成功的,if (event instanceof AuthenticationSuccessEvent)的值是true。
并且在我的一个自定义的监听器响事件记录用户登录日志的LoginSuccessListener,代码如下:
public class LoginSuccessListener implements ApplicationListener {
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof AuthenticationSuccessEvent) {// ①判断是否是认证成功的事件
AuthenticationSuccessEvent authEvent = (AuthenticationSuccessEvent) event;
Authentication auth = authEvent.getAuthentication();
String userName = auth.getName();
// ②这里,我们仅通过一条输出信息的语句模拟记录登录日志的操作
System.out.println("模拟记录用户[" + userName + "]成功登录日志...");
Object obj = SecurityContextHolder.getContext().getAuthentication();
if (null != obj){
System.out.println("模拟记录用户[" + userName + "]成功登录日志...");
}
else
System.out.println("模拟记录用户[" + userName + "]登录日志失败...");
}
}
}
经测试,其中obj的值是不空的。
[b]问题补充:[/b]
我的applicationContext-acegi-security.xml已经有了HttpSessionContextIntegrationFilter
代码如下:
<!-- ========================= 过滤器链 ========================= -->
class="org.acegisecurity.util.FilterChainProxy">
<![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=HttpSessionContextIntegrationFilter,authenticationProcessingFilter,filterInvocationInterceptor
]]>
<!-- ②通过HttpSession转存SecurityContext的过滤器 -->
<bean id="HttpSessionContextIntegrationFilter"
class="org.acegisecurity.context.HttpSessionContextIntegrationFilter" />