程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

暂无数据

JWT的简单使用-HelloWorld!

发布于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黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

5 0
收藏该文
已收藏

评论内容:(最多支持255个字符)