应用场景:登录校验,统一编码处理,敏感字符处理
- 记得实现filter接口(注意别导错了包,是javax.servlet包里面的)
- 记得在启动类加上ServletComponentScan这个注解
- 总共要重写三个方法,dofilter是核心方法(这个方法每次拦截到请求都会调用,其他的两个类似构造和析构)
- 记得在这个类上面加webfilter注解,这个括号里面的参数代表拦截怎么样的请求(urlPatterns)
记得执行这个放行操作(写在重写的dofilter这个方法里面) 这个方法需要两个参数,一个请求对象,一个响应对象都是重写的dofilter这个方法传过来的(包括filterchain)
filterChain.doFilter(servletRequest,servletResponse);
小细节:执行放行操作前的逻辑会被执行到,执行放行操作后的逻辑也会被执行到
filter拦截路径
过滤器链(过滤器的顺序按照过滤器类名首字母区分,可以看看在包中的排序顺序)
登录校验filter的操作流程
filter登录校验实际操作代码
@Slf4j
@WebFilter(urlPatterns = "/*")//拦截什么样的请求
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//获取对象通过req获取,响应数据通过resp响应
//获取HttpServletRequest对象可以直接强转形参中的servletRequest
//因为Tomcat传入的request实际上就是HttpServletRequest 这里是多态的思想
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse)servletResponse;
//1.获取url
String url = req.getRequestURI().toString();
log.info("请求的url:{}",url);
//2.判断url中是否有login这个关键字,如果包含就放行
if(url.contains("/login")){
log.info("这是登录操作,放行......");
filterChain.doFilter(servletRequest,servletResponse);
return;//直接return,后面不用进行了
}
//3.获取请求头中的令牌(token) 注意看接口文档,不同的接口文档的请求头可能不同
String jwt = req.getHeader("token");//获取请求头
//4.判断令牌是否存在,如果不存在,返回错误结果(未登录)
//这个工具类是springframework中提供的工具类
if(!StringUtils.hasLength(jwt)){//善于使用工具类,这个方法用来判断字符串是否有长度(即字符串为空或者为null)
log.info("请求头token为空,返回未登录的信息");
//这里的返回信息也要根据接口文档中的要求来做特定修改
Result error = Result.error("NOT_LOGIN");
//因为之前在controller中有RestController可以自动将方法的返回值转为json然后响应回去
//但是现在我们需要手动转换 对象->json 使用阿里巴巴fastjson工具包(需要引入依赖)
String notLogin = JSONObject.toJSONString(error);
//通过resp响应回去,响应给浏览器
resp.getWriter().write(notLogin);
return;
}
//5.解析token,如果解析失败,返回错误结果(未登录)
try {//捕获异常,如果jwt令牌解析失败会有异常
JwtUtils.parseJWT(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析令牌失败,返回未登录信息");
Result error = Result.error("NOT_LOGIN");
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
//6.正确解析,放行
log.info("令牌合法,放行");
filterChain.doFilter(servletRequest,servletResponse);
}
}