Zuul 修改 请求头、响应头 (死磕)

疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【博客园总入口

架构师成长+面试必备之 高并发基础书籍 【Netty Zookeeper Redis 高并发实战



疯狂创客圈 高并发 环境 视频,陆续上线:

  • Windows Redis 安装(带视频)
  • Linux Redis 安装(带视频)
  • Windows Zookeeper 安装(带视频)
  • Linux Zookeeper 安装(带视频)
  • RabbitMQ 离线安装(带视频)
  • Nacos 安装(带视频)
  • ElasticSearch 安装, 带视频**

小视频以及所需工具的百度网盘链接,请参见 疯狂创客圈 高并发社群 博客

前言

由于 SpingSecurity + SpringSession 整合场景,涉及到修改Zuul请求头的问题。

故梳理一个比较全面的Zuul 修改请求头、响应头的文章

1 SpingSecurity + SpringSession 整合场景二

本场景为统一网关 + 微服务场景:网关 SpingSecurity 实现 token认证,转成sessionID后,路由到单体微服务, 单体微服务 的 SpringSession 实现Session 共享。SessionID 保持在 token中。

2 功能介绍:

Zuul网关 SpingSecurity 实现 token认证,从token中提取sessionID,放入header头部,再传给后台微服务

3 参考文献:Zuul 使用filter 修改请求头和响应头

一: 修改请求参数,参见 博文

RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
     Map<String, List<String>> requestQueryParams = ctx.getRequestQueryParams();

        if (requestQueryParams==null) {
            requestQueryParams=new HashMap<>();
        }

        //将要新增的参数添加进去,被调用的微服务可以直接 去取,就想普通的一样,框架会直接注入进去
        ArrayList<String> arrayList = new ArrayList<>();
        arrayList.add("1");
        requestQueryParams.put("test", arrayList);

        ctx.setRequestQueryParams(requestQueryParams);

二: 修改请求头,参见 博文

RequestContext ctx = RequestContext.getCurrentContext();
ctx.addZuulRequestHeader("original_requestURL",request.getRequestURL().toString());

三:修改响应头,参见 博文

RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletResponse response = ctx.getResponse();
        String info = response.getHeader("info");
        String info_size = response.getHeader("info_size");
        /**
         * 设置响应头,使请求变为文件下载
         */
        ctx.addZuulResponseHeader("Content-Type", "application/octet-stream");
        ctx.addZuulResponseHeader("Content-Disposition", "attachment;fileName=" + info);
        ctx.addZuulResponseHeader("Content-Length", ""+info_size);

4 ZuulFilter 修改请求头

1 对 含有token头的request 进行拦截

2 springsecurity 负责将 sessionid 放在 request 的attribute中

3 filter 负责修改请求头,将session 加到向微服务的请求head中

package com.crazymaker.springcloud.cloud.center.zuul.config;

import com.crazymaker.springcloud.common.constants.SessionConstants;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class ModifyRequestHeaderFilter extends ZuulFilter {

    @Override
    public boolean shouldFilter() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        String uri = request.getRequestURI();
        /**
         * 根据条件去判断是否需要路由,是否需要执行该过滤器
         */
        String token = request.getHeader(SessionConstants.AUTHORIZATION);
        log.info("token=" + token);
        if (!StringUtils.isEmpty(token) ) {
            return true;
        }
        return false;
    }

    /**
     * 修改请求头
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();

        String sessionSeed = (String) request.getAttribute(SessionConstants.SESSION_SEED);
        log.info("sessionSeed=" + sessionSeed);

        ctx.addZuulRequestHeader(SessionConstants.SESSION_SEED,sessionSeed);

//        response.addHeader(SessionConstants.SESSION_SEED, sessionId);
        return null;

    }

    @Override
    public String filterType() {
        return FilterConstants.PRE_TYPE;
    }

    @Override
    public int filterOrder() {
        return 1;
    }

}

5 token到 sessionid

由 springsecurity 负责token的验证,然后从token提取 sessionid,并且 放在 request 的attribute中。

具体,请关注 Java 高并发研习社群博客园 总入口



最后,介绍一下疯狂创客圈:疯狂创客圈,一个Java 高并发研习社群博客园 总入口

疯狂创客圈,倾力推出:面试必备 + 面试必备 + 面试必备 的基础原理+实战 书籍 《Netty Zookeeper Redis 高并发实战


疯狂创客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战
  • Netty 源码、原理、JAVA NIO 原理
  • Java 面试题 一网打尽
  • 疯狂创客圈 【 博客园 总入口 】

疯狂创客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战
  • Netty 源码、原理、JAVA NIO 原理
  • Java 面试题 一网打尽
  • 疯狂创客圈 【 博客园 总入口 】


Zuul 修改 请求头、响应头 (死磕)

原文地址:https://www.cnblogs.com/crazymakercircle/p/12037587.html

时间: 2024-10-27 09:10:48

Zuul 修改 请求头、响应头 (死磕)的相关文章

Fiddler如何自动修改请求和响应包

Charles的Map功能可以将某个请求进行重定向,用重定向的内容响应请求的内容.这个功能非常方便.在抓包过程当中,有时候为了调试方便,需要将线上的服务定位到内网.比如我们线上的服务器域名为 api.example.com,而内网的用于调试的服务器域名为 test.neiwang.com,那么就需要将所有域名 api.example.com替换为 test.neiwang.com,就可以使用charles的这个功能,但是charles是收费软件,使用破解版又可能不安全,所以我们需要用一款免费抓包

fiddler 设置断点修改请求,响应数据及模拟响应

在测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以使用fiddler进行此类操作.可以使用断点功能完成. 一.修改请求数据 在发起请求后,需要修改请求的数据时,可以设置请求前设置断点 (1.设置请求前断点 Rules--Automatic breakpoints--before request(或者按F11键) 这种方式的断点会对所有请求生效 或者 在命令行中,输入bpu 域名 这种方式只会对配置的域名添加断点,访问其他的可以正常访问,不会有断点 (2.选中请求,进入I

HTTP 请求头 &amp; 响应头

HTTP请求头概述 HTTP客户程序(例如浏览器),向服务器发送请求的时候必须指明请求类型(一般是GET或者POST).如有必要,客户程序还可以选择发送其他的请求头.大多数请求头并不是必需的, 但Content-Length除外.对于POST请求来说Content-Length必须出现. 下面是一些最常见的请求头 Accept:浏览器可接受的MIME类型. Accept-Charset:浏览器可接受的字符集. Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip.Ser

http请求头响应头及状态码列表

HTTP响应头和请求头信息对照表 HTTP请求头提供了关于请求,响应或者其他的发送实体的信息.HTTP的头信息包括通用头.请求头.响应头和实体头四个部分.每个头域由一个域名,冒号(:)和域值三部分组成. 通用头标:即可用于请求,也可用于响应,是作为一个整体而不是特定资源与事务相关联. 请求头标:允许客户端传递关于自身的信息和希望的响应形式. 响应头标:服务器和于传递自身信息的响应. 实体头标:定义被传送资源的信息.即可用于请求,也可用于响应. 根据以上分类的HTTP请求头介绍可以参考此文,本工具

Fiddler修改请求或响应内容

1.修改请求内容 方法一:设置请求前断点,修改请求后发送 1)设置断点 2)选中请求,在inspectors下修改请求内容 3)修改请求后,点击Break on Response按钮,进行请求的发送 4)点击Run to Completion,将响应结果返回 说明,只修改请求内容可跳过第3步,直接进行第4步操作 方法二:重发请求时修改请求参数,修改后发送请求 2.修改响应结果 方法一:修改请求参数后修改响应结果 修改请求参数-->点击Break on Response-->修改响应结果--&g

curl/wget 测试http请求的响应头信息

1. wget –debug wget可以使用debug信息来查看信息头,如下: [[email protected] ~]# wget --debug http://192.168.112.129/index.html DEBUG output created by Wget 1.12 on linux-gnu. --2017-06-01 10:15:12--  http://192.168.112.129/index.html Connecting to 192.168.112.129:80

Android系列之网络(二)----HTTP请求头与响应头

?[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4005034.html 联系方式:[email protected] [正文] 国庆佳节,习惯并享受着一个人独霸整个教研室的感觉. 在上一篇文章中,我们学习到了如何使用HttpClient发送HTTP请求.博文链接: Android系列之网络(一)----使用HttpClient发送HTTP请求

网络编程之Http请求头与响应头

(一)概述 上节中我们对Android涉及的网络编程进行了了解,也学习了下Http的基本概念,而本节我们 要学习的是Http的请求头与响应头: (二)HTTP请求与响应头 这里贴下上一节给出的图,根据下面给出的表,大家自己感受下相关请求头的作用吧: PS:第一行是请求行:请求方式 + 资源名称 + HTTP协议版本号,另外请求头只是给服务端的一个 信息而已或者说一个简单,至于怎么处理,还是由服务端来决定的! HTTP Request Header请求头信息对照表: 2.HTTP响应之响应头: 同

常用的HTTP请求头与响应头

HTTP消息头是指,在超文本传输协议( Hypertext Transfer Protocol ,HTTP)的请求和响应消息中,协议头部分的那些组件.HTTP消息头用来准确描述正在获取的资源.服务器或者客户端的行为,定义了HTTP事务中的具体操作参数. HTTP消息头是在,客户端请求(Request)或服务器响应(Response)时传递的,位请求或响应的第一行,HTTP消息体(请求或响应的内容)是其后传输.HTTP消息头,以明文的字符串格式传送,是以冒号分隔的键/值对,如:Accept-Cha