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

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

  • 相关阅读:
    Unable to load the specified metadata resource
    Web开发人员速查卡
    vs 中大括号之间垂直虚线显示
    第4届华为编程大赛决赛试题解答(棋盘覆盖)
    assert()函数用法总结
    Win7安装VC++6.0已知的兼容性问题的解决方法
    VC6打开一个文件或工程的时候,会导致VC6崩溃而关闭
    浮点数取整.
    1.4 VC6.0在win7下安装的兼容性问题以及解决办法
    华为编程大赛_将字符数组内的数字排序
  • 原文地址:https://www.cnblogs.com/blog411032/p/10876967.html
Copyright © 2020-2023  润新知