JavaWeb乱码问题及统一全站编码(通过Filter实现)

本文介绍了一种通过自定义Filter解决Servlet中request和response中文乱码问题的方法,包括Filter的实现代码和配置方式,以及如何统一全站编码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.

 


public class CharacterFilter implements Filter {
    private String characterEncoding = null;
    FilterConfig fc;
    public void init(FilterConfig filterConfig) throws ServletException {
        fc = filterConfig;
        if (null != fc &&
                null != fc.getInitParameter("encoding") &&
                !"".equals(fc.getInitParameter("encoding"))) {
            characterEncoding = fc.getInitParameter("encoding");
        } else {
            characterEncoding = "UTF-8";
        }
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        // 拦截所有的请求 解决全站中文乱码
        // 指定 request 和 response 的编码
        request.setCharacterEncoding(characterEncoding);
        //将response对象中的数据以UTF-8解码后发向浏览器
        response.setCharacterEncoding(characterEncoding);
        //告诉浏览器输出内容为HTML,并使用UTF-8对HTML内容进行解码
        response.setContentType("text/html;charset="+characterEncoding); 
        chain.doFilter(request, response);
    }

    public void destroy() {
    }
}

2.配置Filter,注意编码Filter注册要放到最前面

<filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>com.hbxy.web.c04.filter.CharacterFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping

补充:关千编码问题

在Servlet中,request/response处理中文时,使用默认配置往往会出现乱码,如:

public void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException { 
        OutputStream out = response.getOutputStream();
        String data =“张三”;
        out.write(data.getBytes("UTF-8"));
}

输出乱码的问题是程序用UTF-8编码,而如果浏览器用GB2312解码,会出现乱码

Servlet乱码分为request乱码和response乱码

Response响应乱码解决办法

  • 1response.setCharacterEncoding(“UTF-8”); 用千response.getWriter()输出的字符流的乱码问题,如果是response.getOutputStream()是不需要设置(因为数据里已经进行了编码)
  • 2response.setContentType("text/html;charset=UTF-8"); 是为了控制浏览器的行为,即控制浏览器用UTF-8进行解码
  • 3、建议全站设置统一的编码:JSP/Servlet统一设置成UTF-8或者GBK
  • 也即在FilterResponse设置:
    • response.setCharacterEncoding(“UTF-8”);
    • response.setContentType("text/html;charset=UTF-8");

RequestPOST请求

RequestGET请求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值