欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

2024/10/24 18:22:09 来源:https://blog.csdn.net/2302_78946634/article/details/141721832  浏览:    关键词:JavaWeb笔记整理10——JWT令牌、Filter、Interceptor

目录


1.简介

2.生成和校验 

3.登录-生成令牌

4.过滤器Filter

快速入门

Filter执行流程

Filter拦截路径

过滤器链

登录校验Filter

流程

代码

 5.拦截器Interceptor

快速入门 

Interceptor拦截路径

执行流程 

 代码


继笔记04-session cookie

1.简介

 

2.生成和校验 

 

    /** 测试JWT令牌生成* */@Testpublic void testGenJwt(){Map<String,Object> claims = new HashMap<>();claims.put("id",1);claims.put("name","tom");String jwt = Jwts.builder().signWith(SignatureAlgorithm.HS256,"mikey")//设置签名算法.setClaims(claims)//自定义内容(载荷).setExpiration(new Date(System.currentTimeMillis()+3600*1000))//设置jwt令牌的有效期为1个小时.compact();//拿到字符串类型的返回值System.out.println(jwt);}/** 解析Jwt令牌* */@Testpublic void testParseJwt(){Claims claims = Jwts.parser().setSigningKey("mikey").parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTcyMzA0MjYxNH0.OXLa75G0jGPDwNz95sUurab16UWY-5ZEMjWbOncfqJM").getBody();System.out.println(claims);}

3.登录-生成令牌

工具类: 

package com.mikey.utils;import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;public class JwtUtils {private static String signKey = "mikey";private static Long expire = 43200000L;/*** 生成JWT令牌* @param claims JWT第二部分负载 payload 中存储的内容* @return*/public static String generateJwt(Map<String, Object> claims){String jwt = Jwts.builder().addClaims(claims).signWith(SignatureAlgorithm.HS256, signKey).setExpiration(new Date(System.currentTimeMillis() + expire)).compact();return jwt;}/*** 解析JWT令牌* @param jwt JWT令牌* @return JWT第二部分负载 payload 中存储的内容*/public static Claims parseJWT(String jwt){Claims claims = Jwts.parser().setSigningKey(signKey).parseClaimsJws(jwt).getBody();return claims;}
}

Controller类:

package com.mikey.controller;import com.mikey.pojo.Emp;
import com.mikey.pojo.Result;
import com.mikey.service.EmpService;
import com.mikey.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@Slf4j
@RestController
public class LoginController {@Autowiredprivate EmpService empService;@PostMapping("/login")public Result login(@RequestBody Emp emp){log.info("员工登录:{}",emp);Emp e = empService.login(emp);//登陆成功 生成令牌并且下发令牌if(e!=null){Map<String, Object> claims = new HashMap<>();claims.put("id",e.getId());claims.put("name",e.getName());claims.put("username",e.getUsername());String jwt = JwtUtils.generateJwt(claims);//jwt包含了当前登录的员工信息return Result.success(jwt);}//登陆失败 返回错误信息return Result.error("用户名或密码错误");//return e!=null?Result.success():Result.error("用户名或密码错误");}
}

4.过滤器Filter

快速入门

Filter执行流程

 

Filter拦截路径

过滤器链

登录校验Filter

流程

代码
package com.mikey.filter;import com.alibaba.fastjson.JSONObject;
import com.mikey.pojo.Result;
import com.mikey.utils.JwtUtils;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;import java.io.IOException;@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) servletRequest;HttpServletResponse resp = (HttpServletResponse) servletResponse;//1.获取请求urlString url = req.getRequestURI().toString();log.info("请求的url:{}",url);//2.判断请求url中是否包含login,如果包含说明是登录操作,放行。if(url.contains("login")){log.info("登陆操作,放行");filterChain.doFilter(servletRequest,servletResponse);return;}//3.获取请求头中的令牌String jwt = req.getHeader("token");//4.判断令牌是否存在,如果不存在,则返回错误结果 未登录。if(!StringUtils.hasLength(jwt)){log.info("请求头taken为null,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包 需要在pom文件中导入String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return;}//5.若jwt令牌存在  解析token,如果解析失败 返回错误结果 未登录//快捷键alt crl ttry {JwtUtils.parseJWT(jwt);} catch (Exception e) {//jwt解析失败e.printStackTrace();log.info("解析令牌失败 返回未登陆的错误信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return;}//6.放行log.info("令牌合法 放行");filterChain.doFilter(servletRequest,servletResponse);}
}

 5.拦截器Interceptor

快速入门 

Interceptor拦截路径

执行流程 

 代码

package com.mikey.interceptor;import com.alibaba.fastjson.JSONObject;
import com.mikey.pojo.Result;
import com.mikey.utils.JwtUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {@Override//目标资源方法运行前运行,返回true:放行 返回false 不放行public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {//1.获取请求urlString url = req.getRequestURI().toString();log.info("请求的url:{}",url);//2.判断请求url中是否包含login,如果包含说明是登录操作,放行。if(url.contains("login")){log.info("登陆操作,放行");return true;//true代表放行 false代表不放行}//3.获取请求头中的令牌String jwt = req.getHeader("token");//4.判断令牌是否存在,如果不存在,则返回错误结果 未登录。if(!StringUtils.hasLength(jwt)){log.info("请求头taken为null,返回未登录的信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return false;}//5.若jwt令牌存在  解析token,如果解析失败 返回错误结果 未登录//快捷键alt crl ttry {JwtUtils.parseJWT(jwt);} catch (Exception e) {//jwt解析失败e.printStackTrace();log.info("解析令牌失败 返回未登陆的错误信息");Result error = Result.error("NOT_LOGIN");//手动转换 将对象转为json数据---》阿里巴巴fastJSON工具包String notLoginn = JSONObject.toJSONString(error);resp.getWriter().write(notLoginn);return false;}//6.放行log.info("令牌合法 放行");return true;}@Override//目标资源方法运行后运行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("postHandle...");}@Override//试图渲染完毕后运行,最后运行public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("afterCompletion...");}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com