springcloud zuul 使用zuulfilter 修改请求路径和响应头

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

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

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

  修改请求路径:

    

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 { // 下面是资源地址 // :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; } }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzjzz.html