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

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

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

  修改请求路径:

    

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. Transform.eulerAngles 欧拉角

    var eulerAngles : Vector3 Description描述 The rotation as Euler angles in degrees. 旋转作为欧拉角度. The x, y, ...

  2. Linux下的非阻塞IO(一)

    非阻塞IO是相对于传统的阻塞IO而言的. 我们首先需要搞清楚,什么是阻塞IO.APUE指出,系统调用分为两类,低速系统调用和其他,其中低速系统调用是可能会使进程永远阻塞的一类系统调用.但是与磁盘IO有 ...

  3. 自己如何正确获取MYSQL的ADO连接字符串

    1.下载安装MYSQL的ODBC数据库驱动程序(mysql-connector-odbc-5.3.4-win32.msi或者mysql-connector-odbc-5.3.4-winx64.msi) ...

  4. C连接MySql

    连接数据库connect.c #include <stdio.h> #include <mysql/mysql.h> int main() { //MYSQL句柄 MYSQL ...

  5. 51单片机 | 并行I/O口扩展实例(74LS244/74LS373/4071)

    并行I/O口扩展实例 //<51单片机原理及应用(第二版)——基于Keil C与Proteus>第四章例4.4 I/O口不能完全用于输入/输出操作,当需要扩展外部存储器时,P0.P2口用作 ...

  6. SlidingMenu+Fragment实现当前最流行的侧滑

    1 http://www.krislq.com/2013/03/android_case_slidingmenu_fragment/ 2 https://github.com/jfeinstein10 ...

  7. 工作总结 1 sql写法 insert into select from 2 vs中 obj文件和bin文件 3 npoi 模板copy CopySheet 最好先全部Copy完后 再根据生成sheet写数据 4 sheet.CopyRow(rowsindex, rowsindex + x); 5 npoi 复制模板如果出现单元格显示问题

    我们可以从一个表中复制所有的列插入到另一个已存在的表中: INSERT INTO table2SELECT * FROM table1; 或者我们可以只复制希望的列插入到另一个已存在的表中: INSE ...

  8. Windows2008RC2 IIS配置php执行环境

    1:下载一个php manager,安装.打开IIS管理器后,点击计算机,就能够看到右边PHPManager 静静地躺在那儿了.双击PHPManager    后我们就能够開始对PHP进行配置了. 2 ...

  9. 用VS2010创建三层架构开发模式及三层架构的研究

    三层架构的研究 三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(DAL) BLL将USL与DAL隔开了,并且加入了业务规则   各层的作用 1:数据数据访问层:主要是对 ...

  10. SpringCloud系列二:硬编码实现简单的服务提供者与服务消费者

    从本文开始,以一个电影售票系统为例讲解Spring Cloud 1. 版本 jdk:1.8 SpringBoot:2.0.0.RELEASE SpringCloud:Finchley.M8 2. 系统 ...