文章目录
-
- [Filter 快速入门](#Filter 快速入门)
- 登录演示
Filter 快速入门
- 定义Filter :定义一个类,是实现Filter 接口,并重写所有方法
- 配置Filter: Filter 类上加上 == @WebFilter == 注解,配置拦截资源的路径。引导类加上 == @ServletComponentScan == 开启Servlet 组件支持(也就是在spring boot 的启动类上面加上这个注释)
- 相关代码
java
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*")//表示所有路径
public class DemoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {//初始化方法,web服务器启动,创建Filter时,调用,只是调用一次
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, javax.servlet.ServletException {//拦截到请求时候,调用该方法,可调用多次
// 在此处记录请求信息
// 继续执行过滤器链
chain.doFilter(request, response);
}
@Override
public void destroy() {//关闭服务器时候调用,只是调用一次/摧毁方法
Filter.super.init(filterConfig);
}
}
登录演示
java
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*")//表示所有路径
public class DemoFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, javax.servlet.ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) Response;
// 1. 获取请求URL
String url = req.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)){//看看hutool工具包,如果找不到该方法
log.info("请求头token为空,未返回登录的信息")
Result error = Result.error("NOT_LOGIN");
//手动转换 对象 --> json ---------> 使用阿里巴巴fast.json()
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);//返回字符串
return;
}
//5.解析token。如果解析失败,返回错误结果(未登录)
try{
JwtUtils.parseJWT(jwt);//报错就说明解析失败,jwt有改动,或者时间过期了,未报错,说明解析成功
}catch(Exception e){
e.printStackTrace();
log.info("解析令牌失败,返回错误信息");
log.info("请求头token为空,未返回登录的信息")
Result error = Result.error("NOT_LOGIN");
//手动转换 对象 --> json ---------> 使用阿里巴巴fast.json()
String notLogin = JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);//返回字符串
return;
}
//6.放行
chain.doFilter(request, response);
}
}