springmvc中@RequestParam传值中文乱码问题
程序员文章站
2022-05-30 23:39:12
...
传值的方式有get请求和post请求两类
对于GET请求
中文乱码问题是Tomcat服务器的编译导致的,Tomcat默认的编码是ISO8859-1。所以解决GET请求传值中文乱码的问题可以从Tomcat和自己写的代码两个方向来解决
更改Tomcat配置解决
在tomcat中server.xml中加上一个 URIEncoding=”utf-8”
<Connector connectionTimeout="20000" port="8000" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
代码解决
GET请求传值的方式有两种,一种是http://xxx/yy?param=ZZZ,一种是RESTful的:http://xxx/yy/哈哈哈
对于第一种,可以通过一个工具类来转换编码,核心是String类的构造方法String(byte[] bytes, Charset charset)
public class CodingTool{
public static String encodingStr(String str) {
try {
return new String(str.getBytes("ISO8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
}
@RequestMapping(value="/yy")
public ModelAndView method(
@RequestParam("param")String param) {
ModelAndView mav = new ModelAndView();
mv.addObject("param", CodingTool.encodingStr(param)); //转码
mv.setViewName("/aaa");
return mav;
}
或者直接写
@RequestMapping(value="/yy")
public ModelAndView method(
@RequestParam("param")String param) throws UnsupportedEncodingException{
ModelAndView mav = new ModelAndView();
mv.addObject("param", new String(param.getBytes("ISO8859-1"),"UTF-8")); //转码
mv.setViewName("/aaa");
return mav;
}
对于第二种,按照https://blog.csdn.net/andong154564667/article/details/51680462的说法,直接按照相应的格式编写即可,不存在乱码的问题,但是我写还是会出现乱码
http://xxx/yyy/张三
@RequestMapping(value="/yyy/{param}")
public String getUserById0(@PathVariable("param")String param) {
ModelAndView mv = new ModelAndView();
mv.addObject("param", param);
mv.setViewName("/aaa");
return mv;
}
对于POST请求
在web.xml文件中添加如下代码。但这种方法只能解决post请求的中文乱码问题,而目前好像很少有看到问POST请求乱码问题的
<!-- 字符编码过滤器 :
只负责解决POST请求乱码问题.
-->
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>