发布于2021-03-13 13:54 阅读(1065) 评论(0) 点赞(5) 收藏(0)
配置2个接口,一个获取Token(不拦截)。一个验证Token(拦截)
引入pom.xml依赖
<!--JWT(Json Web Token)登录支持 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
在application.yml中增加jwt配置
#jwt config
jwt:
tokenHeader: Authorization #JWT存储的请求头
secret: mall-jwt-test #jwt加解密使用的密钥
expiration: 604800 #JWT的超时时间
tokenHead: Bearer #JWT负载中拿到的开头
增加JWT配置文件
package com.example.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
/**
* JWT配置类,读取Application.yml中的配置
*
* @author AdminMall
*
*/
@Component
public class JwtProperties {
@Value("${jwt.tokenHeader}")
private String tokenHeader; // JWT存储的请求头
@Value("${jwt.secret}")
private String secret; // jwt加解密使用的密钥
@Value("${jwt.expiration}")
private long expiration; // JWT的超时时间
@Value("${jwt.tokenHead}")
private String tokenHead; // JWT负载中拿到的开头
public String getTokenHeader() {
return tokenHeader;
}
public void setTokenHeader(String tokenHeader) {
this.tokenHeader = tokenHeader;
}
public String getSecret() {
return secret;
}
public void setSecret(String secret) {
this.secret = secret;
}
public long getExpiration() {
return expiration;
}
public void setExpiration(long expiration) {
this.expiration = expiration;
}
public String getTokenHead() {
return tokenHead;
}
public void setTokenHead(String tokenHead) {
this.tokenHead = tokenHead;
}
}
增加JWT工具类,增加加密和解密方法
package com.example.demo.tool;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import com.example.demo.config.JwtProperties;
import com.example.demo.entity.User;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
/**
*
* JWT工具类
*
* @author MAll
*
*
*/
public class JwtKit {
@Autowired
private JwtProperties jwtProperties;
/**
* 生成Token
*
* @param user 自定义要存储的用户对象信息
* @return
*/
public String generateToken(User user) {
Map<String, Object> claims = new HashMap<String, Object>();
claims.put("name", user.getName());
claims.put("createdate", new Date());
claims.put("id", System.currentTimeMillis());
return Jwts.builder().addClaims(claims) // 要存储的数据
.setExpiration(new Date(System.currentTimeMillis() + jwtProperties.getExpiration())) // 过期时间
.signWith(SignatureAlgorithm.HS256, jwtProperties.getSecret()) // 加密算法和密钥
.compact(); // 打包返回 3部分
}
/**
* 校验Token是否合法
*
* @param token 要校验的Token
* @return
*/
public Claims parseJwtToken(String token) {
Claims claims = null;
claims = Jwts.parser().setSigningKey(jwtProperties.getSecret())// 根据哪个密钥解密
.parseClaimsJws(token) // 设置要解析的Token
.getBody();
return claims;
}
}
增加拦截器,用来从请求中验证JwtToken
package com.example.demo.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import com.example.demo.config.JwtProperties;
import com.example.demo.tool.JwtKit;
import io.jsonwebtoken.Claims;
/**
* 自定义拦截器,主要用于用户鉴权
*
* @author AdminMall
*
*/
public class AuthInterceptorHandler implements HandlerInterceptor {
@Autowired
private JwtProperties jwtProperties;
@Autowired
private JwtKit jwtKit;
/**
* 前置拦截器
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 获取到JWT的Token
String jwtToken = request.getHeader(jwtProperties.getTokenHeader());
if (jwtToken != null) {
// 截取中间payload部分
String payloadToken = jwtToken.substring(jwtProperties.getTokenHead().length());
// 解析Token,获取Claims = Map
Claims claims = jwtKit.parseJwtToken(payloadToken);
// 获取payload中的报文,
System.out.println("登陆人:" + claims.get("name").toString());
return true;
}
System.out.println("登陆非法");
return false;
}
}
配置WebMvcConfiguration类,将拦截器加入到容器中。同时设置不拦截的接口地址。
package com.example.demo.config;
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;
import com.example.demo.filter.AuthInterceptorHandler;
@Configuration
public class SpringWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authInterceptorHandler()).excludePathPatterns("/getJwtToken");
}
@Bean
public AuthInterceptorHandler authInterceptorHandler() {
return new AuthInterceptorHandler();
}
}
书写两个Controller接口。一个获取JwtToken(不拦截);一个验证JwtToken(拦截)
package com.example.demo.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import com.example.demo.entity.User;
import com.example.demo.tool.JwtKit;
@RestController
public class ControllerDemo {
@Autowired
private JwtKit jwtKit;
@RequestMapping("/getJwtToken")
public String getJwtToken(HttpServletRequest request) {
User user = new User();
user.setName("马罗乐");
String token = jwtKit.generateToken(user);
return token;
}
@RequestMapping("/parseJwtToken")
public String parseJwtToken(HttpServletRequest request) {
return "解析成功";
}
}
启动服务,测试接口
接口一:获取到JwtToken。如图。
接口二:使用PostMan,将JwtToken放入头中。
参数如下:
Authorization=Bearer(空格)+ JWTToken
如图。
原文链接:https://blog.csdn.net/u014386444/article/details/114678292
作者:欧美丽
链接:http://www.javaheidong.com/blog/article/114196/9b95f0c7f8ad8e7db0fd/
来源:java黑洞网
任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任
昵称:
评论内容:(最多支持255个字符)
---无人问津也好,技不如人也罢,你都要试着安静下来,去做自己该做的事,而不是让内心的烦躁、焦虑,坏掉你本来就不多的热情和定力
Copyright © 2018-2021 java黑洞网 All Rights Reserved 版权所有,并保留所有权利。京ICP备18063182号-2
投诉与举报,广告合作请联系vgs_info@163.com或QQ3083709327
免责声明:网站文章均由用户上传,仅供读者学习交流使用,禁止用做商业用途。若文章涉及色情,反动,侵权等违法信息,请向我们举报,一经核实我们会立即删除!