Spring MVC 乱码问题
本文最后更新于:2024年9月8日 晚上
Spring MVC 乱码问题
页面数据乱码
CharacterEncodingFilter
1 2 3 4 5 6 7 8 9 10 11 12
| <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
- 有些极端情况下。该过滤器对get方法的请求的支持不好。
修改tomcat配置文件
1 2 3
| <Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
|
自定义过滤器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
|
public class GenericEncodingFilter implements Filter {
@Override public void destroy() { }
@Override public void doFilter(ServletRequest request, ServletResponse response, FilterChainchain) throws IOException, ServletException { HttpServletResponse myResponse=(HttpServletResponse) response; myResponse.setContentType("text/html;charset=UTF-8");
HttpServletRequest httpServletRequest = (HttpServletRequest) request; HttpServletRequest myrequest = new MyRequest(httpServletRequest); chain.doFilter(myrequest, response); }
@Override public void init(FilterConfig filterConfig) throws ServletException { }
}
class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request; private boolean hasEncode; public MyRequest(HttpServletRequest request) { super(request); this.request = request; }
@Override public Map getParameterMap() { String method = request.getMethod(); if (method.equalsIgnoreCase("post")) { try { request.setCharacterEncoding("utf-8"); return request.getParameterMap(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } else if (method.equalsIgnoreCase("get")) { Map<String, String[]> parameterMap = request.getParameterMap(); if (!hasEncode) { for (String parameterName : parameterMap.keySet()) { String[] values = parameterMap.get(parameterName); if (values != null) { for (int i = 0; i < values.length; i++) { try { values[i] = new String(values[i].getBytes("ISO-8859-1"), "utf-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } } } hasEncode = true; } return parameterMap; } return super.getParameterMap(); }
@Override public String getParameter(String name) { Map<String, String[]> parameterMap = getParameterMap(); String[] values = parameterMap.get(name); if (values == null) { return null; } return values[0]; }
@Override public String[] getParameterValues(String name) { Map<String, String[]> parameterMap = getParameterMap(); String[] values = parameterMap.get(name); return values; } }
|
1 2 3 4 5 6 7 8
| <filter> <filter-name>GenericEncodingFilter</filter-name> <filter-class>package com.example.filter.GenericEncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>GenericEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
|
Json字符串乱码
StringHttpMessageConverter
- StringHttpMessageConverter可以在Spring MVC的配置文件上添加一段消息StringHttpMessageConverter转换配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <constructor-arg value="UTF-8"/> </bean> <beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <beanclass="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"> <property name="failOnEmptyBeans" value="false"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
|