最近做项目有一个需求:一个网盘系统,文件存放在分布式文件系统中,之前的文件下载统一走的文件下载服务,现在需要在单文件下载的时候不需要走文件下载服务,而是直接访问文件系统上的路径,响应的时候修改响应头,使之变为文件下载(减少文件下载服务的压力)。

分析:该需求有两点;①在网关中路由的时候修改路由地址②响应的时候修改响应头,使之变为文件下载。

直接看网关中的过滤器代码实现:

  修改请求路径:

    

package com.example.demo;

import java.net.URI;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component; import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
/**
* 需求:如果请求路径内包含list请求,则重新路由到指定的接口,路由结束后,修改响应头
*
* @author mxf
*
*/
@Component
public class RequestFilter extends ZuulFilter { @Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String uri = request.getRequestURI();
/**
* 根据条件去判断是否需要路由,是否需要执行该过滤器
*/
if (uri.contains("list")) {
return true;
}
return false;
} @Override
public Object run() throws ZuulException {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletResponse response = ctx.getResponse();
try {
// 下面是资源地址
// http://192.168.16.72:8077/group1/M00/00/03/wKgQSVzHshWAdSpoAAAFsn6csJI682.png
// URI uri2 = new URI(requestURL.substring(0,requestURL.indexOf(requestURI) + 1));
/**
* 重点:因为根据条件去路由新的链接,所以这里要重新设置 RouteHost 和 URI
*/
URI uri2 = new URI("http://192.168.16.72:8077/");
// 设置新的RouteHost
ctx.setRouteHost(uri2.toURL());
/**
* 请求间携带的信息 放在请求头中,方便响应的时候修改响应头
*/
response.addHeader("sign", "target");
response.addHeader("info", "bb.png");
response.addHeader("info_size", "1458");
} catch (Exception e1) {
e1.printStackTrace();
}
// 设置新的URI
ctx.put(FilterConstants.REQUEST_URI_KEY, "group1/M00/00/03/wKgQSVzHshWAdSpoAAAFsn6csJI682.png");
return null;
} @Override
public String filterType() {
return FilterConstants.ROUTE_TYPE;
} @Override
public int filterOrder() {
return 1;
} }

  修改响应头:

package com.example.demo;

import javax.servlet.http.HttpServletResponse;

import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils; import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException; /**
* 根据您条件修改响应头
* @author mxf
*
*/
@Component
public class ResponseFilter extends ZuulFilter{ /**
* 是否执行该过滤器
*/
@Override
public boolean shouldFilter() {
RequestContext currentContext = RequestContext.getCurrentContext();
HttpServletResponse response = currentContext.getResponse();
String sign = response.getHeader("sign");
String info = response.getHeader("info");
String info_size = response.getHeader("info_size"); if (!StringUtils.isEmpty(sign) && !StringUtils.isEmpty(info) && !StringUtils.isEmpty(info_size)) {
return true;
}
return false;
} @Override
public Object run() throws ZuulException {
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);
return null;
} @Override
public String filterType() {
return FilterConstants.POST_TYPE;
} @Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 2;
} }

  从网上找了很多资料,没有相关的信息。所以想记录一下。

springcloud zuul 使用zuulfilter 修改请求路径和响应头的更多相关文章

  1. SpringCloudGateWay修改请求路径,从注册中心获得服务

    SpringCloudGateWay修改请求路径,从注册中心获得服务 @Resource    private DiscoveryClient disClient;    @Resource    p ...

  2. HTTP状态码、请求方法、响应头信息

    HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应 ...

  3. 【Azure 应用服务】App Service 通过配置web.config来添加请求返回的响应头(Response Header)

    问题描述 在Azure App Service上部署了站点,想要在网站的响应头中加一个字段(Cache-Control),并设置为固定值(Cache-Control:no-store) 效果类似于本地 ...

  4. 修改nginx的http响应头server字段

    信息泄露类型:HTTP服务器响应头Server字段信息泄露 示例: 解决: 需要重新对nginx编译安装: [root@localhost ~]# tar zxvf nginx-1.8.1.tar.g ...

  5. jmeter之批量修改请求路径

    今天工作时碰到一个问题:测试环境中由于tomcat没指定webapps下的文件夹名,导致tomcat使用了webapps下默认的文件夹名,而我的jmeter脚本都已经做出来了,一共83个接口,挨个改路 ...

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

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  7. Spring Cloud Gateway修改请求和响应body的内容

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  8. [面试没答上的问题1]http请求,请求头和响应头都有什么信息?

    最近在找工作,面试官问了一些问题自己并没有回答上,这里做一个小结. http请求,请求头和响应头都有什么信息? 页面和服务器交互最常见的方式就是ajax,ajax简单来说是浏览器发送请求到服务端,然后 ...

  9. node.js学习4--------------------- 根据不同路径来响应内容,以及中文乱码的解决

    /** * http服务器的搭建,相当于php中的Apache或者java中的tomcat服务器 */ // 导包 const http=require("http"); //创建 ...

随机推荐

  1. angular controller的一些用法

    最近公司的项目是es6+angular.其中的代码格式还在逐步摸索中.感谢今天同事每天帮我解惑. 今天简单梳理一下controller的一些用法 之前看书所熟知的都是 这是最普通的一种 //html ...

  2. IOS开发通过代码方式使用AutoLayout (NSLayoutConstraint + Masonry) 转载

    http://blog.csdn.net/he_jiabin/article/details/48677911 随着iPhone6/6+设备的上市,如何让手头上的APP适配多种机型多种屏幕尺寸变得尤为 ...

  3. react-navigation + react-native-vector-icons

    1.安装 yarn add react-navigation react-native-vector-icons 2.创建 root.js import React, {Component} from ...

  4. 前端性能优化--为什么DOM操作慢? 浅谈DOM的操作以及性能优化问题-重绘重排 为什么要减少DOM操作 为什么要减少操作DOM

    前端性能优化--为什么DOM操作慢?   作为一个前端,不能不考虑性能问题.对于大多数前端来说,性能优化的方法可能包括以下这些: 减少HTTP请求(合并css.js,雪碧图/base64图片) 压缩( ...

  5. .Net Framework 与 SQL Server 2005 混乱的时间最大最小值

    Net Framewrok 中,DateTime.MinValue => 0001/01/01 00:00:00SqlDateTime.MinValue.Value  => 1753/01 ...

  6. Android新浪微博client(一)——主框架搭建

    原文出自:方杰| http://fangjie.sinaapp.com/?p=62 转载请注明出处 该项目代码已经放到github:https://github.com/JayFang1993/Sin ...

  7. APPLE ID随意转区到US或者HK.不需要信用卡

    看到论坛有封釉想去US 或者HK 的商店下载大陆商店没有的APP.(比如 Tumblr) 但是现在在手机上或者是网页管理apple id 更改地区,需要输入付款信息. 现在教大家利用旧版的icloud ...

  8. MVC进阶学习--View和Controller之间的数据传递(二)

    1. 使用Request.Form MVC 将页面简单化,与WebForm中的事件机制完全不同,就和普通的html标签表单提交没有任何区别(当然WebForm中的事件机制其实也是表单提交).在表单提交 ...

  9. Spring Boot - 配置信息后处理

    最近在做项目的过程中,PSS提出配置文件中类似数据库连接需要的用户名.密码等敏感信息需要加密处理(之前一直是明文的). 为了快速完成任务,网上搜刮到jasypt包,也有相应的starter,使用方法可 ...

  10. CardView的具体使用方法(转)

    转载自:CardView的具体使用方法  因为学习做此记录方便查找使用 今天主要是CardView的用法,CardView是在安卓5.0提出的卡片式控件.首先介绍一下它的配置. 在gradle文件下添 ...