关于Spring Cloud Zuul网管上传文件乱码问题

Spring Cloud Zuul如今对于上传文件有两种处理方式,一种是用spring mvc,另外一种是zuulServlet。spring mvc对文件处理不是很好,会致使乱码问题,zuulServlet则不会。spring

那么怎么样让文件使用zuulServlet方式上传呢?如今广泛的解决方案是给url加上 /zuul的前缀,这确实是正确的,由于加了以后过滤器会使用zuulServlet。mvc

关于过滤器的知识,下面这个连接解释的挺详细了
http://blog.didispace.com/spr...app

在过滤器中,有一个pre的过滤器 ServletDetectionFilter,他的执行顺序是-3,也是最早执行的过滤器,在这个过滤器中,有这么一段代码:ide

@Override
public Object run() {
    RequestContext ctx = RequestContext.getCurrentContext();
    HttpServletRequest request = ctx.getRequest();
    if (!(request instanceof HttpServletRequestWrapper) 
            && isDispatcherServletRequest(request)) {
        ctx.set(IS_DISPATCHER_SERVLET_REQUEST_KEY, true);
    } else {
        ctx.set(IS_DISPATCHER_SERVLET_REQUEST_KEY, false);
    }

    return null;
}

在这个方法中,IS_DISPATCHER_SERVLET_REQUEST_KEY为false就会用ZuulServlet处理。若是没加/zuul前缀,IS_DISPATCHER_SERVLET_REQUEST_KEY就会置为true,就会用spring mvc上传。会出现乱码问题。url

那么咱们的一个解决方案是在在进入下一个过滤器以前咱们就把咱们的文件上传的请求用ZuulServlet处理,因此咱们能够重写这个方法,根据contentType判断请求若是是multipart就将IS_DISPATCHER_SERVLET_REQUEST_KEY置为false,那么它就会用ZuulServlet处理。spa

到这里尚未结束,还有一个很坑的地方,在最后之前pre过滤器中,他会对url进行处理。若是该请求是ZuulServlet处理的,那么他会把url的前面几位用的zuulServletPath替代,zuulServletPath默认就是刚才咱们替代的前缀 /zuul。那么若是你不处理的话,你的请求路径将会变化。因此在这里咱们将这个默认的zuulServletPath改为空值,就不会替换啦。在配置文件里面加上:
zuul.servletPath:
后面的值不填。
到这里,问题算是结束了,最后把咱们重写的那个方法注入到spring。code

相关文章
相关标签/搜索