1. 程式人生 > >pdf.js外掛亂碼問題

pdf.js外掛亂碼問題

場景描述:

本問題也是之前談論的pdf轉化為圖片的專案,之前有聊到過由於不能正常展示印章而把pdf轉化成了PNG圖片來展示。而其他的條款由於沒有印章這個問題,所以就使用了pdf.js這個外掛進行展示,之前展示的檔名都是用的英文是沒有問題的。但是後來發現ios裡面會展示出來這個名字,被使用者看到後不便於理解,所以就想著要改為中文,那麼問題就來了。

具體操作解決方案

接著說,直接將檔名改成中文後,發現一切並沒有想象的那麼簡單,在載入pdf進行展示的時候發出錯了,404。看裡通過瀏覽器除錯看地址也不是正常的,後在網上查詢資料發現編碼格式有問題,所以就把編碼格式改為了gb2312。本地驗證通過,心裡挺高興的,但是等我把程式碼釋出到測試環境就由出現了問題。真是太奇葩了,奇葩年年有,今年特別多啊。
說一下本地和測試環境的差別吧,本地單機一個tomcat,測試環境是兩臺機器,F5負載均衡,然後還用了nginx做跳轉。後來同事就說加個過濾器轉碼試試,想了想這個方法行得通,然後就開工了。加了一個過濾器,在過濾器中將請求地址列印了出來,然後進行轉碼再打印出來,經過和本地對比發現沒有什麼區別,但是為嘛就是本地不用filter轉化再forward就可以,而測試環境就不行。感覺是跟F5和nginx有關係,但是就是不知道什麼情況。還望有大神能解惑一下……
而且nginx 預設的不是charset utf-8;嗎,但是我顯式的寫了這個就又亂碼了,鬱悶。
Filter程式碼

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        request.setCharacterEncoding("utf-8");
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String url = httpRequest.getRequestURL
().toString(); logger.info("url地址原始" + url); url = java.net.URLDecoder.decode(url, "UTF-8"); logger.info("url地址解碼後" + url); httpRequest.getRequestDispatcher(url.substring(url.lastIndexOf("/") + 1)).forward(request, response); //httpResponse.sendRedirect(url); //chain.doFilter
(request, response); }

配置如下

<filter>
        <filter-name>urlFilter</filter-name>
        <filter-class>com.test.UrlFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>urlFilter</filter-name>
        <url-pattern>*.pdf</url-pattern>
    </filter-mapping>