博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring security 自定义退出策略
阅读量:2022 次
发布时间:2019-04-28

本文共 3430 字,大约阅读时间需要 11 分钟。

项目需要,要求登录用户非空闲状态,不可退出。说白了就是,在退出的时候增加逻辑判断,如果状态为非空,就不让其退出。

仔细查看spring security文档,发现这个框架里维护了一个过滤器链,来提供服务。而我退出策略用的是LogoutFilter,框架默认提供的过滤器。代码如下:

**
**

而框架提供过滤器链如下:

这里写图片描述
因此可以自定义过滤器,赶在LogoutFilter之前执行,配置如下:

filter代码如下

/** * 非空闲状态下,用户不能退出 * Created by  on 2017/11/7. */public class CloudqLogoutFilter extends GenericFilterBean {
private org.slf4j.Logger logger = LoggerFactory.getLogger(getClass()); private ObjectMapper mapper = new ObjectMapper(); private String logoutUrl; @Autowired WindowCurrentStateMapper windowCurrentStateMapper @Override protected void initFilterBean() throws ServletException { super.initFilterBean(); mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.UpperCamelCaseStrategy()); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; if (this.requiresLogout(request, response) && SecurityContextHolder.getContext() != null && SecurityContextHolder.getContext().getAuthentication() != null) { AuthUserDetails authUser = (AuthUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); ClientEmp clientEmp = authUser.getClientEmpUser(); Integer empId = clientEmp.getEmpId(); Integer branchesId = clientEmp.getBranchesId(); List
windowEmpList = windowCurrentStateMapper.selectbyEmpId(branchesId, empId); if (windowEmpList != null && windowEmpList.size() > 0) { for (WindowsParticulars windowEmp : windowEmpList) { if (Constants.WINDOW_CURRENT_STATE_CALL.equals(windowEmp.getCurrentState()) || Constants.WINDOW_CURRENT_STATE_IN_PROCESS.equals(windowEmp.getCurrentState())) { logger.info("您的账号id='{}',name='{}',非空闲状态下,用户不能退出", clientEmp.getEmpId(), clientEmp.getEmpName()); printErrorMsg(servletResponse); return; } } } } filterChain.doFilter(servletRequest, servletResponse); } private void printErrorMsg(ServletResponse servletResponse) { servletResponse.setContentType("application/json"); servletResponse.setCharacterEncoding("UTF-8"); PrintWriter out = null; try { out = servletResponse.getWriter(); Result result = new Result(StatusCode.ERROR_WINDOW_NOT_HANDLE, null, "非空闲状态下,用户不能退出"); out.write(mapper.writeValueAsString(result)); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } } } /** * 判断请求路径是否是退出 * * @param request * @param response * @return */ private boolean requiresLogout(HttpServletRequest request, HttpServletResponse response) { if (StringUtils.isBlank(logoutUrl)) return false; String path = request.getRequestURI(); return path.contains(logoutUrl); } public void setLogoutUrl(String logoutUrl) { this.logoutUrl = logoutUrl; }}

问题搞定!

你可能感兴趣的文章
《大道至简》的幕后故事(2):“愚公移山记”人物篇
查看>>
《大道至简》的幕后故事(3):“愚公移山记”事物篇
查看>>
《大道至简》的幕后故事(4):“愚公移山记”军事地理篇
查看>>
《大道至简》的幕后故事(5):“愚公移山记”军事谋略篇
查看>>
《大道至简》的幕后故事:终结篇、勘误和PDF下载
查看>>
架构师的能力模型(图)
查看>>
能力要成体系
查看>>
Qomo 2.0 beta1 发布说明及新功能
查看>>
又见标题党——怒评《JavaScript核心技术》
查看>>
让leeon不再眷念马桶——书评《精通正则表达式》
查看>>
再议《JavaScript代码优化一例》
查看>>
一些JavaScript 1.6~1.8上的高级技巧~
查看>>
有源则至清——我读《移山之道》
查看>>
有关《大道至简》的几点讨论~
查看>>
从表达式到函数:表面的简洁
查看>>
对话:关于架构、设计与需求
查看>>
我的程序语言实践
查看>>
还原JavaScript的真实历史~
查看>>
关于Qomo 2.0 beta1的发布
查看>>
启动一个最小化Qomo项目-QoBean!
查看>>