BOS项目01_06_解决中文乱码问题、CharacterEncodingFilter字符编码过滤器 解决get请求中文乱码问题

系列文章目录

前言

我们现在用的是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乱码问题,需要用我们自己的类

猜你喜欢

转载自blog.csdn.net/qq_41753340/article/details/114755797