通用的解决乱码问题(很强大)利用过滤器实现

在一些请求中出现了乱码问题,并且简单的setCharacterEncoding() 等方法和配置web.xml底层提供的过滤器也无法解决时,我们可是使用如下代码解决

package com.kunag.filter;


import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

/**
 * @author CH
 */
public class CharacterFilter implements Filter {

    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        //拦截所有的请求,解决全站中文乱码
        //制定request和response的编码
        request.setCharacterEncoding("utf-8");	//这只对消息体有效,也就是只对post方式的请求参数有效,post方式的请求参数存放在消息体中
        response.setContentType("text/html;charset=utf-8");
        //在放行的时候应给给目标资源一个request对象,让目标资源调用getParameter时调用到我们写的getParameter
        //对这获取到的request进行包装
        CharacterRequest characterRequest = new CharacterRequest (request);

        //这里放行的时候,携带的就是我们包装后的request → characterRequest
        chain.doFilter(characterRequest, response);
    }
    public void destroy() {
    }

    class CharacterRequest extends HttpServletRequestWrapper {
        public CharacterRequest(HttpServletRequest request) {
            super(request);
        }
        //子类继承父类一定会覆写一些方法,此处用于重写getParameter()方法
        public String getParameter(String name) {
            //调用被包装对象的getParameter()方法,获得请求参数
            String value  =  super.getParameter(name);
            if (value == null) {
                return null;
            }

            //判断请求方式
            String method = super.getMethod();
            if ("get".equalsIgnoreCase(method)) {
                try {
                    //iso-8859-1 根据具体情况确定是否是是这种编码
                    value = new String(value.getBytes("iso-8859-1"),"utf-8");
                } catch (UnsupportedEncodingException e) {
                    throw new RuntimeException(e);
                }
            }
            //解决乱码后,返回结果
            return value;
        }
    }
}

配置web.xml使用自定义编写的过滤器,注意修改对应的实现过滤器的路径

<filter>
        <filter-name>CharacterFilter</filter-name>
        <filter-class>com.kunag.filter.CharacterFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值