在用strust2.1.6做小項目,結果居然發現在post數據的時候,居然有亂碼。
自認為對編碼也算了解,立馬check應用的content type,struts2配置的struts.locale,struts.i18n.encoding,沒錯,都是統一使用了UTF-8。
那是為什么呢?沒辦法,只能debug應用,結果發現:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
prepare.setEncodingAndLocale(request, response);
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request, response);
if (mapping == null) {
boolean handled = execute.executeStaticResourceRequest(request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);
}
} finally {
prepare.cleanupRequest(request);
}
}
看到沒?
1)
prepare.createActionContext(request, response);
2) prepare.setEncodingAndLocale(request, response);
setEncodingAndLocale居然在createActionContext之后,在沒有設置正確的encoding之前,解析request中的parameters,能成嗎?
無奈之下,只能暫時用CharacterEncodingFilter這個filter設置request的character,猥瑣地臨時解決問題。
今天打算向Struts提交bug的時候,發現該bug在2.1.7版本中被修復,詳見:https://issues.apache.org/struts/browse/WW-3075%3Bjsessionid=3EAC5B44A949CA77B4471AA0D45754E9?page=com.atlassian.jira.plugin.ext.subversion%3Asubversion-commits-tabpanel
哎,在使用2.1.7之前,先用CharacterEncodingFilter吧 :)