当前位置:   article > 正文

基于springboot+vue项目配置JWT_vue如何携带jwt令牌

vue如何携带jwt令牌

首先引入pom依赖 

  1. <dependency>
  2. <groupId>com.auth0</groupId>
  3. <artifactId>java-jwt</artifactId>
  4. <version>3.10.3</version>
  5. </dependency>

添加拦截器配置类 

  1. @Configuration
  2. public class InterceptorConfig implements WebMvcConfigurer {
  3. @Override
  4. public void addInterceptors(InterceptorRegistry registry) {
  5. registry.addInterceptor(jwtInterceptor())
  6. .addPathPatterns("/**") //拦截所有请求 通过判断token是否合法是否需要登录
  7. .excludePathPatterns("/user/login","/user/register","/**/import","/**/export"); //需要排除的 URL 路径模式的参数,使用它可以指定哪些 URL 不应该被拦截器拦截。
  8. }
  9. @Bean
  10. public JwtInterceptor jwtInterceptor () {
  11. return new JwtInterceptor();
  12. }
  13. }

 

 创建JwtUtil 工具类,生成Token  这里类的注解可以不用@Service 换成@Component 大致功能是相同的 都是将类注入IOC容器中进行管理

  1. @Service
  2. public class JwtUtil {
  3. private static UserService staticuserService;
  4. @Resource
  5. private UserService userService;
  6. //将动态的 userService 引入 静态方法 方便静态查询当前userToken方法
  7. @PostConstruct
  8. public void setUserService(){
  9. staticuserService = userService;
  10. }
  11. /**
  12. * 生成token
  13. */
  14. public static String createToken(User user) {
  15. Calendar calendar = Calendar.getInstance();
  16. calendar.add(Calendar.DATE, 7); //默认令牌过期时间7天
  17. JWTCreator.Builder builder = JWT.create();
  18. return builder.withClaim("userid",String.valueOf(user.getUserid()))
  19. //给builder 添加令牌
  20. .withExpiresAt(calendar.getTime())
  21. // 以password作为密钥 通过HMAC256算法进行加密
  22. .sign(Algorithm.HMAC256(user.getPassword()));
  23. }
  24. public static User getCurrentUser(){
  25. try {
  26. // RequestContextHolder顾名思义,持有上下文的Request容器
  27. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  28. String token = request.getHeader("token");
  29. if (StrUtil.isNotBlank(token)){
  30. String userid = JWT.decode(token).getClaim("userid").asString();
  31. return staticuserService.getById(Integer.parseInt(userid));
  32. }
  33. }catch (Exception e) {
  34. // 获取数据异常
  35. throw new ServiceException(DATA_ERROR);
  36. }
  37. return null;
  38. }
  39. }

axios请求接口的js文件设置请求头中的token (不必写在实例里面)

  1. // request 拦截器
  2. // 可以自请求发送前对请求做一些处理
  3. // 比如统一加token,对请求参数统一加密
  4. request.interceptors.request.use(config => {
  5. config.headers['Content-Type'] = 'application/json;charset=utf-8';
  6. let user = localStorage.getItem("user") ? JSON.parse(localStorage.getItem("user")):{}
  7. if (user){
  8. config.headers['token'] = user.token; // 设置请求头
  9. }
  10. return config
  11. }, error => {
  12. return Promise.reject(error)
  13. });

 然后检验发送的请求中 Header是否具有token

 通过拦截器的preHandle方法拦截登录的请求头 获取token。此处的ServiceException见我主页的我的自定义异常类

  1. public class JwtInterceptor implements HandlerInterceptor {
  2. @Autowired
  3. private UserService userService;
  4. @Override
  5. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  6. String token = request.getHeader("Token");
  7. if (!(handler instanceof HandlerMethod)){
  8. return true;
  9. }
  10. // 获取失败 token不存在
  11. if (StrUtil.isBlank(token)){
  12. throw new ServiceException(TOKEN_NOT_EXIST);
  13. }
  14. /**
  15. * 本处有逻辑错误:通过token寻找userid 若token修改则无法找到User(实际User存在) 控制台报错 220 用户不存在
  16. */
  17. String userid;
  18. try {
  19. // 在TokenUtils中 用withClaim将token存放至本地存储
  20. userid = JWT.decode(token).getClaim("userid").asString();
  21. }catch (JWTDecodeException j){
  22. throw new ServiceException(TOKEN_ERROR);
  23. }
  24. // 根据token查询数据库进行对比
  25. User user = userService.getById(Integer.parseInt(userid));
  26. if (user == null) {
  27. throw new ServiceException(ACCOUNT_NOT_EXIST);
  28. }
  29. // 验证用户密码加签验证token
  30. JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256(user.getPassword())).build();
  31. try{
  32. jwtVerifier.verify(token);
  33. }catch (JWTVerificationException e){
  34. throw new ServiceException(ACCOUNT_NOT_EXIST);
  35. }
  36. return true;
  37. }
  38. }

在login登录实现类下 将token存储在userDto里,通过UserDto类与页面进行数据传输回显

  1. @Override
  2. public UserDto login(UserDto userDto) {
  3. // 通过dto获取的数据查询对应的User
  4. User one = getUserInfo(userDto);
  5. if (one != null){
  6. // 然后将User的数据传到userDto
  7. BeanUtils.copyProperties(one,userDto);
  8. String token = JwtUtil.createToken(one);
  9. userDto.setToken(token);
  10. return userDto;
  11. }else {
  12. throw new ServiceException(LOGIN_MOBLE_ERROR);
  13. }
  14. }

此时在控制台则能发现token生成成功。 

 最后在自己的请求登录的接口下面

 将自己的user信息存放在本地存储空间

 通过前端的接口拦截器,判断截取的状态码进行提示错误信息

  1. // response 拦截器
  2. // 可以在接口响应后统一处理结果
  3. request.interceptors.response.use(
  4. response => {
  5. let res = response.data;
  6. // 如果是返回的文件
  7. if (response.config.responseType === 'blob') {
  8. return res
  9. }
  10. // 兼容服务端返回的字符串数据
  11. if (typeof res === 'string') {
  12. res = res ? JSON.parse(res) : res
  13. }
  14. // 当验证不通过
  15. if (res.code == '220') {
  16. ElementUI.Message({
  17. message : res.message,
  18. type : 'error'
  19. })
  20. }
  21. return res;
  22. },

 就实现JWT啦!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/885773
推荐阅读
相关标签
  

闽ICP备14008679号