项目需要,要求登录用户非空闲状态,不可退出。说白了就是,在退出的时候增加逻辑判断,如果状态为非空,就不让其退出。
仔细查看spring security文档,发现这个框架里维护了一个过滤器链,来提供服务。而我退出策略用的是LogoutFilter,框架默认提供的过滤器。代码如下:

<sec:http use-expressions="false" auto-config="true"entry-point-ref="loginUrlAuthenticationEntryPoint"><sec:intercept-url pattern='/**' access='ROLE_LOGIN' />**<sec:logout invalidate-session="true" logout-url="/logout" success-handler-ref="logoutSuccessHandler"delete-cookies="JSESSIONID"/>**<sec:csrf disabled="true" /><sec:custom-filter position="CONCURRENT_SESSION_FILTER"ref="concurrencyFilter" /><sec:custom-filter before="FORM_LOGIN_FILTER" ref="authFilter" /><sec:session-management invalid-session-url="/sessionexpired"session-authentication-strategy-ref="sas" /></sec:http>

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

因此可以自定义过滤器,赶在LogoutFilter之前执行,配置如下:

<sec:custom-filter before="LOGOUT_FILTER"ref="cloudqLogoutFilter" /><bean id="cloudqLogoutFilter" class="com.raymon.cloudq.security.CloudqLogoutFilter"><property name="logoutUrl" value="/logout" /></bean>

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;@AutowiredWindowCurrentStateMapper windowCurrentStateMapper@Overrideprotected void initFilterBean() throws ServletException {super.initFilterBean();mapper.setPropertyNamingStrategy(new PropertyNamingStrategy.UpperCamelCaseStrategy());}@Overridepublic 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<WindowsParticulars> 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;}
}

问题搞定!

spring security 自定义退出策略相关推荐

  1. Spring Security 自定义接口登出

    Spring Security 自定义接口登出 使用Security提供的工具,在接口内登出用户. 工具类代码 // 注入 tokenStore@Autowiredprivate final Toke ...

  2. Spring Security自定义登录验证及登录返回结果

    Spring Security自定义登录验证及登录返回结果 一.功能描述 二.处理逻辑 简单流程 自定义UserDetails 自定义UserDetailsDAO 自定义UserDetailsServ ...

  3. (二)Spring Security自定义登录成功或失败处理器

    目录 一:创建登录成功处理器 二:创建登录失败处理器 三:添加处理器 三. 项目地址 我们接着上一章 Spring Security最简单的搭建,进行开发 LoginSuccessHandler 和L ...

  4. 3.Spring Security 自定义用户认证

    Spring Security自定义用户认证 自定义认证过程 自定义认证的过程需要实现Spring Security提供的UserDetailService接口,该接口只有一个抽象方法loadUser ...

  5. spring security 自定义认证登录

    spring security 自定义认证登录 1.概要 1.1.简介 spring security是一种基于 Spring AOP 和 Servlet 过滤器的安全框架,以此来管理权限认证等. 1 ...

  6. spring security自定义指南

    序 本文主要研究一下几种自定义spring security的方式 主要方式 自定义UserDetailsService 自定义passwordEncoder 自定义filter 自定义Authent ...

  7. Spring Security——自定义认证错误提示信息及自适应返回格式解决方案

    解决方案 package com.hailiu.web.handler;import com.hailiu.model.Log; import com.hailiu.web.bean.Response ...

  8. Spring Security 自定义资源服务器实践

    相关文章: OAuth2的定义和运行流程 Spring Security OAuth实现Gitee快捷登录 Spring Security OAuth实现GitHub快捷登录 Spring Secur ...

  9. Spring Security 强制退出指定用户

    应用场景 最近社区总有人发文章带上小广告,严重影响社区氛围,好气!对于这种类型的用户,就该永久拉黑! 社区的安全框架使用了 spring-security 和 spring-session,登录状态 ...

最新文章

  1. C语言程序设计 搜集C/C++编译器
  2. 毕业设计:基于Springboot实现求职招聘,校园招聘系统
  3. NetworkOnMainThreadException异常
  4. 如何查看笔记本电脑配置参数_2020双十一(小白/学生)如何选购笔记本电脑?5000元预算哪款笔记本配置值得入手?...
  5. Java 集合中的方法性能分析
  6. 对话推荐系统_RSPapers | 对话推荐系统论文合集
  7. BZOJ 1257: [CQOI2007]余数之和sum【神奇的做法,思维题】
  8. 如何写一手好 SQL 【频繁出现慢SQL告警的优化方案】
  9. C++11 并发指南四(future 详解二 std::packaged_task 介绍)
  10. GIT创建公钥,并放置远程库
  11. python 基础课程第二天
  12. Solidity的三种合约间的调用方式 call、delegatecall 和 callcode
  13. 安装版mysql数据库data在_MySQL 5.7版本的安装使用详细教程+更改数据库data的存储路径...
  14. 【机器学习算法笔记】5. 自组织映射SOM
  15. 论文研究结论怎么写?
  16. 虚拟机服务器安装虚拟机的步骤
  17. SLCP验厂辅导,工厂进行社会劳工整合项目(SLCP认证)验证的具体步骤是
  18. 讲明白——K8S各核心架构组件
  19. 百度推广创意怎么写?百度推广创意十大秘籍
  20. LINK : fatal error LNK1181: cannot open input file “libcurl.lib“

热门文章

  1. 【漏洞分析】Adobe Acrobat和Reader整数溢出漏洞(CVE-2012-0774)
  2. 常见的量化交易策略简介
  3. 邮箱主机 网易 腾讯 新浪 搜狐
  4. N个技巧,编写更高效 Dockerfile
  5. Windows配置DNS服务器
  6. linux查看edid信息,EDID 信息
  7. Linux DRM(六) -- EDID
  8. 90后创业代表张裕平即将出席2016中国IT领袖峰会
  9. 真我q2PRO鸿蒙系统,realme真我Q2系列发布 售价低至998元起
  10. Builder模式与Factory模式区别