目录
1.概述
Filter过滤器:在Web开发中,过滤器(Filter)是一种非常重要的组件,用于在请求到达目标资源(如Servlet或静态资源)之前或之后,对请求或响应进行预处理或后处理。
它是JavaWeb三大组件(Servlet、Filter. Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
Interceptor拦截器:Web开发中扮演着重要的角色,主要用于在请求到达Controller之前或之后执行一些操作。
它是一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供的用来动态拦截控制器方法的执行。其作用是拦截请求,在指定的方法调用前后,根据业务需要执行预先设定的代码。
2.过滤器Fliter
它的使用非常简单:1.定义Filter:定义一个类,实现Filter接口,并重写其三个方法。2.配置Filter: Filter类 上加@WebFilter注解,配置拦截资源的路径。引导类上加@ServletComponentScan开启Servlet组件支持。
执行流程:放行后访问对应资源,资源访问完成后,还会回到Filter中,接着执行放行后的逻辑
Filter可以根据需求,配置不同的拦截资源路径:
过滤器链:一个web应用中,可以配置多个过滤器,这多个过滤器就形成了-一个过滤器链。执行顺序:注解配置的Filter,优先级是按照过滤器类名(字符串)的自然排序。例如A开头的过滤器就比B开头的过滤器先执行。
登录校验过滤器:
思路:所有的请求拦截后,除了登录请求之外都需要校验令牌。有令牌, 且令牌校验通过(合法) 才可以放行执行业务操作,否则都返回未登录错误结果
//1.获取请求url
String url=reg.getRequestURL().toString();
log.info("请求的url:{}",url);
//2.判断请求url中是否包含login,包含就是登录操作,放行
if (url.contains("login")){
log.info("登录操作,放行");
chain.doFilter(request,response);
return;
}
//3.获取请求头中的令牌(token)
String jwt = req.getHeader("token");
//4.判断令牌是否存在、如果不存在、返回错误结果(未登录)
if(!StringUtils.hasLength(jwt)){
1og.info("请求头token为空,返回未登录的信息");
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();
log.info("解析令牌失败,返回错误信息");
Result error=Result.error("NOT LOGIN");
String notLogin =JSONObject.toJSONString(error)
resp.getWriter().write(notLogin);
return;
}
//6.放行
log.info("令牌合法,放行");
chain.doFilter(request,response);
3.拦截器Interceptor
使用:1.定义拦截器,实现HandlerInterceptor接口,并重写其所有方法。注释@Component把这个拦截器交给IOC容器管理。
2.注册拦截器,注入刚刚定义的拦截器,通配符**拦截所有请求
拦截器可以根据需求,配置不同的拦截路径:也可以指定不拦截的路径
过滤器和拦截器的总体执行流程:
过滤器和拦截器的区别
- 接口规范不同:过滤器需要实现Filter接口,而拦截器需要实现HandlerInterceptor接口。
- 拦截范围不同:过滤器Filter会拦截所有的资源,而Interceptor只拦截Spring环境中的资源。
登录校验拦截器的流程和过滤器完全一致, 按照接口规范CV一下稍作改造就可以了。
//删去过滤器当中的doFilter方法
//放行改为return true,不放行改为return false即可,其他步骤同理
if (url.contains("login")){
log.info("登录操作,放行");
return true;
}