系列文章目录
前言
我们现在用的是Tomcat7
Tomcat7会有什么乱码?
get请求就会有乱码(分析源码可以发现配置的过滤器只对post提交方式有用)
因为浏览器的编码方式和开发软件以及Tomcat7他们之间的编码方式是有差异的
怎么解决呢?
一、解决中文乱码问题
学习CharacterEncodingFilter,这个类是Spring框架给我们提供的类,这个是一个字符编码过滤器
首先我们先来测试一下,get的中文是不是乱码
get的中文是不是乱码测试
action里面要接收参数,这个参数必须得有set方法
如果没有set将会是空
这样就测试完了
确实是乱码,所以我们要怎么做才不乱码呢?
解决get请求的乱码问题
我们需要配置一个字符编码的过滤器,注意,顺序非常重要,即使你配置了,如果顺序不对(写的位置不对)还是不行
在web.xml添加下面的配置
参考
<filter>
<filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这个位置就不对了,我们测试是没有效果的
实际测试还是乱码
我们回想一下,以前我们解决get请求乱码问题是怎么解决的,我们是在request里面做了特殊的处理
在不使用框架的情况下是这样的:https://blog.csdn.net/qq_41753340/article/details/111144534
现在是怎样的呢
我们根据源码可以得知,这段代码能够解决乱码,但是它解决的乱码只是针对post有效,get请求是无效的
如果我们非得解决get请求中文也不乱码怎么处理?
那就得用回我们自己的过滤器
可以找这里的资料
代码如下:
package com.gyf.web.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.catalina.connector.RequestFacade;
public class MyEncodingFilter implements Filter{
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void destroy() {}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//1.璁剧疆POST璇锋眰涓枃涔辩爜鐨勯棶棰?
request.setCharacterEncoding("UTF-8");
System.out.println("鎷︽埅璇锋眰:" + request);
//2.瑙e喅get璇锋眰鐨勪腑鏂囦贡鐮侀棶棰?
//request 锛?RequestFacade;
HttpServletRequest hsr = (HttpServletRequest)request;
if(hsr.getMethod().equalsIgnoreCase("get")){
MyRequest myRequest = new MyRequest(hsr);
//鏀捐璇锋眰
chain.doFilter(myRequest, response);
}else{
chain.doFilter(request, response);
}
}
}
/**
* Wrapper鍖呰绫伙紝瑁呴グ璁捐妯″紡,鍐呴儴鏈変釜鐪熷疄瀵硅薄鐨勫紩鐢?
* @author gyf
*
*/
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private boolean isEncoding = false;//鏄惁宸茬粡utf-8缂栫爜
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
return getParameterMap().get(name)[0];
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> map = request.getParameterMap();
if(isEncoding == true){
return map;
}
//閬嶅巻vlaue锛屾敼鎴恥tf-8缂栫爜
for(Entry<String, String[]> entry : map.entrySet()){
//鍙栨暟缁勫€?
String[] values = entry.getValue();
for(int i=0;i<values.length;i++){
try {
values[i] = new String(values[i].getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
isEncoding = true;
return map;
}
}
直接拷贝文件就好了
这一段去掉就不报错了,可以直接拿来用
所以接下来我们就把它换掉,不要Spring框架自带的,而是用刚刚的代码
然后运行看看
总结
CharacterEncodingFilter只能解决post请求的乱码问题,要想真正解决post乱码问题,需要用我们自己的类