主頁面正常,<jsp:include> 或 `<%@ include %>` 引入的片段出現亂碼。
Tomcat 預設使用 ISO-8859-1 編碼解析 Include 片段,無法正確依據外層 JSP 的 pageEncoding 解析內層中文。
jasper-compiler.jar、jasper-runtime.jar(位於 common/lib)與其他相關 Jar(位於 server/lib)。表單 POST/GET 提交的中文參數在 Servlet 端接收為亂碼。
Tomcat 接收請求時未能依請求資訊正確預設編碼。
package filters;
import java.io.IOException;
import javax.servlet.*;
public class SetCharacterEncodingFilter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void destroy() { encoding = null; filterConfig = null; }
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
if (ignore || (request.getCharacterEncoding() == null)) {
String enc = selectEncoding(request);
if (enc != null) request.setCharacterEncoding(enc);
}
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
this.encoding = filterConfig.getInitParameter("encoding");
String value = filterConfig.getInitParameter("ignore");
if (value == null) this.ignore = true;
else if (value.equalsIgnoreCase("true")) this.ignore = true;
else if (value.equalsIgnoreCase("yes")) this.ignore = true;
else this.ignore = false;
}
protected String selectEncoding(ServletRequest request) { return this.encoding; }
}
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>