网关过滤器验证token

一、JwtUtil 工具类

package com.changgou.system.utils;/*** @author :lijunxuan* @date :Created in 2019/7/11  17:14* @description :* @version: 1.0*/import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;/*** JWT工具类*/
public class JwtUtil {//有效期为public static final Long JWT_TTL = 3600000L;// 60 * 60 *1000  一个小时//设置秘钥明文public static final String JWT_KEY = "william";/*** 创建token* @param id* @param subject* @param ttlMillis* @return*/public static String createJWT(String id, String subject, Long ttlMillis) {//定义jwt签名的算法SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;//当前时间long nowMillis = System.currentTimeMillis();//将当前时间转换日期类型Date now = new Date(nowMillis);//将当前时间+超时时间if(ttlMillis==null){ttlMillis=JwtUtil.JWT_TTL;}long expMillis = nowMillis + ttlMillis;//将时间定义为date类型Date expDate = new Date(expMillis);//获取签名时候使用的密钥SecretKey secretKey = generalKey();JwtBuilder builder = Jwts.builder().setId(id)              //唯一的ID.setSubject(subject)   // 主题  可以是JSON数据.setIssuer("admin")     // 签发者.setIssuedAt(now)      // 签发时间.signWith(signatureAlgorithm, secretKey) //使用HS256对称加密算法签名, 第二个参数为秘钥.setExpiration(expDate);// 设置过期时间return builder.compact();}/*** 生成加密后的秘钥 secretKey* @return*/public static SecretKey generalKey() {byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY);SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");return key;}
}

二、创建过滤器,用于token验证

package com.william.filter;import com.william.util.JwtUtil;
import io.jsonwebtoken.Jwts;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;/*** @author :lijunxuan* @date :Created in 2019/7/11  17:39* @description :* @version: 1.0*//*** 鉴权过滤器* 判断用户是否有权限访问*/
@Component
public class AuthorizeFilter implements GlobalFilter, Ordered {//请求头中的令牌常量public final static String TOKEN = "token";@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//1.获取请求ServerHttpRequest request = exchange.getRequest();//2.获取响应ServerHttpResponse response = exchange.getResponse();//3.判断用户是否访问的为登录路径,如果是登录路径则放行if (request.getURI().getPath().contains("/admin/login")){return chain.filter(exchange);}//4. 获取请求头中的令牌HttpHeaders headers = request.getHeaders();String token = headers.getFirst(TOKEN);//5. 如果请求头中的令牌为空, 则返回错误状态码if (StringUtils.isEmpty(token)){response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}//6. 解析请求头中的jwt令牌try {JwtUtil.parseJWT(token);} catch (Exception e) {//7. 如果解析出错, 说明令牌过期或者被篡改, 返回状态码e.printStackTrace();response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}//8. 如果解析正常则放行return chain.filter(exchange);}@Overridepublic int getOrder() {return 3;}
}

测试结果

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333076.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL SHELL 缓存历史命令

在正常情况下&#xff0c;我们在 MySQL SHELL 中输入的历史命令语句&#xff0c;通过上下箭头键可以向前向后查看&#xff0c;但是如果输入的语句中含有密码字段&#xff0c;那么这条命令语句不会被缓存到历史记录中。

java掌握_掌握Java 11的Constantdynamic

java掌握为了使JVM对动态语言更具吸引力&#xff0c;该平台的第七版已将invokedynamic引入了其指令集。 Java开发人员通常不会注意到此功能&#xff0c;因为该功能已隐藏在Java字节码中。 简而言之&#xff0c;通过使用invokedynamic &#xff0c;可以将方法调用的绑定延迟到第…

Mybatis动态代理模式实现CRUD

项目实现的功能 查询所有用户信息 通过Id查询用户信息 添加用户&#xff08;回显主键&#xff09; 修改用户信息 删除用户信息 通过用户名字模糊查询 一、引入依赖和工程结构 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

MySQL撤销(revoke)用户权限

文章目录撤销用户对某个数据库的全部权限撤销用户对某个数据库的部分权限撤销用户对某个数据库的某张表的部分权限撤销用户对任何数据库的任何表的部分权限撤销 WITH GRANT OPTION 权限权限表撤销权限的巨坑撤销语句要和授权语句完全一致权限 USAGE 是无法撤销的数据库 test 的…

无服务器–仅仅是构建现代应用程序的一种方法?

如果搜索“无服务器”&#xff0c;则会发现无服务器是构建现代应用程序的一种新的流行方式。 无服务器真的是新的吗&#xff1f; 无服务器是指您无需担心服务器的概念–无需置备&#xff0c;部署和维护服务器。 显然有服务器&#xff0c;但是您不必考虑或担心它们&#xff0c;…

Mybatis核心配置文件xml详解

<!-- configuration:在dtd约束中? 代表一次或零次 代表一次或多次&#xff08;最少一次&#xff0c;可以多次&#xff09;* 代表零次或多次&#xff08;有没有都可以&#xff09;, :逗号 特定的顺序&#xff08;&#xff09;| :竖杠 任选其一能添加的标签和顺序properties?…

MySQL查询语句后面加上“\G”,提示 ERROR: No query specified

在查询语句后面以 \G 结尾&#xff0c;表示纵向显示每行记录&#xff0c;如下所示&#xff1a; mysql> select * from student\G; *************************** 1. row ***************************id: 00000000000000000001name: liaowenxiongage: 22score: NULLbirthday:…

c++ 嵌套私有类_嵌套类和私有方法

c 嵌套私有类当您在另一个类中有一个类时&#xff0c;他们可以看到彼此的private方法。 在Java开发人员中并不为人所知。 面试过程中的许多候选人说&#xff0c; private是一种可见性&#xff0c;它使代码可以查看成员是否属于同一班级。 这实际上是对的&#xff0c;但更准确地…

Mybatis多参数封装到一个类中模糊查询

1.创建QueryValueObject实体类 package com.william.domain;import org.omg.PortableInterceptor.USER_EXCEPTION;/*** author &#xff1a;lijunxuan* date &#xff1a;Created in 2019/7/12 12:09* description &#xff1a;* version: 1.0*/ public class QueryValueObje…

MySQL数据库的权限表

文章目录user 表db 表tables_priv 表columns_priv表MySQL 数据库中与权限相关的表&#xff1a;user、db、tables_priv、columns_priv。 user 表 mysql> select * from mysql.user\G *************************** 1. row ***************************Host: localhostUser: …

jakarta ee_MicroProfile在Jakarta EE时代的作用

jakarta ee自创建以来&#xff0c;MicroProfile赢得了广泛的关注&#xff0c;并制定了各种规格。 最初&#xff0c;它的创建是为了在多个供应商的推动下&#xff0c;以更快的速度推进微服务世界的企业Java。 现在&#xff0c;随着在Eclipse Foundation下将Java EE转换为Jakarta…

Linux系统下MySQL数据库的超级管理员root的密码忘记/忘记密码怎么办?

文章目录方法一方法二方法三方法一 1.添加登录跳过权限检查配置 修改 /etc/my.cnf 文件&#xff0c;在 [mysqld] 配置节点添加 skip-grant-tables 配置 [mysqld] skip-grant-tables2.重新启动mysql服务 service mysqld restart3.修改密码 添加登录跳过权限检查配置后&#x…

Mybatis多参数封装到map中,多条件查询

1.UserMapper接口 package com.william.dao;import com.william.domain.QueryValueObject; import com.william.domain.User;import java.util.List;public interface UserMapper {/*** 多参数封装到map中&#xff0c;多条件查询* param map* return*/List<User> findBy…

jax-rs配置_具有MicroProfile配置的可配置JAX-RS ExceptionMapper

jax-rs配置当使用JAX-RS创建REST服务时&#xff0c;通常不返回任何内容&#xff08;例如HTTP 201/2/4等&#xff09;或某些数据&#xff08;可能采用JSON格式&#xff08;因此HTTP 200&#xff09;&#xff0c;或者返回某些异常/错误&#xff08;因此HTTP 4xx或5xx&#xff09;…

MySQL数据库修改用户登录密码的三种方式

文章目录一、更新 mysql.user 表二、用 set password 命令三、使用 mysqladmin 命令提醒&#xff1a;MYSQL5.7 版本后不再支持password()函数和password字段。 一、更新 mysql.user 表 mysql> use mysql; mysql> update user set passwordpassword(123456) where userr…

Mybatis多条件直接查询

1.UserMapper接口 package com.william.dao;import com.william.domain.QueryValueObject; import com.william.domain.User;import java.util.List;public interface UserMapper {/*** 根据多条件直接查询* param username* param sex* param startIndex* param pageSize* re…

java 正在验证应用程序_Java应用程序中的验证

java 正在验证应用程序我经常看到的项目几乎没有任何有意识的数据验证策略。 他们的团队在截止日期&#xff0c;明确要求的巨大压力下工作&#xff0c;只是没有足够的时间以适当且一致的方式进行验证。 因此&#xff0c;数据验证代码随处可见&#xff1a;JavaScript片段&#x…

Mybatis多条件直接查询Param注解版

1.UserMapper接口 package com.william.dao;import com.william.domain.QueryValueObject; import com.william.domain.User;import java.util.List;public interface UserMapper {/*** 多条件直接查询Param注解版* param username* param sex* param startIndex* param pageS…

WPS for MacOS如何设置自动句首字母大写

在顶部菜单栏&#xff0c;点击【文件】–>【文字偏好设置】或者点击左上角的【文件】–>【文字偏好设置】&#xff1a;