Zuul 修改 請求頭、響應頭 (死磕)


瘋狂創客圈 Java 高並發【 億級流量聊天室實戰】實戰系列 【博客園總入口

架構師成長+面試必備之 高並發基礎書籍 【Netty Zookeeper Redis 高並發實戰


前言

Crazy-SpringCloud 微服務腳手架 &視頻介紹

Crazy-SpringCloud 微服務腳手架,是為 Java 微服務開發 入門者 准備的 學習和開發腳手架。並配有一系列的使用教程和視頻,大致如下:

高並發 環境搭建 圖文教程和演示視頻,陸續上線:

中間件 鏈接地址
Linux Redis 安裝(帶視頻) Linux Redis 安裝(帶視頻)
Linux Zookeeper 安裝(帶視頻) Linux Zookeeper 安裝, 帶視頻
Windows Redis 安裝(帶視頻) Windows Redis 安裝(帶視頻)
RabbitMQ 離線安裝(帶視頻) RabbitMQ 離線安裝(帶視頻)
ElasticSearch 安裝, 帶視頻 ElasticSearch 安裝, 帶視頻
Nacos 安裝(帶視頻) Nacos 安裝(帶視頻)

Crazy-SpringCloud 微服務腳手架 圖文教程和演示視頻,陸續上線:

組件 鏈接地址
Eureka Eureka 入門,帶視頻
SpringCloud Config springcloud Config 入門,帶視頻
spring security spring security 原理+實戰
Spring Session SpringSession 獨立使用
分布式 session 基礎 RedisSession (自定義)
重點: springcloud 開發腳手架 springcloud 開發腳手架
SpingSecurity + SpringSession 死磕 (寫作中) SpingSecurity + SpringSession 死磕

小視頻以及所需工具的百度網盤鏈接,請參見 瘋狂創客圈 高並發社群 博客

Zuul 修改請求頭、響應頭的場景

由於 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 高並發實戰

img


瘋狂創客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰

瘋狂創客圈 Java 死磕系列

  • Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM