java - 如何以编程方式使用户超时会话到期
问题描述
如果管理员禁用或删除它们,我希望用户即使他们有活动会话也要注销。我正在使用过滤器进行操作,但我无法清除会话,我什至不明白为什么?
我还在 web.xml 文件中添加了 HttpSessionEventPublisher
public class CheckUserFilter extends GenericFilterBean{
private AuthenticationTrustResolver authenticationTrustResolver = new AuthenticationTrustResolverImpl();
@Autowired
private UserService userService;
@Autowired
private SessionRegistryImpl sessionRegistryImpl;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{
boolean enabled = true;
HttpServletRequest req = (HttpServletRequest) request;
String ajaxHeader = ((HttpServletRequest) request).getHeader("X-Requested-With");
if ("XMLHttpRequest".equals(ajaxHeader)) {
if (!authenticationTrustResolver.isAnonymous(SecurityContextHolder.getContext().getAuthentication())) {
UserDetails loggedUser = (UserDetails) SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
enabled = userService.isUserEnabled(loggedUser.getUsername(), req);
if(!enabled){
//req.logout();
List<SessionInformation> sessions = sessionRegistryImpl.getAllSessions(SecurityContextHolder.getContext()
.getAuthentication().getPrincipal(), false);
sessionRegistryImpl.getSessionInformation(sessions.get(0).getSessionId()).expireNow();
request.getRequestDispatcher("/login").forward(request, response);
}
}
}
chain.doFilter(request, response);
}
}
解决方案
HttpSession
对象具有invalidate
使自身过期的方法。
https://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/HttpSession.html#invalidate()
推荐阅读
- python-2.7 - Sublime Text 3 文件未在命令行/powershell 中打开
- visual-studio-code - vscode错误警告ejs动态元素样式
- regex - 为什么 "ab(cd|c)*d" 完全匹配 "abcdcdd" 但 "ab(c|cd)*d" 不匹配?虽然他们彼此相似
- arangodb - 如何在没有最大值的情况下获取 ArangoDB 图遍历中的所有顶点?
- php - 注册错误,参数 1 在 laravel 5.8 中传递给 Illuminate\Auth\SessionGuard::login()
- android - 卸载并再次安装应用程序时出现应用程序未安装错误
- swift - UICollectionView - 为什么不调用方法?
- python - 如何从 Python 中的字符串列表中删除空格和 \n?
- reactjs - 使用 firebase 中的现有值更新集合
- python - R 等效于 R 包的 python -m 模块