作者:cjcstc@163.com | 来源:互联网 | 2023-06-15 14:35
如何解决SpringMVC接收到的请求参数为乱码的问题
Get请求
直接设置tomcat目录下conf/server.xml文件,添加编码为utf-8
Post请求
原理
请求参数为乱码主要是因为编码的问题。需要在web配置文件中配置一个过滤器用来过滤请求,对请求进行编码。
假定最初设置的servlet为:
springmvcorg.springframework.web.servlet.DispatcherServlet
需要配置一个过滤器:
characterEncodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingUTF-8forceEncodingtrue
说明:
- filter-name:配置一个过滤器名称后续用来配置filter-mapping
- filter-class:配置过滤器的类
- init-param:用来初始化过滤器类中的变量
- encoding:编码,将过滤器中的encoding变量设置为utf-8
- forceEncoding:是否强制转换。这个原理在这里
然后是配置过滤器需要过滤哪些请求
characterEncodingFilterspringmvc
说明:
- filter-name:过滤器的名称与过滤器中的filter-name匹配
- servlet-name:与servlet中的servlet-name匹配
forceEncoding
在CharacterEncodingFilter中有一个setForceEncoding方法(org.springframework.web.filter.CharacterEncodingFilter#setForceEncoding),他会对变量forceRequestEncoding和forceResponseEncoding进行赋值,代码如下:
public void setForceEncoding(boolean forceEncoding) {this.forceRequestEncoding = forceEncoding;this.forceResponseEncoding = forceEncoding;
}
而在过滤的方法doFilterInternal方法(org.springframework.web.filter.CharacterEncodingFilter#doFilterInternal)中会通过forceRequestEncoding和forceResponseEncoding的值来判断是否需要对请求和响应进行编码:
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {String encoding = this.getEncoding();if (encoding != null) {if (this.isForceRequestEncoding() || request.getCharacterEncoding() == null) {request.setCharacterEncoding(encoding);}if (this.isForceResponseEncoding()) {response.setCharacterEncoding(encoding);}}filterChain.doFilter(request, response);
}