java web字符乱码过滤器

一个自己常用的字符过滤器

//一个网上下载的工具包,调用的方法可以自己手写
import cn.hutool.core.util.StrUtil;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/*
*                
*
* 请求乱码解法
* 乱码原因:
*      服务器默认的解析编码为ISO-8859-1,不支持中文
* 乱码情况:
*      POST请求
*          Tomcat7及以下版本  乱码
*          Tomcat8及以上版本  乱码
*      GET请求
*          Tomcat7及以下版本  乱码
*          Tomcat8及以下版本  不乱码
*
*     解决方案:
*        POST请求:
*            无论是什么版本的服务器,都会出现乱码;需要通过request.setCharcterEncoding("UTF-8")设置编码格式。(只针对于post有效)
*        GET请求
*            Tomcat8及以上版本,不会乱码,不需要处理
*            Tomcat7及以下版本,需要单独处理
*                    new String(request.getParamater("xxx").getBytes("ISO-8859-1","UTF-8"));
*
* */
//@WebFilter("/*")//过滤所有资源
public class EncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }

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

        //处理POST请求(只针对POST有效,GET请求不受影响)
        request.setCharacterEncoding("UTF-8");

        //处理请求类型(GET|POST)
        String method = request.getMethod();
        //如果是GET请求,则判断服务器版本
        if ("GET".equalsIgnoreCase(method)){//忽略大小写
            //得到服务器版本
            String serverInfo = request.getServletContext().getServerInfo();
            //通过截取字符串,得到具体的版本号
            String version = serverInfo.substring(serverInfo.lastIndexOf("/")+1,serverInfo.indexOf("."));
            //判断服务器版本是否是Tomcat7及以下
            if(version!=null && Integer.parseInt(version)<8){
                //Tomcat及以下版本的服务器的GET请求
                Mywapper mywapper = new Mywapper(request);
                //放行资源
                filterChain.doFilter(mywapper,response);
                return;
            }


        }

        filterChain.doFilter(request,response);
    }

    /*
    *1.定义内部类 (类的本质request对象)
    *2.继承HttpServletRequestWrapper包装类
    *3.重写getarameterP()方法
    * */
    class Mywapper extends HttpServletRequestWrapper {
        //定义一个成员变量 HttpServletRequest对象  (提升构造器中request对象的作用域)
        private HttpServletRequest request;

        /*
        * 带参构造
        * 可以得到需要处理的request对象
        * */
        public Mywapper(HttpServletRequest request){
            super(request);
            this.request = request;
        }

        /*
        * 重写getParameter方法,处理乱码问题
        *
        * */
        @Override
        public String getParameter(String name) {
            //获取参数(乱码的参数值)
            String value = request.getParameter(name);
            //判断参数是否为空
            if(StrUtil.isBlank(value)){
                return value;
            }
            //通过new String()处理乱码
            try{
                value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
            }catch (Exception e){
                e.printStackTrace();
            }
            return value;
        }
    }
}

hutool工具jar包的提取链接与提取码
提取链接:百度网盘 请输入提取码 提取码:gtfj

这是在B站上找资料时对着视频敲,如有冒犯,请告知!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值