网关登录校验

在网关工程中添加全局过滤器

import com.alibaba.fastjson.JSON;
import com.xuecheng.commons.model.vo.AuthInfo;
import com.xuecheng.commons.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import lombok.SneakyThrows;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.net.URLEncoder;/*** 网关-全局过滤器* 1、实现两个接口和两个方法* 2、在filter方法中,完成过滤逻辑*/
@Component
public class AuthFilter implements GlobalFilter, Ordered {/*** 核心过滤方法:业务处理* @param exchange:请求上下文(获取request和response)* @param chain:过滤器链(控制程序放行)* @return*/@SneakyThrowspublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();ServerHttpResponse response = exchange.getResponse();//1、获取当前的请求连接String path = request.getURI().getPath();//2、判断,此请求地址是否需要进行token校验,如果不需要,直接放行,进入微服务if(path.contains("coursePub/preview") ||path.contains("login") ||path.contains("basic/dictionary") ||path.contains("category/tree-nodes")||path.contains("course/upload")||path.contains("search/")){return chain.filter(exchange);}//3、获取请求头参数tokenString token = request.getHeaders().getFirst("Authorization");Boolean verifyToken = JwtUtils.verifyToken(token);//4、验证token是否合法,如果不合法,响应状态码401if(!verifyToken) {response.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete(); //直接返回}//5、解析token,获取登录时存入的数据(userId,companyId,companyName)Claims claims = JwtUtils.parserToken(token).getBody();Long userId = claims.get("userId", Long.class);Long companyId = claims.get("companyId", Long.class);String companyName = claims.get("companyName", String.class);//转化java对象AuthInfo info = new AuthInfo();info.setUid(userId);info.setCompanyName(companyName);info.setCompanyId(companyId);//6、设置一个新的请求头参数(解析后的明文数据)String json = URLEncoder.encode(JSON.toJSONString(info),"UTF-8");//创建一个httpRequest的请求对象ServerHttpRequest httpRequest = request.mutate().headers(httpHeaders -> {httpHeaders.set("payload", json);}).build();//将此请求对象,写入到微服务转发的上下文中exchange.mutate().request(httpRequest);return chain.filter(exchange);}/*** 指定多个过滤器时,此过滤器的执行顺序*/public int getOrder() {return 0;}
}

统一token解析(添加到微服务当中或提取出来)

编写拦截器

import com.alibaba.fastjson.JSON;
import com.xuecheng.commons.model.vo.AuthInfo;
import com.xuecheng.commons.utils.AuthInfoHolder;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.URLDecoder;/*** 自定义拦截器*/
@Component
@Slf4j
public class TokenInterceptor implements HandlerInterceptor {//进入controller方法之前执行。public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//1、获取网关转发来的json数据,String payload = request.getHeader("payload");if(StringUtils.isEmpty(payload)) {return true; //执行controller}//2、转化成AuthInfo对象,String  json = URLDecoder.decode(payload, "UTF-8");log.info("json = " + json);AuthInfo info = JSON.parseObject(json, AuthInfo.class);log.info("info = " + info);//3、存入threadlocalAuthInfoHolder.setAuthInfo(info);return true;}//执行controller方法之后执行public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}//响应结束之前public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

配置拦截器

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 InterceptorConfig  implements WebMvcConfigurer {//注册拦截器@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new TokenInterceptor())  // 添加拦截器.addPathPatterns("/**");    // 添加拦截的路径}
}

ThreadLocal工具类

import com.xuecheng.commons.model.vo.AuthInfo;/*** 存放用户id的容器*/
public class AuthInfoHolder {private final static ThreadLocal<AuthInfo> threadLocal = new ThreadLocal<>();/*** 获取线程中的用户*/public static AuthInfo getAuthInfo() {return threadLocal.get();}/*** 设置当前线程中的用户*/public static void setAuthInfo(AuthInfo info) {threadLocal.set(info);}public static Long getUserId() {return threadLocal.get().getUid();}public static Long getCompanyId() {if(threadLocal.get() != null) {return threadLocal.get().getCompanyId();}else {return null;}}public static void remove(){threadLocal.remove();}}

服务网关(Gateway)自定义全局过滤器统一Token处理相关推荐

  1. Gateway自定义全局过滤器

    一.Gateway全局过滤器 1.全局过滤器(Global Filters)简介 Gateway过滤器在实现方式上,有两种过滤器: GatewayFilter(局部过滤器/网关过滤器): 需要通过 s ...

  2. 微服务网关Gateway实战

    1. 什么是Spring Cloud Gateway 网关作为流量的入口,常用的功能包括路由转发,权限校验,限流等. Spring Cloud Gateway 是Spring Cloud官方推出的第二 ...

  3. Spring Cloud之(十八)微服务网关GateWay

    十八.微服务网关GateWay Zuul 1.x 是一个基于阻塞 IO 的 API Gateway 以及 Servlet:直到 2018 年 5 月,Zuul 2.x(基于Netty,也是非阻塞的,支 ...

  4. Spring Cloud 微服务网关Gateway组件

    一.网关介绍 大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用. 这样的架构会存 ...

  5. java 配置全局过滤器,如何为Spring Cloud Gateway加上全局过滤器

    既然是一个网关.那么全局过滤器肯定是少不了的一个存在.像是鉴权.认证啥的不可能每个服务都做一次,一般都是在网关处就搞定了. Zuul他就有很强大的过滤器体系来给人使用. Gateway当然也不会差这么 ...

  6. Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway

    转载自  Spring Cloud 终于按捺不住推出了自己的服务网关 Gateway Spring 官方最终还是按捺不住推出了自己的网关组件:Spring Cloud Gateway ,相比之前我们使 ...

  7. SpringCloud—— 微服务网关GateWay

    目录 1.GateWay网关概述 1.1.什么是GateWay? 1.2.为什么要使用微服务网关? 1.3.Zuul与GateWay网关的区别? 2.快速入门 2.1.创建项目 2.2.配置yml文件 ...

  8. SpringCloud 微服务网关Gateway 动态路由配置

    概述:在上一章节<SpringCloud 微服务网关Gateway介绍及简单路由配置>中我们讲述了Gateway的最简单的路由配置方式.但是其中比较明显的问题就是我们在配置路由服务的地址时 ...

  9. 博海拾贝--springcloud的组件及使用(3)服务网关 GateWay

    Srpingcloud 服务网关 GateWay 前言: Spring Cloud Gateway是springcloud官方推出的第二代网关框架,她包括转发.限流.熔断.权限校验等功能. 本文就来介 ...

最新文章

  1. Python基本语法_基本数据类型_字典类型详解
  2. MySQL字符串截取函数
  3. apache_php_tomcat基于主机名的多虚拟主机整合笔记
  4. 【转】MATLAB的polar函数 极坐标绘制最大半径怎样设置
  5. Ext DeskTop的使用方法简易教程及相关例子Demo(转)
  6. 超详细SQLMap使用攻略及技巧分享
  7. HDU 2049 不容易系列之(4)——考新郎( 错排 )
  8. 【五】每个球队胜率统计
  9. c语言中的函数可变参数列表相关的三个宏
  10. C++基础教程之日期和时间
  11. 如何生成每秒百万级别的 HTTP 请求
  12. 机器学习——第一回视频总结
  13. 买了个国产平台,竟然无法自行安装系统
  14. 关于eclipse编译出错,缺失tools.jar 1.8
  15. stm32电容触摸按键的实现
  16. css3实现缺角四边形_CSS3实现缺角矩形与折角矩形以及缺角边框代码实例
  17. CentOS7配简单的桌面环境openbox
  18. CSS:让图片保持长宽比 自适应缩小放大 解决方案
  19. 【2018年11月12日】其他化学制品行业的股票估值
  20. uni.showtoast不显示的问题,可能是因为uni uni.showloding uni.showtoast 冲突

热门文章

  1. python安装模块(官网文档)
  2. leetcode75 颜色分类
  3. 安卓移动应用开发之从零开始写安卓小程序
  4. java.sql.time 格式_java.sql.Date,java.sql.Time和java.sql.Timestamp什么区别
  5. Linux signal、sigaction的使用总结
  6. ker矩阵是什么意思_矩阵光学
  7. Merriam-Webster‘s Vocabular Builder ( PAC )
  8. 【方法】Latex多行公式及编号
  9. AutoDesk CAD激活后闪退解决方法
  10. 关于vSphere vMotion的讨论 -3