添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
侠义非凡的大象  ·  OSError: [WinError ...·  1 年前    · 
爱搭讪的桔子  ·  iphone - An ...·  1 年前    · 
逃跑的槟榔  ·  Liver function tests ...·  1 年前    · 

文章很长,而且持续更新,建议收藏起来,慢慢读! 疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 :

免费赠送 : 《尼恩Java面试宝典》 持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备
免费赠送 经典图书: 《Java高并发核心编程(卷1)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书: 《Java高并发核心编程(卷2)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书: 《Java高并发核心编程(卷3)加强版》 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 经典图书: 尼恩Java面试宝典 最新版 面试必备 + 大厂必备 +涨薪必备 加尼恩免费领
免费赠送 资源宝库: Java 必备 百度网盘资源大合集 价值 >10000元 加尼恩领取

Zuul 修改请求头、响应头的场景

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

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

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取: 语雀 或者 码云

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);

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云

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中。

说明:本文会以pdf格式持续更新,更多最新尼恩3高pdf笔记,请从下面的链接获取:语雀 或者 码云