Springmvc关于post和get乱码问题解决,利用动态代理重写CharacterEncodingFilter过滤器...

package com.zykj.utils;

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

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.Assert;
import org.springframework.web.filter.OncePerRequestFilter;

/**
 * @deprecated 对SpringMVC中post和get请求进行乱码处理
 *         此方法为采用动态代理
 * @date 2017-12-10
 * @author qidalei 
 */
public class SpringCharacterEncodingFilter extends OncePerRequestFilter {
    /**
     * 在web.xml中的int标签中进行初始化配置, encoding:设置编码格式
     * forceEncoding:设置是否进行response响应处理编码true为处理,false为不处理默认不处理
     * <init-param> 
     *     <param-name>encoding</param-name>
     *     <param-value>UTF-8</param-value> 
     * </init-param>
     * 
     */

    private String encoding;
    private boolean forceEncoding;

    public SpringCharacterEncodingFilter() {
        this.forceEncoding = false;
    }

    public SpringCharacterEncodingFilter(String encoding) {
        this(encoding, false);
    }

    public SpringCharacterEncodingFilter(String encoding, boolean forceEncoding) {
        this.forceEncoding = false;
        Assert.hasLength(encoding, "Encoding must not be empty");
        this.encoding = encoding;
        this.forceEncoding = forceEncoding;
    }

    public void setEncoding(String encoding) {
        this.encoding = encoding;
    }

    public void setForceEncoding(boolean forceEncoding) {
        this.forceEncoding = forceEncoding;
    }

    protected void doFilterInternal(HttpServletRequest req, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        final HttpServletRequest request = req;
        if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
            // 对post请求进行编码控制
            request.setCharacterEncoding(this.encoding);
            // 对response响应进行编码控制
            if (this.forceEncoding) {
                response.setCharacterEncoding(this.encoding);
            }
            // 对get请求进行处理(此处可以对不同请求进行设置)
            String methodName = request.getMethod();
            if ("get".equalsIgnoreCase(methodName)) {
                HttpServletRequest requestProxy = (HttpServletRequest) Proxy.newProxyInstance(
                        this.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
                            @Override
                            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                                System.out.println(method.getName());
                                if ("getParameter".equalsIgnoreCase(method.getName())) {
                                    String value = request.getParameter((String) args[0]);
                                    if (value == null) {
                                        return "";
                                    }
                                    return new String(value.getBytes("iso-8859-1"), "utf-8");
                                }
                                if ("getParameterValues".equalsIgnoreCase(method.getName())) {
                                    String[] values = request.getParameterValues((String) args[0]);
                                    if (values == null) {
                                        return null;
                                    }
                                    for (int i = 0; i < values.length; i++) {
                                        values[i] = new String(values[i].getBytes("iso8859-1"), "utf-8");
                                        System.out.println(values[i]);
                                    }
                                    return values;
                                }
                                return method.invoke(request, args);
                            }
                        });
                filterChain.doFilter(requestProxy, response);
                return;
            }

        }

        filterChain.doFilter(request, response);
    }
}

web,xml配置文件

 <filter>
          <filter-name>encoding</filter-name>
          <filter-class>com.zykj.utils.SpringCharacterEncodingFilter</filter-class>
        <init-param>
            <!-- encoding 设置编码格式 -->
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param> 
        <init-param>
            <!-- forceEncoding设置为true对response响应进行乱码控制  -->
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
          <filter-name>encoding</filter-name>
          <url-pattern>/*</url-pattern>
      </filter-mapping>

未解决的问题:当在过滤器中设置getParameterMap时,会产生页面接收不到对应的参数,因此在过滤器中仅对getParameter和getParameterValues进行了增强。

转载于:https://www.cnblogs.com/myworldfordata/p/8018254.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值