徹底搞定亂碼-自定義過(guò)濾器(filter)-3

徹底解決get/post中文亂碼

1.包裝模式過(guò)濾器

  • spring boot 中使用@Component 或者@Configuration
package com.dancer4code.actuator.filter;

import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

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;

/**
 * Created with IntelliJ IDEA.
 * User: liangqing.zhao(zlq)
 * Date: 2019/10/4 19:45
 * Description:
 */
//@Component
//@WebFilter
//@Configuration
//@Order(value = 15)
public class MyCharacterEncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse, FilterChain filterChain)
            throws IOException, ServletException {
        //System.out.println("----------------MyCharacterEncordingFilter------doFilter-----------------");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        filterChain.doFilter(new MyRequest(request), response);

    }

    /*
     * 1.寫一個(gè)類實(shí)現(xiàn)與被增強(qiáng)對(duì)象相同的接口
     * 2.定義一個(gè)變量,記住被增強(qiáng)的對(duì)象
     * 3.定義一個(gè)構(gòu)造方法,接受被增強(qiáng)對(duì)象
     * 4.覆蓋想增強(qiáng)的方法
     * 5.對(duì)于不想增強(qiáng)的方法,直接調(diào)用被增強(qiáng)對(duì)象(目標(biāo)對(duì)象)的方法
     */
    class MyRequest extends HttpServletRequestWrapper {
        private HttpServletRequest request;

        public MyRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }

        @Override
        public String getParameter(String name) {
            String value = this.request.getParameter(name);
            if (!request.getMethod().equalsIgnoreCase("get")) {
                return value;
            }
            if (value == null) {
                return null;
            }
            try {
                return new String(value.getBytes("UTF-8"),
                        request.getCharacterEncoding());

            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    }


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //System.out.println("---MyCharacterEncordingFilter-----init-------");
    }

    @Override
    public void destroy() {
        //System.out.println("---MyCharacterEncordingFilter-----destroy-------");
    }
}


  • spring boot中使用@WebFilter+@ServletComponentScan(可自定義過(guò)濾路徑)

  • spring mvc中使用web.xml中配置(可自定義過(guò)濾路徑)

<filter>
    <filter-name>MyCharacterEncodingFilter</filter-name>
    <filter-class>com.dancer4code.actuator.filter.MyCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
     <filter-name>MyCharacterEncodingFilter</filter-name>
     <url-pattern>/*</url-pattern>
</filter-mapping>

  • spring mvc中使用@WebFilter注解

2.動(dòng)態(tài)代理

package com.dancer4code.actuator.filter;

import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created with IntelliJ IDEA.
 * User: liangqing.zhao(zlq)
 * Date: 2019/10/5 15:15
 * Description:
 */
@Component
public class MyCharacterEncodingProxyFilter implements Filter {


    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        //System.out.println("----------MyCharacterEncodingProxyFilter---doFilter--------------------");
        final HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        //POST的亂碼解決方案
        request.setCharacterEncoding("utf-8");

        //返回?cái)?shù)據(jù)的亂碼解決方案
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        //用動(dòng)態(tài)代理攔截,增強(qiáng)getParameter()后,放行
        chain.doFilter((ServletRequest) Proxy.newProxyInstance(MyCharacterEncodingProxyFilter.class.getClassLoader(), request.getClass().getInterfaces(),
                new InvocationHandler() { //直接實(shí)現(xiàn)接口
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args)
                            throws Throwable {
                        //如果請(qǐng)求方式是POST,則不用增強(qiáng),直接調(diào)用目標(biāo)對(duì)象的方法
                        if (request.getMethod().equalsIgnoreCase("POST")) {
                            return method.invoke(request, args);
                        }
                        String methodName = method.getName();
                        //如果傳遞進(jìn)來(lái)的方法不是getParameter(),則不用增強(qiáng)
                        if (!methodName.equals("getParameter")) {
                            return method.invoke(request, args);
                        }
                        //為GET,并且是getParameter(),...
                        String value = (String) method.invoke(request, args);
                        if (value != null) {
                            value = new String(value.getBytes("iso8859-1"), "utf-8");
                        }
                        return value;
                    }
                }), response);
    }

    public void destroy() {
        //System.out.println("----------MyCharacterEncodingProxyFilter---destroy--------------------");
    }

    public void init(FilterConfig fConfig) throws ServletException {
        //System.out.println("----------MyCharacterEncodingProxyFilter---init--------------------");
    }
}

其他配置方式與上面相同

引用自
徹底解決全站亂碼
Filter使用全站解決中文亂碼問(wèn)題

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 原文鏈接:https://docs.spring.io/spring-boot/docs/1.4.x/refere...
    pseudo_niaonao閱讀 4,900評(píng)論 0 9
  • SpringMVC原理分析 Spring Boot學(xué)習(xí) 5、Hello World探究 1、POM文件 1、父項(xiàng)目...
    jack_jerry閱讀 1,487評(píng)論 0 1
  • 題目 給定一個(gè)數(shù)組, 找出數(shù)組構(gòu)成的矩形面積.矩形的寬度就是數(shù)組兩個(gè)數(shù)的下標(biāo)的距離, 長(zhǎng)度就是數(shù)組兩個(gè)數(shù)字的最小值...
    Jimmy木閱讀 53評(píng)論 0 0
  • 首先,祝我的小皮蛋子三周歲生日快樂(lè)! 三年前的今天,中秋節(jié)前夕,離預(yù)產(chǎn)期還有二十四天,你就迫不及待地來(lái)到了這個(gè)世上...
    飛飛的碎碎念閱讀 1,473評(píng)論 32 35
  • 甜甜五周歲3個(gè)月,浩浩兩周歲10個(gè)月。 【識(shí)字】 甜甜讀了《要保護(hù)環(huán)境》、《嘩啦啦》、《出去玩吧》、《圣誕節(jié)》、《...
    吉祥二寶媽媽閱讀 215評(píng)論 0 0

友情鏈接更多精彩內(nèi)容