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;
}
网友评论