先说一下出现这种情况的场景。该场景在使用jetty,tomcat作为容器时是可以正常运行的。首先是表单提交。
<form id="submitForm" action="${base}/test/aa.html" method="post">
<input type="hidden" name="userSource" value="admin"/>
<input type="hidden" id="hid_modulus" name="modulus" value="$!{modulus}"/>
</form>
springmvc控制器代码如下:
@RequestMapping("test")
@Controller
public class TestController {
@RequestMapping("aa.html")
public String aa(Model model, RedirectAttributes redirectAttributes) {
redirectAttributes.addAttribute("a","李四");
return "redirect:bb.html";
}
@RequestMapping("bb.html")
public String bb(Model model, HttpServletRequest request) {
String a=request.getParameter("a");
return "login";
}
}
aa方法做了一次重定向,重定向时传参是中文,到进入bb方法时,获取到的string a则为乱码。
查看项目已使用了spring提供的字符集设置过滤器CharacterEncodingFilter。强制设置字符集为utf-8。却依然出现乱码问题。
没办法,只能查看springmvc的源码。跟踪源码后发现,在RedirectView类的createTargetUrl方法里,会去为重定向拼装url字符串:
protected final String createTargetUrl(Map<String, Object> model, HttpServletRequest request)
throws UnsupportedEncodingException {
// Prepare target URL.
StringBuilder targetUrl = new StringBuilder();
if (this.contextRelative && getUrl().startsWith("/")) {
// Do not apply context path to relative URLs.
targetUrl.append(request.getContextPath());
}
targetUrl.append(getUrl());
String enc = this.encodingScheme;
if (enc == null) {
enc = request.getCharacterEncoding();
}
if (enc == null) {
enc = WebUtils.DEFAULT_CHARACTER_ENCODING;
}
if (this.expandUriTemplateVariables && StringUtils.hasText(targetUrl)) {
Map<String, String> variables =