一、背景
我们需要在客户端访问服务器的时候给定用户一定的操作权限,比如没有登陆时就不能进行其他操作。如果他需要进行其他操作,而在这之前他没有登陆过,服务端则需要将该请求拦截下来,这就需要用到过滤器,过滤器可以完成一些登录校验、统一编码处理、敏感字符处理等操作。
二、分析
三、实现
3.1 准备工作:JWT令牌实现登陆校验-CSDN博客
3.2 准备依赖:在pom.xml中添加以下依赖:这个包可以快速将object对象转成json格式。
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
3.3 目录结构:新建filter包以及包下LoginFilter类
3.4 LoginFilter.java:注意必须添加@WebFilter(urlPatterns = "/*"),这是Java中过滤器的标记
package com.bytedance.filter;
import com.alibaba.fastjson.JSONObject;
import com.bytedance.pojo.Result;
import com.bytedance.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*") // 注意这里必须要添加
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, 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.获取请求头中的令牌
String jwt = req.getHeader("token");
// 4.判断令牌是否存在
if (!StringUtils.hasLength(jwt)){
log.info("请求头为空,返回未登录信息~");
Result error = Result.error("NOT_LOGIN");
// 手动转换 对象->json 引入阿里巴巴fastjson依赖
String noLogin = JSONObject.toJSONString(error);
resp.getWriter().write(noLogin);
return;
}
// 5.令牌存在,校验
try {
JwtUtils.parseJWT(jwt);
}catch (Exception e){ // jwt解析失败
e.printStackTrace();
log.info("解析令牌失败,返回未登录错误信息");
Result error = Result.error("NOT_LOGIN");
// 手动转换 对象->json 引入阿里巴巴fastjson依赖
String noLogin = JSONObject.toJSONString(error);
resp.getWriter().write(noLogin);
return;
}
// 6.放行
log.info("放行");
chain.doFilter(request,response);
}
}
3.5 启动类:除此之外,在启动类中必须添加注解:@ServletComponentScan