在servlet doFilter和spring security的ApplicationListener中获取不同的会话ID

时间:2018-04-04 11:04:17

标签: java spring servlets spring-security

我正在使用spring security来验证用户,之后我使用ApplicationListener接口在成功事件后将用户数据放入会话中。像这样,

@Service
@Transactional
public class LoggedUserListener implements
ApplicationListener<AuthenticationSuccessEvent> {

@Autowired
private HttpSession session;

@Autowired
private ServletContext servletContext;

@Autowired
private HttpServletRequest request;

@Override
public void onApplicationEvent(AuthenticationSuccessEvent event) {

String name = event.getAuthentication().getName();//user.getUsername()

UserMaster userMaster = userDao.findByUserName(name);

System.out.println("Inside onApplicationEvent Session id is "+request.getSession().getId());

request.getSession().setMaxInactiveInterval(1 * 60 * 60);

 setSessionDataForUser(request.getSession(), userMaster);

}

其中setSessionDataForUser是自定义方法,用于在给定会话中添加用户数据。 我有一个身份验证类,它实现了文件管理器接口,用于在成功登录后验证来自用户的所有请求。像这样,

    public class Authentication implements Filter {

    final static Logger logger=Logger.getLogger(Authentication.class);

    public void destroy() {
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
System.out.println("Inside doFilter Session ID is "+httpRequest.getSession().getId());
}

以上是在web.xml中配置如下,

<session-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
<filter>
    <filter-name>authentication</filter-name>
    <filter-class>com.lms.utils.Authentication</filter-class>
</filter>

但是为什么我从两个类中获取不同的会话ID,实际上我在会话ID上写了一个逻辑,所以我要求ApplicationListener和身份验证类中的会话ID用户登录后即可。 我在AuthenticationSuccessEvent中获得的会话ID与身份验证类的doFilter方法不同。或者是因为对于tomcat(用于登录的服务器),创建了单独的会话ID,并且对于登录后的所有请求,即请求形成角度IDE服务器,生成单独的会话ID。谢谢。

1 个答案:

答案 0 :(得分:0)

我在spring security中实现了AuthenticationSuccessHandler,我得到了新的会话。发生的事情是,在Spring安全性创建新会话之前,会在成功事件上调用ApplicationListener。但是在实现AuthenticationSuccessHandler之后,我得到了一个新的会话,Spring会在成功登录后创建它。