系统为:tomcat, Spring+Spring MVC+freemarker
由于tomcat上有许多应用,不能修改connector属性URIEncoding为UTF8,所以freemarker中使用${RequestParameters["fn"]}得到中文字符。
我目前的解决办法是在controller里拿到parameter,并转码,然后储存在一个map里,返回到页面上。请问有什么其他办法吗?
采用另外一种办法,你看试试行不。你扩展一个HttpServletRequestWrapper 类,在子类里面重载getParameter方法:
[code="java"]
class ParametersWrapper extends HttpServletRequestWrapper {
public String getParameter(String name) {
String val = super.getParameter(name);//这里返回的是乱码
//然后你自己通过转码,返回正确的字符
return new String(val.getBytes("iso-859-1") , "xxx");//xxx,你转换的编码
}
}
[/code]
然后通过一个过滤器拦截所有请求,对GET请求进行request替换:
[code="java"]
public class EncodingFilter implements Filter {
public void doFilter(ServletRequest sreq, ServletResponse sres, FilterChain fc) throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) sreq;
final HttpServletResponse res = (HttpServletResponse) sres;
if (req.getMethod() == "GET") {
fc.doFilter(new ParametersWrapper(req), res);
}else {
fc.doFilter(wrapper, res);
}
}
}
[/code]
再架一台tomcat
我觉得也没什么好的办法了,如果你的请求是“GET”的话,encodingFilter对这些参数是不启作用的,除非你能改用“POST”。
另外一个方法,就是你用spring的拦截器去拦截
[code="java"]${RequestParameters["fn"]}[/code]
的调用过程,然后转码。不过,这个只是我的想法,没实践过。