使用Filter和包装模式解决request/response乱码问题

转载 2016年04月06日 18:16:30
package filter;
 
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
 
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;
/**
 * 使用此过滤器解决reqeust/response乱码问题
 * @author 马隆博
 */
public class CharacterFilter implements Filter {
    @Override
    public void init(FilterConfig fConfig) throws ServletException {}
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
 
        req.setCharacterEncoding("utf-8");// 解决request乱码
        resp.setContentType("text/html;charset=utf-8"); // 解决response乱码
 
        if ("get".equalsIgnoreCase(request.getMethod())) {
            CharacterRequest characterRequest = new CharacterRequest(request); // 使用包装的request
            chain.doFilter(characterRequest, response);// 放行
            return;
        }
        doFilter(request, response, chain);
    }
 
    @Override
    public void destroy() {}
}
 
/**
 * 包装后的Request
 * @author 马隆博
 */
class CharacterRequest extends HttpServletRequestWrapper {
    public CharacterRequest(HttpServletRequest request) {
        super(request);
    }
 
    @SuppressWarnings("finally")
    private String convertCharacter(String value) {
        String resultValue = value;
        try {
            resultValue = new String(value.getBytes("ISO-8859-1"), "utf-8");//转换为utf-8
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } finally {
            return resultValue;
        }
    }
 
    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);// 调用被包装对象的方法
        if (value != null){
            value = convertCharacter(value);//转换字符
        }
        return value;
    }
 
    @Override
    public Map<String, String[]> getParameterMap() {
        Map<String, String[]> map = super.getParameterMap();
        if (map != null) {
            // 遍历转换字符
            for (String[] values : map.values()) {
                for (String value : values) {
                    value = convertCharacter(value);
                }
            }
        }
        return map;
    }
 
    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values != null) {
            // 遍历转换字符
            for (String value : values) {
                value = convertCharacter(value);
            }
        }
        return values;
    }
}

相关文章推荐

request、response 中文乱码问题与解决方式

request、response 中文乱码问题与解决方式 request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码; response...

request、response 中文乱码问题与解决方式

本文转自http://blog.sina.com.cn/s/blog_ad1c3bdf0102uz99.html   request、response 中文乱码问题与解决方式 request乱码...

关于Filter解决全网乱码问题的总结 --- 包装类 编解码 过滤器

中国的程序猿在编程过程中免不了要解决乱码问题,针对不同的提交方式有不同的解决方式。这两天刚好在学这个知识点,在此做一个简单的小结。首先要明白乱码出现的原因:乱码出现的根本原因是http协议不支持中文在...

request和response的中文乱码问题

request乱码指的是:浏览器向服务器发送的请求参数中包含中文字符,服务器获取到的请求参数的值是乱码; response乱码指的是:服务器向浏览器发送的数据包含中文字符,浏览器中显示的是乱码; ...

中文乱码问题-pageEncoding与charset区别, response和request的setCharacterEncoding 区别

pageEncoding与charset区别 pageEncoding是设置的JSP页面源代码的字符编码格式,如果该项的值是utf-8,则JSP源代码里不能写汉字了,如果你用的是eclipse等工具的...

javaweb中中文乱码解决方法总结之response和request解决方法

javaweb中文乱码解决

Response Request 乱码各种解决 路径的各种写法 登录验证码绘制

Response 1、向浏览器输出数据:response缓冲区为8kb如果超出,会自动将数据刷到浏览器 /** * 两种方式向客户端输出信息 保证不乱码 */ public void s...

使用Filter包装response修改响应内容

关键是要重写response和PirntWriter(或者OutputStream) 重写PirntWriter:package com.xs.servlet.changeresponse; imp...

使用过滤器和request装饰增强来彻底解决乱码问题

在客户端以get或者post方式提交数据时,可能会出现客户端与服务端编码集不匹配而发生乱码的现象。 在对post方式产生的乱码我们可以用         request.setCharacterEn...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Filter和包装模式解决request/response乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)