概述
· Filter 过滤器,是JavaWeb 三大组件(Servlet、Filter、Listener)之一
· 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
· 过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等
Filter的使用:
- 定义Filter:定义一个类,实现 Filter 接口,并重写其所有方法
- 配置Filter:在 Filter 类上加@WebFilter注解,配置拦截资源的路径。由于Filter属于Servlet三大组件之一,故需在引导类上加@ServletComponentScan开启Servlet组件支持
代码实现
FIlter类:
@WebFilter(urlPatterns = "/*")
public class DemoFilter implements Filter{
//初始化方法,Web服务器启动,创建Filter时调用,只调用一次
public void init(FilterConfig filterConfig) throws ServletException{
Filter.super.init(filterConfig);
}
//拦截到请求时,调用该方法,可调用多次
public void doFilter(ServletRequest request,ServletResponce responce,FilterChain chain){
chain.doFilter(request,responce);
}
//销毁方法,服务器关闭时调用,只调用一次
public void destory(){
Filter.super.destory();
}
}
引导类:
@ServletComponentScan
@SpringBootApplication
public class TliasWebManagementApplication{
public static void main(String[] args){
SpringApplication.run(TliasWebManagementApplication.class, args);
}
}
过滤器执行流程
过滤器拦截路径
FIlter可以根据需求,配置不同的拦截资源路径:
拦截路径 | urlPatterns值 | 含义 |
---|---|---|
拦截具体路径 | /login | 只有访问 /login 路径时,才会被拦截 |
目录拦截 | /emps/* | 访问/emps下的所有资源,都会被拦截 |
拦截所有 | /* | 访问所有资源,都会被拦截 |
过滤器链
介绍 : 一个web应用中,可以配置多个过滤器,这多个过滤器就形成了一个过滤器链
顺序 : 注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序
登录校验实现
登录校验 Filter 流程
public class LoginCheckFilter implements Filter{
@Override
public void doFilter(ServlectRequest request,ServletResponse response,FilterChain chain) throws IOException...{
HttpServlectRequest req = (HttpServlectRequest) request;
HttpServlectResponse resp = (HttpServlectResponse) response;
//1.获取请求url。
String url = req.getResquestURL().toString();
//2.判断请求url中是否包含login,如果包含,说明是登陆操作,则放行
if (url.contains("login")){
chain.doFilter(request,response);
return;
}
//3.获取请求头中的令牌(token)
String jwt = req.getHeader("token");
//4.判断令牌是否存在,如果不存在,则返回错误结果(未登录)
if(!StringUtils.hasLength(jwt)){
Result error = Result.error(""NOT_LOGIN);
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
//5.解析令牌token,如果解析失败,返回错误结果(未登录)
try{
JWTUtils.parseJWT(jwt);
} catch (Exception e){ //JWT解析失败
e.printStackTrace();
Result error = Result.error(""NOT_LOGIN);
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
//6.放行
chain.doFilter(request,response);
}
}