JWT 复习 +过滤器 +拦截器
1JWT 拦截器 实现登录
1.jwt代码
结构
签名算法 原文(base64编码) 用密钥和签名算法对原文计算得到的签名
载荷里面记录的是含有三大声明,注册声明:iss(发行者)、exp(到期时间)、sub(主题)、sub(受众)。公开声明、私有声明,这三个声明都是非必要的,如果不声明,载荷里面也会自动生成数据代替载荷。
public class JWT {
private static String signKey = "xiaoyu";
private static long expire = 3600000; // 设置一个小时的过期时间,单位为毫秒
public static String returnJwt(Map<String, Object> claims) {
String jwt = Jwts.builder()
.setClaims(claims)//原文
.signWith(SignatureAlgorithm.HS256, signKey)//签名算法 +密钥
.setExpiration(new Date(System.currentTimeMillis() + expire))//设置国企时间
.compact();//设置为字符串
return jwt;
}
public static Claims parseJWT(String jwt) {
Claims claims = Jwts.parser()
.setSigningKey(signKey)//设置签名密钥
.parseClaimsJws(jwt)//验证签名是否有效
.getBody();//getBody方法将返回JWT中的声明部分,也就是payload,作为Claims对象的实例。
return claims;
}
}
2.拦截器和过滤器
//拦截器
@Component
public class interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String url=request.getRequestURI();
///2.判断请求url中是否包含login,如果包含,说明是登录操作,放行
if(url.contains("/login"))
{
//放行
return true;
}
//3.获取令牌
String token=request.getHeader("token");
//4.判断令牌是否存在
if(StringUtils.isEmpty(token))
{
Result error=Result.error("NOT_LOGIN");
String not= JSONObject.toJSONString(error);
response.getWriter().write(not);
return false;
}
//解析TOKEN
try{
JWT.parseJWT(token);
}catch (Exception e)
{
Result error=Result.error("NOT_LOGIN");
String not= JSONObject.toJSONString(error);
response.getWriter().write(not);
return false;
}
return true;
}
}
过滤器
@Slf4j
@WebFilter(filterName = "loginCheckFilter",urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
//路径匹配器,支持通配符
public static final AntPathMatcher PATH_MATCHER = new AntPathMatcher();
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request=(HttpServletRequest) servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
//1.获取请求url
String url=request.getRequestURI();
//2.定义不需要拦截的路径
//1.所有静态资源 包括登录验证 包括退出
String[] urls=new String[]{
"/employee/login",
"/employee/logout",
"/backend/**",
"/front/**",
"/user/login",
"/user/sendMsg",
"/doc.html",
"/webjars/**",
"/swagger-resources",
"/v2/api-docs"
};
///3.请求url中是否需要被处理 --我们需要一个可以判断url是否有其中关键词的
boolean check=check(urls,url);
if(check)
{
//放行
filterChain.doFilter(request,response);
return;
}
//4.有敏感操作的路径 --判断seeion
if(request.getSession().getAttribute("employee")!=null)
{
Long empId = (Long) request.getSession().getAttribute("employee");
BaseContext.setCurrentId(empId);
filterChain.doFilter(request,response);
return;
}
//4.有敏感操作的路径 --判断seeion
if(request.getSession().getAttribute("user")!=null)
{
Long userId = (Long) request.getSession().getAttribute("user");
BaseContext.setCurrentId(userId);
filterChain.doFilter(request,response);
return;
}
//前端接受响应对数据进行判断
response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
return;
}
//进行路径匹配的函数
public boolean check(String[] urls, String url)
{
for(String urll:urls)
{
boolean match=PATH_MATCHER.match(urll,url);
if(match)
{
return true;
}
}
return false;
}
}
- 在Java Web开发中,过滤器是Servlet规范中的一部分,它可以对HTTP请求进行拦截和处理。过滤器可以在请求进入Servlet之前对请求进行预处理,也可以在响应返回给客户端之前对响应进行后处理。过滤器是基于回调函数的方式实现的,可以通过配置在web.xml文件中来添加和配置过滤器。
- 拦截器通常是在框架层面上的概念,在Spring等框架中比较常见。拦截器也可以对请求进行预处理和后处理,但它更多地与框架的执行链(如Spring MVC的执行链)相关联。拦截器可以对方法的调用进行拦截和处理,例如在方法执行前进行一些操作,在方法执行后进行一些操作等。
- 另外,从使用方式上来说,过滤器是基于函数回调的形式实现的,而拦截器通常是基于面向切面编程(AOP)的方式实现的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步