spring boot>>JWT/JJWT JSON WEB TOKEN

jjwt的jar包引入

fastjson的jar包引入

        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>
        
        <!-- https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt -->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.0</version>
        </dependency>

 

用户登陆成功后生成 token 返给前端进行缓存

 

package com.baojian.zhang.util;

import java.util.Date;

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class TokenUtil {
	
	//这里是加密解密的key。
	public static String tokenKey = "MiTMW2toifJyH0MO";

	/**
	 * 根据用户卡号生成token,默认有效期为1个月
	 * @param expiresDate  过期时间
	 * @param cardNumber
	 *            用户卡号
	 * @return token
	 */
	public static String createToken(String cardNumber, Date expiresDate) {
		// 生成token
		return Jwts.builder().setSubject(cardNumber).setIssuedAt(new Date())// 设置签发时间
				.setExpiration(expiresDate)// 设置过期时间
				.signWith(SignatureAlgorithm.HS512, tokenKey).compact();
	}

	/**
	 * 检验token是否可用
	 * 
	 * @param token
	 * @return 可用返回true,否则返回false
	 */
	public boolean checkToken(String token) {
		try {
			Jwts.parser().setSigningKey(tokenKey).parseClaimsJws(token);
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

	}
}

当用户登录成功后,访问接口时进行 token 校验。本文章把校验放在 Zuul  进行统一校验

package com.baojian.zhang.filter;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;

import com.alibaba.fastjson.JSON;
import com.baojian.zhang.base.BaseVO;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import io.jsonwebtoken.UnsupportedJwtException;

public class TokenFilter extends ZuulFilter {

	@Override
	public boolean shouldFilter() {
		// 过滤含有 sign 的接口
		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest request = ctx.getRequest();
		ctx.set("startTime", System.currentTimeMillis());// 设置请求开始时间
		// 获取 sign 参数
		String sign = request.getParameter("sign");
		if (StringUtils.isNotEmpty(sign)) {
			return true;
		}
		return false;
	}

	@Override
	public Object run() {
		
		RequestContext ctx = RequestContext.getCurrentContext();
		HttpServletRequest request = ctx.getRequest();
		
		// 获取 sign 参数
		String sign = request.getParameter("sign");
		
		// 有sign 时必须传入卡号,检查卡号是否存在
		String cardNumber = request.getParameter("cardNumber");
		
		if (StringUtils.isEmpty(cardNumber)) {
			returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(2, "卡号不能为空")));
			return null;
		}
		// 检查token是否过期
		try {
			Jws<Claims> jws = Jwts.parser().setSigningKey("MiTMW2toifJyH0MO").parseClaimsJws(sign);
			if (!cardNumber.equals(jws.getBody().getSubject())) {
				returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(101, "用户卡号与token不匹配!")));
				return null;
			}
		} catch (ExpiredJwtException e) {
			// token已过期
			returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(105, "token已过期,请重新登录!")));
			return null;
		} catch (UnsupportedJwtException e) {
			// token不支持
			returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(107, "token信息不能被解析,请重新登录!")));
			return null;
		} catch (MalformedJwtException e) {
			// token格式不对
			returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(106, "token格式错误,请重新登录!")));
			return null;
		} catch (SignatureException e) {
			// token签名不对
			returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(104, "token签名错误,请重新登录!")));
			return null;
		} catch (IllegalArgumentException e) {
			// token格式转换错误
			returnResponse(ctx, JSON.toJSONString(new BaseVO<Void>(108, "token为空,请重新登录!")));
			return null;
		}
		// 这里return的值没有意义,zuul框架没有使用该返回值
		return null;
	}

	@Override
	public String filterType() {
		/**
		 * pre:可以在请求被路由之前调用
		 * route:在路由请求时候被调用
		 * post:在route和error过滤器之后被调用
		 * error:处理请求时发生错误时被调用
		 */
		return FilterConstants.PRE_TYPE;
	}

	@Override
	public int filterOrder() {
		return 0;
	}
	
	private void returnResponse(RequestContext ctx, String body) {
		ctx.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
		ctx.getResponse().setCharacterEncoding("UTF-8");
		ctx.setSendZuulResponse(false);
		ctx.setResponseStatusCode(200);
		ctx.setResponseBody(body);
	}
}

将TokenFilter加入到请求拦截队列,在启动类中添加以下代码:

package com.baojian.zhang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
import org.springframework.context.annotation.Bean;

import com.baojian.zhang.filter.TokenFilter;

@SpringBootApplication
@EnableZuulProxy
public class MyZuulServiceApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyZuulServiceApplication.class, args);
	}
	
	@Bean
	public TokenFilter tokenFilter() {
	    return new TokenFilter();
	}
}

 

<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.5.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.mz</groupId> <artifactId>hejiayun-community</artifactId> <version>0.0.1-SNAPSHOT</version> <name>hejiayun-community</name> <packaging>jar</packaging> <description>合家云社区物业管理平台</description> <properties> <java.version>17</java.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version> <druid.version>1.2.21</druid.version> <bitwalker.version>1.21</bitwalker.version> <fastjson.version>2.0.43</fastjson.version> <oshi.version>6.4.6</oshi.version> <jna.version>5.13.0</jna.version> <commons.fileupload.version>1.5</commons.fileupload.version> <poi.version>5.2.4</poi.version> <velocity.version>2.3</velocity.version> <jwt.version>0.12.3</jwt.version> <mybatis-plus.version>3.5.5</mybatis-plus.version> <easy-captcha.version>1.6.2</easy-captcha.version> <jsqlparser.version>4.5</jsqlparser.version> </properties> <dependencies> <!-- Spring Boot Web Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- Spring Boot AOP --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <!-- Spring Boot Validation --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- Spring Boot DevTools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!-- MySQL Connector --> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <scope>runtime</scope> </dependency> <!-- Druid Connection Pool --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>${druid.version}</version> </dependency> <!-- MyBatis Plus --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>${mybatis-plus.version}</version> </dependency> <!-- <!– PageHelper –> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>1.4.7</version> </dependency>--> <!-- Redis --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!-- FastJSON2 (替代FastJSON) --> <dependency> <groupId>com.alibaba.fastjson2</groupId> <artifactId>fastjson2</artifactId> <version>${fastjson.version}</version> </dependency> <!-- Jackson for JSON processing --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <!-- JWT Token --> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>${jwt.version}</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>${jwt.version}</version> <scope>runtime</scope> </dependency> <!-- System Information --> <dependency> <groupId>com.github.oshi</groupId> <artifactId>oshi-core</artifactId> <version>${oshi.version}</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>${jna.version}</version> </dependency> <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna-platform</artifactId> <version>${jna.version}</version> </dependency> <!-- User Agent Utils --> <dependency> <groupId>eu.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> <version>${bitwalker.version}</version> </dependency> <!-- Captcha --> <dependency> <groupId>com.github.whvcse</groupId> <artifactId>easy-captcha</artifactId> <version>${easy-captcha.version}</version> </dependency> <!-- Spring Boot Logging --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency> <!-- Test Dependencies --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <!-- Spring Security (如果需要,取消注释) --> <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> --> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>17</source> <target>17</target> </configuration> </plugin> </plugins> </build> </project>看看我的配置文件
最新发布
07-27
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值