ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

前后端拦截器的使用

2021-08-04 11:02:02  阅读:163  来源: 互联网

标签:拦截器 return 前后 springframework token error 使用 import response


jwt拦截器

添加jjwt的依赖

<!--token依赖  jjwt-->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.7.0</version>
</dependency>

token的配置

jwt:
  config:
    key: dfbz #token密钥
    exp: 6000 #过期时间
    prefix: dfbz_ #密钥前缀

创建token

package com.example.demo.utils;


import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.core.env.Environment;

import java.util.Date;

//yml配置文件
@ConfigurationProperties("jwt.config")
@Data
public class CreateJWTUtil {

    @Autowired
    private Environment env;


    private String key;
private long exp;
private String prefix;
    /**
     * 签发jwt
     * @param id
     * @param username
     * @param role
     * @return
     */
    public String createJwt(Integer id,String username,String role){
        long nowMillis = System.currentTimeMillis();
        String exp = env.getProperty("jwt.config.exp");
        int a = Integer.valueOf(exp);
        Date now =new Date(nowMillis);
        JwtBuilder builder= Jwts.builder()
                .setId(String.valueOf(id))
                //设置密钥
                .signWith(SignatureAlgorithm.HS256,key)
                //用户名
                .setSubject(username)
                //角色权限
                .claim("role",role)
                //token创建时间
                .setIssuedAt(now)
                //设置token过期时间
                .setExpiration(new Date(nowMillis+a));

        return builder.compact();
    }

    /**
     * 解析token
     * @param token
     * @return
     */
    public Claims parseJwt(String token){
        Claims claims = Jwts.parser()
                //当初签发时的秘钥
                .setSigningKey(key)
                //token字符串
                .parseClaimsJws(token)
                .getBody();
        return claims;
    }
}

拦截器的设置

package com.example.demo.Interceptor;

import com.alibaba.fastjson.JSON;
import com.example.demo.utils.CreateJWTUtil;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.HashMap;

@Component
public class JwtInterceptor extends HandlerInterceptorAdapter {
    @Autowired
    private CreateJWTUtil jwtUtil;
    @Autowired
    private Environment env;

    /**
     * 拦截器验证token
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String auth = request.getHeader("auth");
        //配置文件的数据
        String prefix = env.getProperty("jwt.config.prefix");
        //auth.startsWith(prefix)以什么开头
        if (!StringUtils.isEmpty(auth)&& auth.startsWith(prefix)){
            //截取token
            String token = auth.substring(prefix.length());
            //解析token
            Claims claims = jwtUtil.parseJwt(token);


            if (null != claims && !StringUtils.isEmpty(claims.get("sub"))){
                return true;
            }
        }
        response.setCharacterEncoding("utf8");
        response.setContentType("application/json;charset=UTF-8");
        HashMap<String, Object> ma = new HashMap<>();
        ma.put("code",response.SC_UNAUTHORIZED);
        ma.put("msg","请重新登录");
        PrintWriter writer = response.getWriter();
        writer.println(JSON.toJSONString(ma));//转换成JSON格式返回
        return false;
    }
}

选择需要验证token的接口

package com.example.demo.config;

import com.example.demo.Interceptor.JwtInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class TokenConfig implements WebMvcConfigurer {

    @Bean
    public JwtInterceptor myHandlerInterceptor() {
        return new JwtInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(myHandlerInterceptor())
        		//选择全部接口
                .addPathPatterns("/**")
                //登录接口除外
                .excludePathPatterns("/cutFood/login");
    }
}

登录生成token

Login getObjLogin = loginService.login(userName,password);
if(getObjLogin!=null){
    String token = jwtUtil.createJwt(1, userName, "admin");
    return JsonRes.ok().data("token",token).data("getObjLogin",getObjLogin);
}else {
    return JsonRes.error();
}

vue验证token

		let _this = this
        _this.$http.get(_this.$apiUrl+'cutFood/login', { params: { userName: _this.loginData.userName, password: _this.loginData.password } }).then(function (response) {
          if (response.data.msg === '成功') {
            sessionStorage.setItem("token",response.data.data.token)//前端存储token
            _this.$message({
              type: 'success',
              message: '登录成功'
            })
            _this.$router.replace('/menu')
          } else {
            _this.$message({
              type: 'error',
              message: '账号密码错误'
            })
          }
        }).catch(function (error) { console.log(error) });

在main.js里面添加请求拦截器

axios.interceptors.request.use(
  config => {
    if (sessionStorage.getItem("token") != null || sessionStorage.getItem("token") != '') { // 判断是否存在token,如果存在的话,则每个http header都加上token
      var token = "dfbz_" + sessionStorage.getItem("token");//获取前端存储的token,拼接后端秘钥前缀
      config.headers.auth = token  //请求头与后端验证token的auth一致
      return config;
    } else {
      this.$router.replace("/")
    }
  },
  err => {
    return Promise.reject(err);
  }

)

响应拦截

axios.interceptors.response.use((success) => {
  if (success.status && success.status === 200) {
     if (success.data.code === 500 || success.data.code === 401 || success.data.code === 403) {   //接口请求成功,业务逻辑错误
        return;
     }
     if (success.data.msg==="请重新登录") {
        router.replace("/")
        return response;
     }
  }
  return success.data;
}, (error) => {
  if (error.response.code == 504 || error.response.code == 404) {
     Message.error({ message: '服务器被吃了( ╯□╰ )' });
  } else if (error.response.code == 403) {
     Message.error({ message: '权限不足,请联系管理员' });
  } else if (error.response.code == 401) {
     Message.error({ message: '请登录账号' });
     router.replace('/');
  } else {
     if (error.response.message) {
        Message({ message: error.response.message });
     } else {
        Message({ message: '该错误触及盲区(●ˇ∀ˇ●)' });
     }
  }
})

标签:拦截器,return,前后,springframework,token,error,使用,import,response
来源: https://blog.csdn.net/weixin_45598128/article/details/119379184

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有