springboot自定义filter

作者: 技术永无止境 | 来源:发表于2019-01-11 15:57 被阅读9次

1.定义自定义filter并实现 javax.servlet.Filter接口;

public class TokenFilter implements Filter {

String[] excludePathPatternsArray;

@Override

public void init(FilterConfig filterConfig) throws ServletException {

excludePathPatternsArray = filterConfig.getInitParameter("excludePathPatterns").split(",");

}

@SuppressWarnings("unchecked")

@Override

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) res;

boolean isIgnore=false;

/*System.out.println(request.getServletPath());

System.out.println(request.getRequestURI());*/

// 判断是否在过滤url之外

for (String excludePathPattern : excludePathPatternsArray) {

if (request.getServletPath().equals(excludePathPattern)|| request.getServletPath().startsWith(excludePathPattern)) {

isIgnore = true;

} else if (StringUtils.isBlank(request.getRequestURI())|| request.getRequestURI().startsWith(excludePathPattern)) {

isIgnore = true;

}

}

if(!isIgnore){

//否则拦截判断

String token = request.getHeader(Constants.ACCESS_TOKEN_NAME);

if (StringUtils.isNotBlank(token)) {

boolean isVerify = TokenUtil.verifyToken(token);//判断token有效性

if(isVerify) {

// 验证redis中此token是否存在,如果不存在说明用户登录已过期,需要重新登录。

RedisTemplate<Object, Object> redisTemplate = (RedisTemplate<Object, Object>) SpringContextUtil

.getBean("redisTemplate");

Payload payload = TokenUtil.getPayloadInfo(token);

String sessionId = payload.getSessionId();

if (!redisTemplate.hasKey(Constants.SHIRO_CACHE_NAMESPACS+sessionId)) {

JsonResult result = new JsonResult();

result.setStatus(ErrorCode.STATUS_TOKEN_NO_PASS.key);

result.setMessage("会话已过期,请重新登录");

response.setContentType("application/json");

response.setCharacterEncoding("UTF-8");

response.getWriter().write(JsonUtil.toJson(result));

}else {//如果会话存在,自动执行下一步

chain.doFilter(req, res);

}

}else {

JsonResult result = new JsonResult();

result.setStatus(ErrorCode.STATUS_TOKEN_NO_PASS.key);

result.setMessage(Constants.ACCESS_TOKEN_NAME + "被篡改,验证不通过");

response.setContentType("application/json");

response.setCharacterEncoding("UTF-8");

response.getWriter().write(JsonUtil.toJson(result));

}

} else {

JsonResult result = new JsonResult();

result.setStatus(ErrorCode.STATUS_TOKEN_NO_PASS.key);

result.setMessage(Constants.ACCESS_TOKEN_NAME + "不能为空");

response.setContentType("application/json");

response.setCharacterEncoding("UTF-8");

response.getWriter().write(JsonUtil.toJson(result));

}

}else {

//如果例外 则什么操作都不做

chain.doFilter(req, res);

}

}

@Override

public void destroy() {

// TODO Auto-generated method stub

}

2.将filter注入到spring中,并为filter注入初始化参数。

@Configuration

public class MyFilterConfig {

/**

*

* @MethodName: tokenFilterRegistration

* @Description: 配置最顶层拦截器实现token和登录状态的校验

* @return

* @date 2018年5月22日 下午7:16:24

*/

@Bean

public FilterRegistrationBean<TokenFilter> tokenFilterRegistration() {

FilterRegistrationBean<TokenFilter> registration = new FilterRegistrationBean<TokenFilter>();

  registration.setFilter(new TokenFilter());





  registration.addUrlPatterns("/*");

  //此处添加需要排除的链接

  List<String> excludePathPatternsList = new ArrayList<String>();

  //可以继续添加例外

  //登录入口例外

  excludePathPatternsList.add("/login");

  excludePathPatternsList.add("/v1/dict/dictHospital/list");

  //api文档例外

  excludePathPatternsList.add("/swagger-ui.html");

  excludePathPatternsList.add("/swagger-resources");

  excludePathPatternsList.add("/webjars");

  excludePathPatternsList.add("/v2/api-docs");

  //获取dicom jpg图像例外

  excludePathPatternsList.add("/v1/study/getJpeg");

  excludePathPatternsList.add("/v1/exam/getRptImg");







  StringBuffer excludePathPatternsBuffer = new StringBuffer();

  for(String str:excludePathPatternsList) {

  excludePathPatternsBuffer.append(str+",");

  }

  String excludePathPatterns = excludePathPatternsBuffer.toString().substring(0, excludePathPatternsBuffer.toString().length()-1);

  registration.addInitParameter("excludePathPatterns", excludePathPatterns);

  registration.setName("tokenFilter");

  registration.setOrder(1);

  return registration;

}

相关文章

网友评论

    本文标题:springboot自定义filter

    本文链接:https://www.haomeiwen.com/subject/ryvxdqtx.html