目录
一、概述
二、基本操作
三、登陆检查接口
一、概述
什么是Filter?
-
Filter表示过滤器,是 JavaWeb三大组件(Servlet、Filter、Listener)之一。
-
过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能
-
使用了过滤器之后,要想访问web服务器上的资源,必须先经过滤器,过滤器处理完毕之后,才可以访问对应的资源。
-
-
过滤器一般完成一些通用的操作,比如:登录校验、统一编码处理、敏感字符处理等。
二、基本操作
下面我们通过Filter快速入门程序掌握过滤器的基本使用操作:
-
第1步,定义过滤器 :1.定义一个类,实现 Filter 接口,并重写其所有方法。
-
第2步,配置过滤器:Filter类上加 @WebFilter 注解,配置拦截资源的路径。引导类上加 @ServletComponentScan 开启Servlet组件支持。
-
第三部 当我们在Filter类上面加了@WebFilter注解之后,接下来我们还需要在启动类上面加上一个注解@ServletComponentScan,通过这个@ServletComponentScan注解来开启SpringBoot项目对于Servlet组件的支持。
三、登陆检查接口
具体流程
我们要完成登录校验,主要是利用Filter过滤器实现,而Filter过滤器的流程步骤:
基于上面的业务流程,我们分析出具体的操作步骤:
-
获取请求url
-
判断请求url中是否包含login,如果包含,说明是登录操作,放行
-
获取请求头中的令牌(token)
-
判断令牌是否存在,如果不存在,返回错误结果(未登录)
-
解析token,如果解析失败,返回错误结果(未登录)
-
放行
代码实现
@Slf4j
@WebFilter(urlPatterns = "/*") //拦截所有请求
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.printf("程序开始");
//强制转换为http协议的请求对象、响应对象 (转换原因:要使用子类中特有方法)
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
// 1、获取请求的url
String url = request.getRequestURI().toString();
log.info("请求路径 {}",url);
// 2、判断url是否包含login,有的话就放行
if(url.contains("login")){
// 放行请求
filterChain.doFilter(request,response);
return;
}
// 3、获取请求头的token
String token = request.getHeader("token");
log.info("请求头的 {}",token);
// 4、判断令牌是否存在,不存在,相应错误信息
if(!StringUtils.hasLength(token)){
log.info("令牌不存在");
// 相应错误信息
Result error = Result.error("NOT_logion");
String notLogin = JSONObject.toJSONString(error);
response.getWriter().write(notLogin);
return;
}
// 5、解析token,如果解析失败,则返回错误的结果
try{
JwtUtils.parseJWT(token);
}catch (Exception e){
e.printStackTrace();
// 相应错误信息
Result error = Result.error("NOT_logion");
String notLogin = JSONObject.toJSONString(error);
response.getWriter().write(notLogin);
return;
}
// 6、 放行
log.info("令牌和法,放行");
filterChain.doFilter(request,response);
}
}