如何通过ShiroFilterFactoryBean扩展实现静态文件访问不更新Session,减少Session频繁刷新?

更新于
2026-10-12 09:02:27
1阅读来源:SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计218个文字,预计阅读时间需要1分钟。

如何通过ShiroFilterFactoryBean扩展实现静态文件访问不更新Session,减少Session频繁刷新?

ShiroFilterFactoryBean 类扩展自 org.apache.shiro.spring.web.ShiroFilterFactoryBean,用于配置 Shiro 过滤器链。其核心方法 createInstance() 用于创建 Shiro 过滤器实例。

ShiroFilterFactoryBean

public class ShiroFilterFactoryBean extends org.apache.shiro.spring.web.ShiroFilterFactoryBean { private String resourcePatterns; @Override protected AbstractShiroFilter createInstance() throws Exception { AbstractShiroFilter instance = super.createInstance(); Set patternSet = null; if (StringUtils.hasText(resourcePatterns)) { patternSet = Stream.of(resourcePatterns.split(",")) .filter(StringUtils::hasLength) .map(String::trim) .collect(Collectors.toSet()); } return new SpringShiroFilter(instance.getSecurityManager(), instance.getFilterChainResolver(), patternSet); } private static final class SpringShiroFilter extends AbstractShiroFilter { private Set patternSet; private AntPathMatcher matcher; protected SpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver, Set patternSet) { super(); if (isNull(webSecurityManager)) { throw new IllegalArgumentException("WebSecurityManager property cannot be null."); } setSecurityManager(webSecurityManager); if (nonNull(resolver)) { setFilterChainResolver(resolver); } if (nonNull(patternSet)) { this.patternSet = patternSet; matcher = new AntPathMatcher(); } } @Override protected void updateSessionLastAccessTime(ServletRequest request, ServletResponse response) { if(!isHttpSessions()&&!isResource(request)) super.updateSessionLastAccessTime(request, response); } private boolean isResource(ServletRequest servletRequest) { if (isNull(patternSet)||patternSet.isEmpty()) { return false; } HttpServletRequest request = (HttpServletRequest) servletRequest; int contextPathLen=request.getContextPath().length(); String requestURI=request.getRequestURI(); final String requestPath =requestURI.substring(contextPathLen); return patternSet.stream().anyMatch(pattern -> matcher.match(pattern, requestPath)); } } public void setResourcesPatterns(String patterns) { this.resourcePatterns = patterns; } }

如何通过ShiroFilterFactoryBean扩展实现静态文件访问不更新Session,减少Session频繁刷新?

本文共计218个文字,预计阅读时间需要1分钟。

如何通过ShiroFilterFactoryBean扩展实现静态文件访问不更新Session,减少Session频繁刷新?

ShiroFilterFactoryBean 类扩展自 org.apache.shiro.spring.web.ShiroFilterFactoryBean,用于配置 Shiro 过滤器链。其核心方法 createInstance() 用于创建 Shiro 过滤器实例。

ShiroFilterFactoryBean

public class ShiroFilterFactoryBean extends org.apache.shiro.spring.web.ShiroFilterFactoryBean { private String resourcePatterns; @Override protected AbstractShiroFilter createInstance() throws Exception { AbstractShiroFilter instance = super.createInstance(); Set patternSet = null; if (StringUtils.hasText(resourcePatterns)) { patternSet = Stream.of(resourcePatterns.split(",")) .filter(StringUtils::hasLength) .map(String::trim) .collect(Collectors.toSet()); } return new SpringShiroFilter(instance.getSecurityManager(), instance.getFilterChainResolver(), patternSet); } private static final class SpringShiroFilter extends AbstractShiroFilter { private Set patternSet; private AntPathMatcher matcher; protected SpringShiroFilter(WebSecurityManager webSecurityManager, FilterChainResolver resolver, Set patternSet) { super(); if (isNull(webSecurityManager)) { throw new IllegalArgumentException("WebSecurityManager property cannot be null."); } setSecurityManager(webSecurityManager); if (nonNull(resolver)) { setFilterChainResolver(resolver); } if (nonNull(patternSet)) { this.patternSet = patternSet; matcher = new AntPathMatcher(); } } @Override protected void updateSessionLastAccessTime(ServletRequest request, ServletResponse response) { if(!isHttpSessions()&&!isResource(request)) super.updateSessionLastAccessTime(request, response); } private boolean isResource(ServletRequest servletRequest) { if (isNull(patternSet)||patternSet.isEmpty()) { return false; } HttpServletRequest request = (HttpServletRequest) servletRequest; int contextPathLen=request.getContextPath().length(); String requestURI=request.getRequestURI(); final String requestPath =requestURI.substring(contextPathLen); return patternSet.stream().anyMatch(pattern -> matcher.match(pattern, requestPath)); } } public void setResourcesPatterns(String patterns) { this.resourcePatterns = patterns; } }

如何通过ShiroFilterFactoryBean扩展实现静态文件访问不更新Session,减少Session频繁刷新?