路由:她会把外部所有对请求转发到具体的微服务实例上,是实现外部访问同一接口的基础

过滤: 就是权限的检查, 判断当前的请求是否有权限区访问那些服务集群

搭建后台网关:

  1. 导入eureka - client, 它本身也是一个客户端,需要注册进eureka

    1. 导入网关的包
        <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

过滤器, 重写下面的ZuulFilter可以实现自定义的过滤规则, 每个方法的含义都通过注释的方式写在了方法头

网关的过滤器

@Component
public class WebManagerFilter extends ZuulFilter { /**
* 指定过滤器的类型
pre :可以在请求被路由之前调用
route :在路由请求时候被调用
post :在route和error过滤器之后被调用
error :处理请求时发生错误时被调用
* @return
*/
@Override
public String filterType() {
return "pre";
} /**
* 指定过滤器的优先级, 0表示优先执行, 因为我们可以写很多个过滤器
* @return
*/
@Override
public int filterOrder() {
return 0;
} /**
* 当前过滤器是否开启, true表示开启
* @return
*/
@Override
public boolean shouldFilter() {
return true;
} /**
* 过滤器执行逻辑, 返回任意Object类型的值,都表示放行,包括null
* 如果不想往后继续执行了,就使用 setSendZullResponse(false)
* @return
* @throws ZuulException
*/
@Override
public Object run() throws ZuulException {
System.out.println("经过了后台的过滤器");
return null;
}
}

我们可以通过RequestContext的实例对象,获取出请求头,请求parms,请求ip等信息, 针对不同的信息可以做出不同的处理

黑白名单

比如我们可以在网关中禁用掉恶意访问的ip地址

验证权限

如果项目是前后端分离使用jwt等工具生成token放在请求头中做安全验证,我们也能在网关中对请求头做出初步解析处理

防止抓包

还能根据用户请求中发送过来的请求参数做验证签名处理, 防止数据在传输过程中被恶意篡改


此外,网关会过滤掉一些请求的请求头,如果请求头是我们自己定义的,就比如下面的Authrization, 经过网关后的请求的头信息会丢失,进而导致下面的这段代码失效, 获取不出头信息,就没办法验证token的合法性

解决办法: 选着添加添加一条配置信息 sensitive-headers: 将这个配置置空,意为清空网关要过滤的请求头


RequestContext currentContext = RequestContext.getCurrentContext();
String header = currentContext .getRequest().getHeader("Authorization");
System.err.println("zull header "+header);
// 判断是否存在header
if (!"".equals(header)&&header!=null){
System.err.println("转发header");
currentContext.addZuulRequestHeader("Authorization",header);
}

使用过滤器做验证的逻辑如下,验证携带在请求头中的token信息如下:

这个方法的特点就是, 只要他能在遇到 return null 就表示成功完成了验证的逻辑

1. 导入 common,我们要使用它的jwtUtil
@Override
public Object run() throws ZuulException {
System.err.println("经过了后台的过滤器"); RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletRequest request = currentContext.getRequest();
// 获取出请求头
String header = request.getHeader("Authorization"); // 放行zuul的第一次请求 todo 我并没有触发这个方法的执行
if (request.getMethod().equals("OPTIONS")){
System.err.println("OPTIONS");
return null;
} // 放行登录请求
if (request.getRequestURL().indexOf("login")>0){
return null;
} if (StringUtils.isNotBlank(header)){
if (header.startsWith("Bearer ")){
String token = header.substring(7);
if (StringUtils.isNotBlank(token)){
System.out.println("token=="+token);
try{
Claims claims = jwtUtil.parseJWT(token);
String roles =(String) claims.get("roles");
System.out.println("roles=="+roles);
// 对admin放行,
if (roles.equals("admin")){
return null;
}
// todo 转发头信息,我改了配置文件, 让zuul不过滤任何头信息
// 其他情况, 终止访问
currentContext.setSendZuulResponse(false); }catch (Exception e){
// 解析token出现的异常,说明token有问题, 终止本次请求
System.out.println("token出错了,终止本次访问: "+e);
currentContext.setSendZuulResponse(false);
}
}
}
} currentContext.setSendZuulResponse(false);
currentContext.getResponse().setContentType("text/html;chatset=utf-8");
try {
currentContext.getResponse().getWriter().write("权限不足");
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

使用zuul实现验证自定义请求头中的token的更多相关文章

  1. 自定义请求头信息及cookie信息

    请求网页的时候有时候我们需要传递一些参数信息,这个时候我们可以将参数放到请求头中,具体使用如下: 这里有小问题就是请求参数的属性名好像不支持下划线,即 HTTP_UID不可用,但是HTTP-UID就可 ...

  2. Http 请求头中的 Proxy-Connection

    平时用 Chrome 开发者工具抓包时,经常会见到 Proxy-Connection 这个请求头.之前一直没去了解什么情况下会产生它,也没去了解它有什么含义.最近看完<HTTP 权威指南> ...

  3. 使用 Spring RestTemplate 调用 rest 服务时自定义请求头(custom HTTP headers)

    在 Spring 3.0 中可以通过  HttpEntity 对象自定义请求头信息,如: private static final String APPLICATION_PDF = "app ...

  4. shiro 获取请求头中的 sessionId

    前言: 在前后端项目中, 前端有可能会要求, 后台返回一个 sessionId 给他, 然后他在请求后台接口时, 把这个sessionId 带给后台, 后台拿到这个sessionId , 就能识别, ...

  5. Python3 自定义请求头消息headers

    Python3 自定义请求头消息headers 使用python爬虫爬取数据的时候,经常会遇到一些网站的反爬虫措施,一般就是针对于headers中的User-Agent,如果没有对headers进行设 ...

  6. HTTP 请求头中的 X-Forwarded-For(转)

    原文:https://imququ.com/post/x-forwarded-for-header-in-http.html 我一直认为,对于从事 Web 前端开发的同学来说,HTTP 协议以及其他常 ...

  7. post请求头中常见content-type(非常重要)

    定义和用法 enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码.默认地,表单数据会编码为 "application/x-www-form-urlencoded". ...

  8. 解决SpringCloud使用Feign跨服调用时header请求头中的信息丢失

    在使用SpringCloud进行Feign跨服调用时header请求头中的信息会丢失,是因为Feign是不会带上当前请求的Cookie信息和头信息的,这个时候就需要重写请求拦截. 1.需要重写Requ ...

  9. ASP.NET Core - 实现Http自定义请求头策略

    前言 在正常的情况下,当我们系统用到JWT认证方式时,需要在Http请求头添加Authorization: XXX,这样在后台服务的控制器中打上[Authorize]授权标签,就限定所有的请求必须通过 ...

随机推荐

  1. windows安装web服务器看这一篇就够了(Apache PHP MySQL)

    本文将为您描述Windows Server Install Apache PHP MySQL(图文详解),Windows搭建web服务器(php+Apache+mysql) 的方法 环境准备: Win ...

  2. 使用Java8 Stream API对Map按键或值进行排序

    一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams ...

  3. 如何让多个不同类型的后端网站用一个nginx进行反向代理实际场景分析

    前段时间公司根据要求需要将聚石塔上服务器从杭州整体迁移到张家口,刚好趁这次机会将这些乱七八糟的服务器做一次梳理和整合,断断续续一个月迁移完成 大概优化掉了1/3的机器,完成之后遇到了一些问题,比如曾今 ...

  4. Knative Serving 健康检查机制分析

    作者|  阿里云智能事业群技术专家牛秋霖(冬岛) 导读:从头开发一个Serverless引擎并不是一件容易的事情,今天咱们就从Knative的健康检查说起.通过健康检查这一个点来看看Serverles ...

  5. 12 Zabbix4.4.0系统sendEmail邮件报警优化

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 12 Zabbix4.4.0系统sendEmail邮件报警优化 接上一章节  Zabbix4.4. ...

  6. git 生成密匙时遇到报错 :Too many arguments.

    今天在我用新电脑想要向github上的远程库上传项目时,由于新电脑上的本地库没有与远程库建立连接,所以要在本地生成密匙添加到github上才可以上传,在我执行命令 ssh-keygen -t rsa- ...

  7. python协程总结

    概述 python多线程中因为有GIL(Global Interpreter Lock 全局解释器锁 )的存在,所以对CPU密集型程序显得很鸡肋:但对IO密集型的程序,GIL会在调用IO操作前释放,所 ...

  8. PHP读取Excel内的图片

    今天接到了一个从Excel内读取图片的需求,在网上查找了一些资料,基本实现了自己的需求,不过由于查到的一些代码比较久远,不能直接移植到自己的项目里,需要稍加改动一下. 这里介绍一下分别使用phpspr ...

  9. [剑指offer]第1题,二维数组中的查找

    ①题目 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  10. Salesforce学习之路(十一)Aura组件属性<aura:attribute />

    1. <aura:attribute />语法 Aura组件属性类似与Apex中类的成员变量(或者说Java中类的成员变量).他们是组件在特定的实例上设置的类型化字段,可以使用表达式语法从 ...