我正在使用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。谢谢。
答案 0 :(得分:0)
我在spring security中实现了AuthenticationSuccessHandler,我得到了新的会话。发生的事情是,在Spring安全性创建新会话之前,会在成功事件上调用ApplicationListener。但是在实现AuthenticationSuccessHandler之后,我得到了一个新的会话,Spring会在成功登录后创建它。