文章很长,建议收藏起来,慢慢读! 备注:持续更新中.....
- 疯狂创客圈 经典图书 : 《Netty Zookeeper Redis 高并发实战》 面试必备 + 大厂必备 + 涨薪必备
- 疯狂创客圈 经典图书 : 《SpringCloud、Nginx高并发核心编程》 面试必备 + 大厂必备 + 涨薪必备
- 疯狂创客圈 价值1000元 百度网盘资源大礼包,免费拿 【博客园总入口 】
| 搞定下面这些面试题,2021春招月薪过5万(猛!) | 阿里、京东、美团、头条.... 随意挑、横着走!!! |
|---|---|
| Java基础 | |
| 1: JVM面试题(史上最强、持续更新、吐血推荐) | https://www.cnblogs.com/crazymakercircle/p/14365820.html |
| 2:Java基础面试题(史上最全、持续更新、吐血推荐) | https://www.cnblogs.com/crazymakercircle/p/14366081.html |
| 3:死锁面试题(史上最强、持续更新) | [https://www.cnblogs.com/crazymakercircle/p/14323919.html] |
| 4:设计模式面试题 (史上最全、持续更新、吐血推荐) | https://www.cnblogs.com/crazymakercircle/p/14367101.html |
| 5:架构设计面试题 (史上最全、持续更新、吐血推荐) | https://www.cnblogs.com/crazymakercircle/p/14367907.html |
| 还有 10 几篇 篇价值连城 的面试题 | 具体..... 请参见【 疯狂创客圈 高并发 总目录 】 |
万字长文: 疯狂创客圈 springCloud 高并发系列
| springCloud 高质量 博文 | |
|---|---|
| nacos 实战(史上最全) | sentinel (史上最全+入门教程) |
| springcloud + webflux 高并发实战 | Webflux(史上最全) |
| SpringCloud gateway (史上最全) | |
| 还有 10 几篇 万字长文 的高质量 博文 | 具体..... 请参见【 疯狂创客圈 高并发 总目录 】 |
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高并发研习社群,为大家开启大厂之门