过滤器解决request和response乱码问题核心代码

package com.itheima.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 javax.servlet.http.HttpServletResponse;


public class EncodingFilter implements Filter {


public void destroy() {
}


public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filterChain) throws IOException, ServletException {
// 过滤器的步骤
// 1.将request和response对象强转为HttpServletRequest和HttpServletResponse对象
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
// 2.处理
// 解决response的乱码问题
resp.setContentType("text/html,charset:UTF-8");
// 解决request的提交乱码问题
// 保证所有的request方法获取的数据都需要解决乱码问题,增强request方法,可以使用继承或者装饰模式
// 采用装饰设计模式来增强某对象的方法
req = new MyRequest(req);
//解决response乱码问题
resp.setContentType("text/html,charset:UTF-8");
// 3.放行
filterChain.doFilter(req, resp);
}


public void init(FilterConfig arg0) throws ServletException {
}


// 装饰设计模式的几个步骤
/*
* 1.实现目标对象的接口,获取该对象接口的所有方法 2.获取一个该目标对象的类型对象用来接收目标对象 3.创建构造参数将该对象作为参数传递进来
* 4.将不需要变动的方法,调用目标对象来完成 5.将需要增强的方法根据需求改写方法
*/
class MyRequest extends HttpServletRequestWrapper {


// 调用HttpServletRequest的适配器来改写
// 第二步,创建目标对象的类型对象接收
HttpServletRequest request;


// HttpServletRequestWrapper没有无参构造,改写其有参构造
public MyRequest(HttpServletRequest request) {
super(request);
// 将目标对象传递进来
this.request = request;
}


// 改写需要增强的方法
// 三个方法需要改写,只需要改写一个,其他调用就可以了
boolean flag = true;


public String getParameter(String name) {//调用getParameterMap转码
Map<String, String[]> parameterMap = getParameterMap();
if (parameterMap.get(name) == null) {//防止出现空指针异常
return null;
} else {
return parameterMap.get(name)[0];
}
}


public String[] getParameterValues(String name) {//调用getParameterMap转码
Map<String, String[]> parameterMap = getParameterMap();
return parameterMap.get(name);
}
@SuppressWarnings("unchecked")
@ Override
public Map<String, String[]> getParameterMap(){
// 获取map的值后将值全部从新编码解决乱码
Map<String, String[]> map = request.getParameterMap();
if (flag) {//加入开关标记,防止第二次调用后将已经转码的数据再次进行转码后乱码...(map一次就将所有一次请求中的参数修改了)
for (Entry<String, String[]> entry : map.entrySet()) {
//不能使用foreach循环对数组或者集合中的内容进行遍历修改,修改是无效的(参数相当于方法中传递的形式参数,重新给参数赋值)
/*for (String value : entry.getValue()) {
try {
value = new String(value.getBytes("ISO-8859-1"),
"UTF-8");
System.out.println(value);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}*/
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) {
e.printStackTrace();
}
}

}
flag=false;
}
return map;


}
}


}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值