瘋狂創客圈 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 高並發實戰》
瘋狂創客圈 Java 死磕系列
- Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰
- Netty 源碼、原理、JAVA NIO 原理
- Java 面試題 一網打盡
- 瘋狂創客圈 【 博客園 總入口 】
瘋狂創客圈 Java 死磕系列
- Java (Netty) 聊天程序【 億級流量】實戰 開源項目實戰
- Netty 源碼、原理、JAVA NIO 原理
- Java 面試題 一網打盡
- 瘋狂創客圈 【 博客園 總入口 】