關於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

相關文章
相關標籤/搜索