徹底解決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--------------------");
}
}
其他配置方式與上面相同