使用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;
    }
}

解决HttpServletResponse输出的中文乱码问题

首先,response返回有两种,一种是字节流outputstream,一种是字符流printwrite。 申明:这里为了方便起见,所有输出都统一用UTF-8编码。 先说字节流,要输出“中国"...
  • simon_1
  • simon_1
  • 2013年06月14日 11:51
  • 99867

HttpServletRequestWrapper解决乱码

index.html
  • u010286751
  • u010286751
  • 2014年06月12日 23:45
  • 1421

Servlet 中文乱码问题及解决方案剖析

一、常识了解   1.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.java.nio.charset.Charset.defaultCharset...
  • xiazdong
  • xiazdong
  • 2012年01月28日 23:26
  • 88481

HttpServletWrapper 和 HttpServletResponseWrapper

1 Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象, HttpServletRequestWrapper 类实现了 H...
  • u014695188
  • u014695188
  • 2017年08月29日 23:07
  • 194

servlet中使用HttpServletResponseWrapper截获返回的页面内容

像标题所说的,虽然在在JEE开发中并不常见,但也不是没有需要。比如知名的页面装饰框架sitemesh,就是利用filter过滤器先截获返回给客户端的页面,然后分析html代码并最终装饰页面效果后返回给...
  • zmx729618
  • zmx729618
  • 2016年08月05日 09:32
  • 2615

在filter中使用包装类包装request、response分别修改请求参数和修改响应结果

工作需要,要将请求和响应做一些处理,使得浏览器展示结果可控。 首先是在filter中拦截一些请求,请求到达过滤器的时候,可以通过request获取请求中的一些参数。...
  • lilin_esri
  • lilin_esri
  • 2017年11月24日 16:05
  • 181

Filter(四)常见应用一----解决乱码问题

在之前学习servlet时,当输入中文时,显示有时候会出现乱码问题,其原因是,中文输入时编码方式和显示时解码方式不一致导致的。因此在解决乱码问题时,需要同一编码和解码方式。 在Servlet中,在默认...
  • wliang11
  • wliang11
  • 2013年12月24日 23:25
  • 818

响应封装器(使用HttpServletResponseWrapper实现)

当我们需要对一个响应的内容进行统一处理的时候(比如用户输入内容的非法字符替换,将不文明用语屏蔽),我们很容易想到使用Filter来处理。但是,首先我们无法得到response的内容(可能因为我太菜了,...
  • mymilkbottles
  • mymilkbottles
  • 2017年02月24日 21:09
  • 1208

HttpServletRequestWrapper和HttpServletResponseWrapper详解

Servlet规范中的filter引入了一个功能强大的拦截模式。Filter能在request到达servlet的服务方法之前拦截HttpServletRequest对象,而在服务方法转移控制后又能拦...
  • zhongzh86
  • zhongzh86
  • 2015年05月14日 15:13
  • 5693

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

javaweb中文乱码解决
  • bbb695480667
  • bbb695480667
  • 2016年12月21日 20:27
  • 4424
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Filter和包装模式解决request/response乱码问题
举报原因:
原因补充:

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