大家好,又见面了,我是你们的朋友全栈君。
转:https://segmentfault.com/a/1190000006184156
前人就有的经验
在开发java web应用的时候经常会遇到令人头痛的字符编码问题,期中一个就是客户端发送过来的请求的编码在请求头里并没有,开发人员需要在后端自己选择合适的encoding来解析request过来的参数。
这个问题的解决办法很简单,就是写一个filter来过滤所有请求,然后设置一下request的characterEncoding,比如:
public class CharacterEncodingFilter implements Filter {
protected String encoding = "utf-8";
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding(encoding);
chain.doFilter(request, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
String initEncoding = filterConfig.getInitParameter("encoding");
if (Strings.isNotBlank(initEncoding)) {
this.encoding = initEncoding;
}
}
public void destroy() {
encoding = null;
}
}
把这个filter在web.xml里配置一下所拦截的url pattern就行了。
但是这里有个陷阱,整个web应用里,这个filter的拦截顺序必须是第一个,否则还是会出现乱码问题。这是因为(至少在tomcat里):
-
request对象的parameter并不是一开始就解析的,它是等你第一次调用
getParameter*
等凡和获得请求参数有关的方法的时候才解析的 -
paramter一旦被解析过一次,那就不会再次被解析
所以如果在CharacterEncodingFilter
之前有另外一个filter,而这个filter调用了getParameter*
方法,那么就有可能使用错误的encoding来解析,从而造成乱码问题。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/158270.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...