pdf.js外掛亂碼問題
阿新 • • 發佈:2019-02-02
場景描述:
本問題也是之前談論的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>