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

 更新时间:2017年10月06日 11:21:15   作者:思与学  
这篇文章主要给大家介绍了关于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保持了一致。

总结

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

相关文章

  • Springboot配置文件相关说明解析

    Springboot配置文件相关说明解析

    这篇文章主要介绍了Springboot配置文件相关说明解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java绘图技术的详解及实例

    Java绘图技术的详解及实例

    这篇文章主要介绍了Java绘图技术的详解及实例的相关资料,这里主要详解Graphics类的使用,需要的朋友可以参考下
    2017-08-08
  • Java中HTTP接口请求重试的实现方式

    Java中HTTP接口请求重试的实现方式

    HTTP接口请求重试是指在请求失败时,再次发起请求的机制,在实际应用中,由于网络波动、服务器故障等原因,HTTP接口请求可能会失败,为了保证系统的可用性和稳定性,需要对HTTP接口请求进行重试,所以本文给大家介绍了HTTP接口请求重试的实现方式,需要的朋友可以参考下
    2024-01-01
  • JVM创建对象及访问定位过程详解

    JVM创建对象及访问定位过程详解

    这篇文章主要介绍了JVM创建对象及访问定位过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Spring cloud负载均衡@LoadBalanced & LoadBalancerClient

    Spring cloud负载均衡@LoadBalanced & LoadBalancerClient

    由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance
    2023-11-11
  • Spring Boot 校验用户上传的图片文件(两种方式)

    Spring Boot 校验用户上传的图片文件(两种方式)

    图片上传是现代应用中非常常见的一种功能,也是风险比较高的一个地方,恶意用户可能会上传一些病毒、木马,本文给大家介绍两种对图片文件进行校验的方法,感兴趣的朋友一起看看吧
    2023-11-11
  • SpringCloud OpenFeign超时控制示例详解

    SpringCloud OpenFeign超时控制示例详解

    在Spring Cloud中使用OpenFeign时,可以通过配置来控制请求的超时时间,这篇文章主要介绍了SpringCloud OpenFeign超时控制,需要的朋友可以参考下
    2024-05-05
  • spring boot和spring cloud之间的版本关系

    spring boot和spring cloud之间的版本关系

    这篇文章主要介绍了spring boot和spring cloud之间的版本关系,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • java的if else语句入门指南(推荐)

    java的if else语句入门指南(推荐)

    下面小编就为大家带来一篇java的if else语句入门指南(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java中static变量作用和用法详解

    Java中static变量作用和用法详解

    Java 中被 static 修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所有对象所共享。静态成员可以使用类名直接访问,也可以使用对象名进行访问.下面我们来详细了解一下吧
    2019-06-06

最新评论