Servlet过滤器实现请求乱码处理

Filter

1. 过滤器实现步骤

  1. 创建类,实现javax.servlet.Filter接口
  2. 在类上使用@WebFilter("/xxx")配置拦截路径
  3. 实现Filter接口的init、doFilter、destroy方法
  4. 示例如下:
@WebFilter("/s01") //"/*"拦截所有资源
public class Filter01 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("filter01 init...");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //doFilter() 放行方法前做请求拦截
        System.out.println("filter01 正在拦截");
        //放行资源
        filterChain.doFilter(servletRequest, servletResponse);
        //doFilter() 放行方法后去做响应拦截
        System.out.println("filter01 处理响应");
    }

    @Override
    public void destroy() {
        System.out.println("filter01 destroy");
    }
}

2. 使用过滤器解决请求乱码问题

  1. 如何处理:
处理POST请求
	request.setCharacterEncoding("UTF-8");
处理GET请求
	得到服务器的版本信息
	判断Tomcat版本是否小于8
	小于8时处理乱码
		new String(request.getParameter("参数名").getBytes("ISO-8859-1"), "UTF-8");
  1. 实现如下:
@WebFilter("/*")
public class AEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {}

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        //处理请求乱码(POST)
        request.setCharacterEncoding("UTF-8");

        //处理GET请求且服务器版本在Tomcat8以下
        String method = request.getMethod();
        //如果是GET请求
        if ("GET".equalsIgnoreCase(method)) {
            //服务器版本在Tomcat8以下的	Apache Tomcat/9.0.53
            String serverInfo = request.getServletContext().getServerInfo();
            //得到具体的版本号
            int version = Integer.parseInt(serverInfo.substring(serverInfo.indexOf("/") + 1, serverInfo.indexOf(".")));
            //判断服务器版本是否小于8
            if (version < 8) {
                HttpServletRequest myRequest = new MyWapper(request);
                System.out.println(myRequest.getParameter("name"));
                //放行资源
                filterChain.doFilter(myRequest, response);
                return;
            }
        }
        //放行资源
        filterChain.doFilter(request, response);
    }

    @Override
    public void destroy() {}
}

MyWrapper:

public class MyWapper extends HttpServletRequestWrapper {

    public MyWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String parameter = super.getParameter(name);
        if (parameter != null && !"".equals(parameter.trim())) {
            return new String(parameter.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
        }

        return parameter;
    }
}

HttpServletRequestWrapper继承了ServletRequestWrapper,实现了HttpServletRequest接口,只要自定义Wrapper,继承HttpServletRequestWrapper类,重写其中的getParameter方法,就能解决乱码问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值