get請求亂碼
當get請求出現亂碼,只需要到tomcat的conf目錄下修改server.xml文件,在配置端口號的地方,設置端口號后加上,空格
URIEnconding="UTF-8"
post請求亂碼
在web.xml文件中注冊CharacterEncodingFilter過濾器【Spring自帶的】,通過CharacterEncodingFilter過濾器設置請求和響應參數編碼格式。
在CharacterEncodingFilter源碼【一部分】中:
private String encoding; private boolean forceRequestEncoding; private boolean forceResponseEncoding; public CharacterEncodingFilter() { this.forceRequestEncoding = false; this.forceResponseEncoding = false; }
然后在具體處理過濾請求的方法【doFilterInternal】中,可以看見在設置了encoding后就會將請求編碼格式設置為你設置的請求編碼格式。
在下面的判斷中可以發現,當設置了請求參數后,第一個判斷的判斷條件中,它是或判斷,第一個條件默認是false,並沒有對他修改,所以他是false ;第二個條件也沒有設置,他的值為true,最后結果為true,這樣就把請求編碼格式改為UTF-8。
第二個判斷,只有一個條件,就是得你自己在filter的初始化參數中定義【forceResponseEncoding】的值,當定義后,響應的編碼格式就會變成你設置的格式。
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String encoding = this.getEncoding(); if (encoding != null) { if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) { request.setCharacterEncoding(encoding); } if (this.isForceResponseEncoding()) { response.setCharacterEncoding(encoding); } } filterChain.doFilter(request, response); }
設置如下:
<!--設置請求編碼和相應編碼解決post請求的亂碼問題--> <!--使用CharacterEncodingFilter解決亂碼問題,服務器啟動時先初始化監聽器在初始化過濾器,所以這個過濾器設置在哪里都不會影響他的初始化--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--設置請求編碼,通過設置filter初始化參數,告訴CharacterEncodingFilter類修改請求編碼--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!--設置響應編碼,通過設置forceResponseEncoding的值告訴CharacterEncodingFilter類修改相應編碼--> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--過濾的請求是全部請求,所以是 /* --> <url-pattern>/*</url-pattern> </filter-mapping>