JavaWeb使用Filter、动态代理对客户端请求服务端参数中文乱码解决

一、代理模式
代理模式传送门:博客地址

二、Java动态代理
Java动态代理传送门:博客地址
三、乱码解决思路
对原有的HttpServletRequest类中的getParameter()方法进行增强。

对方法进行增强三种方式:
① 继承,覆盖原有方法(在解决乱码中不可用,HttpServletRequest是TomCat创建)
②装饰设计模式(在解决乱码中可用)
③动态代理(在解决乱码中可用)

四、乱码解决
1、定义Filter

//定义类实现Filter接口
public class EncodingFilter implements Filter

2、web.xml配置

  <filter>
    <display-name>EncodingFilter</display-name>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>cn.itcast.web.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

3、EncodingFilter 类中的代码实现

package cn.itcast.web.filter;

import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

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;

public class EncodingFilter implements Filter {

    public EncodingFilter() {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //需要被增强的目标对象
        HttpServletRequest req = (HttpServletRequest) request;

        String method = req.getMethod();

        if (method.equals("GET")) {

            //代理对象
            HttpServletRequest enhanceRequst = (HttpServletRequest) Proxy.newProxyInstance(
                    /**
                     * req.getClass().getClassLoader()  与目标对象相同的类加载器
                     * req.getClass().getInterfaces()   与目标对象相同的字节码对象数组
                     */
                    req.getClass().getClassLoader(), 
                    req.getClass().getInterfaces(), 
                    new InvocationHandler() {
                        /**
                         * Object proxy     代理对象
                         * Method method    调用方法
                         * Object[] args    传递参数
                         */
                        @Override
                        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                            //判断是否是想要执行的方法
                            if(method.getName().equals("getParameter")) {

                                //对请求参数进行乱码设置后返回给调用者
                                String requestArgs = (String) method.invoke(req, args);
                                requestArgs = new String(requestArgs.getBytes("iso8859-1"), "UTF-8");
                                return requestArgs;
                            }

                            //如果不是想要执行的方法,则不需要对其进行增强
                            return method.invoke(req, args);
                        }
                    }
                );
            //传递增强后的enhanceRequest
            chain.doFilter(enhanceRequst, response);
        }else if (method.equals("POST")) {
            request.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }else {

        }
    }

    public void init(FilterConfig fConfig) throws ServletException {
    }

}

猜你喜欢

转载自blog.csdn.net/m0_37602117/article/details/79177721