全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

spring boot实战教程之shiro session过期时间详解

前言

众所周知在spring boot内,设置session过期时间只需在application.properties内添加server.session.timeout配置即可。在整合shiro时发现,server.session.timeout设置为7200,但未到2小时就需要重新登录,后来发现是shiro的session已经过期了,shiro的session过期时间并不和server.session.timeout一致,目前是采用filter的方式来进行设置。

ShiroSessionFilter

/** 
 * 通过拦截器设置shiroSession过期时间
 * @author yangwk 
 */ 
public class ShiroSessionFilter implements Filter { 
 private static Logger logger = LoggerFactory.getLogger(ShiroSessionFilter.class);
 
 public List<String> excludes = new ArrayList<String>();
 
 private long serverSessionTimeout = 180000L;//ms
 
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException,ServletException { 
  if(logger.isDebugEnabled()){
   logger.debug("shiro session filter is open");
  }
  
  HttpServletRequest req = (HttpServletRequest) request;
  HttpServletResponse resp = (HttpServletResponse) response;
  if(handleExcludeURL(req, resp)){
   filterChain.doFilter(request, response);
   return;
  }
  
  Subject currentUser = SecurityUtils.getSubject();
  if(currentUser.isAuthenticated()){
   currentUser.getSession().setTimeout(serverSessionTimeout);
  }
  filterChain.doFilter(request, response);
 }
 
 private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {

  if (excludes == null || excludes.isEmpty()) {
   return false;
  }

  String url = request.getServletPath();
  for (String pattern : excludes) {
   Pattern p = Pattern.compile("^" + pattern);
   Matcher m = p.matcher(url);
   if (m.find()) {
    return true;
   }
  }

  return false;
 }

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
  if(logger.isDebugEnabled()){
   logger.debug("shiro session filter init~~~~~~~~~~~~");
  }
  String temp = filterConfig.getInitParameter("excludes");
  if (temp != null) {
   String[] url = temp.split(",");
   for (int i = 0; url != null && i < url.length; i++) {
    excludes.add(url[i]);
   }
  }
  String timeout = filterConfig.getInitParameter("serverSessionTimeout");
  if(StringUtils.isNotBlank(timeout)){
   this.serverSessionTimeout = NumberUtils.toLong(timeout,1800L)*1000L;
  }
 }

 @Override
 public void destroy() {} 
 
}

注册filter

在被@Configuration注解标注的类内注册ShiroSessionFilter。

@Value("${server.session.timeout}")
private String serverSessionTimeout;

@Bean
public FilterRegistrationBean shiroSessionFilterRegistrationBean() {
 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
 filterRegistrationBean.setFilter(new ShiroSessionFilter());
 filterRegistrationBean.setOrder(FilterRegistrationBean.LOWEST_PRECEDENCE);
 filterRegistrationBean.setEnabled(true);
 filterRegistrationBean.addUrlPatterns("/*");
 Map<String, String> initParameters = Maps.newHashMap();
 initParameters.put("serverSessionTimeout", serverSessionTimeout);
 initParameters.put("excludes", "/favicon.ico,/img/*,/js/*,/css/*");
 filterRegistrationBean.setInitParameters(initParameters);
 return filterRegistrationBean;
}

这样当每次请求时,如果用户已登录,就重新设置shiro session有效期,从而和server session保持了一致。

总结

以上就是这篇文章的全部内容,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。


# spring  # session  # shiro  # boot  # springboot  # Shiro中session超时页面跳转的处理方式  # spring boot整合redis实现shiro的分布式session共享的方法  # Spring Boot集成Shiro并利用MongoDB做Session存储的方法详解  # Shiro+Redis实现登录次数冻结的示例  # springboot整合shiro登录失败次数限制功能的实现代码  # SpringBoot+Shiro学习之密码加密和登录失败次数限制示例  # Shiro实现session限制登录数量踢人下线功能  # 只需  # 有一定  # 时就  # 这篇文章  # 谢谢大家  # 设置为  # 众所周知  # 未到  # 拦截器  # 有疑问  # long  # ArrayList  # serverSessionTimeout  # ms  # gt  # List  # lt  # LoggerFactory  # getLogger  # logger 


相关文章: 网站制作公司排行榜,四大门户网站排名?  潮流网站制作头像软件下载,适合母子的网名有哪些?  宿州网站制作公司兴策,安徽省低保查询网站?  如何快速搭建自助建站会员专属系统?  建站主机选购指南:核心配置与性价比推荐解析  寿县云建站:智能SEO优化与多行业模板快速上线指南  ,石家庄四十八中学官网?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  如何用PHP快速搭建CMS系统?  c# await 一个已经完成的Task会发生什么  ,有什么在线背英语单词效率比较高的网站?  高端云建站费用究竟需要多少预算?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何自定义建站之星模板颜色并下载新样式?  天津个人网站制作公司,天津网约车驾驶员从业资格证官网?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何选择美橙互联多站合一建站方案?  制作农业网站的软件,比较好的农业网站推荐一下?  动图在线制作网站有哪些,滑动动图图集怎么做?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  如何通过云梦建站系统实现SEO快速优化?  如何通过cPanel快速搭建网站?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  微网站制作教程,不会写代码,不会编程,怎么样建自己的网站?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  如何彻底卸载建站之星软件?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何确保西部建站助手FTP传输的安全性?  如何制作算命网站,怎么注册算命网站?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  中山网站制作网页,中山新生登记系统登记流程?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  如何获取PHP WAP自助建站系统源码?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  建站VPS能否同时实现高效与安全翻墙?  湖北网站制作公司有哪些,湖北清能集团官网?  如何在建站主机中优化服务器配置?  常州企业网站制作公司,全国继续教育网怎么登录?  建站为何优先选择香港服务器?  如何获取上海专业网站定制建站电话?  建站之星如何修改网站生成路径?  移民网站制作流程,怎么看加拿大移民官网?  建站之星代理商如何保障技术支持与售后服务?  如何在阿里云部署织梦网站?  香港服务器网站推广:SEO优化与外贸独立站搭建策略  如何选择高效可靠的多用户建站源码资源?  如何在万网自助建站平台快速创建网站?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  制作门户网站的参考文献在哪,小说网站怎么建立?  广州营销型建站服务商推荐:技术优势与SEO优化解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。