Token简单使用

Token简单使用

1.maven导入依赖

 <dependency>
     <groupId>io.jsonwebtoken</groupId>
     <artifactId>jjwt</artifactId>
      <version>0.9.0</version>
 </dependency>

2.封装加密解密工具

import com.codingfuture.entity.User;
import io.jsonwebtoken.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
 * @author Petrel
 */
public class CreateJwt {
    // Jwts.builder()生成
    // Jwts.parser()验证
    public static  String getoken(User user) {
        JwtBuilder jwtBuilder = Jwts.builder()
                .setId(user.getId()+"")
                .setIssuer(user.getRole()+"")
                .setSubject(user.getUsername()) // 用户名
                .setIssuedAt(new Date()) // 登录时间
                .signWith(SignatureAlgorithm.HS256,"coding-future")
                .setExpiration(new Date(new Date().getTime()+3600000)); // 60分钟
        // 设置过期时间 前三个为载荷payload最后一个为头部header
//        System.out.println(jwtBuilder.compact());
        return  jwtBuilder.compact();
    }

    public static Claims tokenToOut(String token) {
        Claims claims;
        try {
             claims = Jwts.parser().setSigningKey("coding-future")
                    .parseClaimsJws(token)
                    .getBody();
            System.out.println("用户id:"+claims.getId());
            System.out.println("用户名:"+claims.getSubject());
            System.out.println("用户时间"+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .format(claims.getIssuedAt()));
            System.out.println("过期时间"+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .format(claims.getExpiration()));
            System.out.println("用户角色" + claims.getIssuer());
        }
        catch (ExpiredJwtException e) {
            claims = e.getClaims();
        }

    return  claims;
    }
}

3.拦截器配置

package com.codingfuture.web.interceptor;
import com.alibaba.fastjson.JSONArray;
import com.codingfuture.common.web.CreateJwt;
import com.codingfuture.common.web.Result;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.*;

/**
 * @author Petrel
 */
public class LoginInterceptor  implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String authorization = request.getHeader("Authorization");

        if (authorization != null && !authorization.isEmpty() ) {
            Claims claims = CreateJwt.tokenToOut(authorization);
            Date expiration = claims.getExpiration();
            long effective = expiration.getTime();
            if  (effective -  new Date().getTime()> 0) {
                return  true; // 放行
            } else {
                requestFail(request,response,401,"timeOut");
                return false;
            }
        } else {
            requestFail(request,response,403,"no-Access");
            return  false;
        }

    }

     public void requestFail (HttpServletRequest request, HttpServletResponse response,Integer code,String message) {
         System.out.println("拦截器工作了");
         Map<String, Object> map = new HashMap<>();
         response.setHeader("content-type", "application/json");
         map.put("code", code);
         map.put("message", message);
         String str = JSONArray.toJSONString(map);
         PrintWriter writer = null;
         try {
             writer = response.getWriter();
         } catch (IOException e) {
             e.printStackTrace();
         }
         writer.write(str);
     }
}

4.前端在响应拦截器统一处理403请求

import axios from 'axios'
import { Notification } from 'element-ui'
import 'nprogress/nprogress.css'
import NProgress from 'nprogress'

// NProgress.configure({ showSpinner: false })

const ConfigBaseURL = process.env.VUE_APP_BASE_API // 默认路径,这里也可以使用env来判断环境

// 使用create方法创建axios实例
const Service = axios.create({
  timeout: 5000, // 请求超时时间
  baseURL: ConfigBaseURL,
  method: 'post',
  headers: {
    'Content-Type': 'application/json;charset=UTF-8'
  }
})
// 添加请求拦截器
Service.interceptors.request.use((config) => {
  NProgress.start()
  config.headers.Authorization = JSON.parse(window.localStorage.getItem('token'))
  // 注入token等,token失效的主动介入
  return config
})
// 添加响应拦截器
Service.interceptors.response.use(
  (response) => {
    /**
     * code为非200是抛错 可结合自己业务进行修改
     */
    const res = response.data
    NProgress.done()
     if (response.config.method !== 'get') {
      Notification({
        title: '操作成功',
        message: res.message,
        type: 'success',
        offset: 55,
        duration: 1500
      })
    }
    // Token失效被动介入
    // 全局拦截
    if (response.data.code === 403) {
      Notification({
        message: res.message,
        type: 'error',
        offset: 55,
        duration: 1500
      })
    }
    return response.data
  },
  (error) => {
    console.log('TCL: error', error)
    const msg = error.Message !== undefined ? error.Message : ''
    Notification({
      message: '网络错误' + msg,
      type: 'error',
      offset: 55,
      duration: 1500
    })

    return Promise.reject(error)
  }
)
export default Service

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值