packagecom.gton.curd.fileter;import javax.servlet.*;importjavax.servlet.annotation.WebFilter;importjavax.servlet.annotation.WebInitParam;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;importjava.io.UnsupportedEncodingException;importjava.util.Map;/*** @program: javaweb-demo
* @description:过滤器
*@author: GuoTong
* @create: 2020-09-17 14:07
**/
//所有的字符编码都需要统一,所以这里用全部
@WebFilter(value = "/*",initParams ={
@WebInitParam(name="code",value = "UTF-8")
})public class TestFilter implementsFilter {/** 拦截路径
1. 精确拦截`/user-servlet`
2. 通配符`/*`表示拦截所有资源`/user/*`拦截`/user`这个路径下的所有资源
3. 通配符`*.jsp`表示拦截所有以`.jsp`结尾的资源*/
private String code; //保存字符编码的类型
@Overridepublic void init(FilterConfig filterConfig) throwsServletException {//读取web.xml||注解 中Filter配置的初始化參数
code = filterConfig.getInitParameter("code");
}/*实现过滤的方法:
*servletRequest:请求
* servletResponse:响应
* filterChain: 根据条件放行*/@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throwsIOException, ServletException {//处理请求乱码
HttpServletRequest httpServletRequest =(HttpServletRequest) request;
HttpServletRequest myRequest= newMyRequest(httpServletRequest);//处理响应乱码
response.setContentType("text/html;charset=utf-8");
chain.doFilter(myRequest, response);
}
@Overridepublic voiddestroy() {
}
}//自定义request对象
class MyRequest extendsHttpServletRequestWrapper {privateHttpServletRequest request;private booleanhasEncode;publicMyRequest(HttpServletRequest request) {super(request);//super必须写
this.request =request;
}//对需要增强方法 进行覆盖
@OverridepublicMap getParameterMap() {//先获得请求方式
String method =request.getMethod();if (method.equalsIgnoreCase("post")) {//post请求
try{//处理post乱码
request.setCharacterEncoding("utf-8");returnrequest.getParameterMap();
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
}else if (method.equalsIgnoreCase("get")) {//get请求
Map parameterMap =request.getParameterMap();if (!hasEncode) { //确保get手动编码逻辑只运行一次
for(String parameterName : parameterMap.keySet()) {
String[] values=parameterMap.get(parameterName);if (values != null) {for (int i = 0; i < values.length; i++) {try{//处理get乱码
values[i] = newString(values[i]
.getBytes("ISO-8859-1"), "utf-8");
}catch(UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode= true;
}returnparameterMap;
}return super.getParameterMap();
}
@OverridepublicString getParameter(String name) {
Map parameterMap =getParameterMap();
String[] values=parameterMap.get(name);if (values == null) {return null;
}return values[0]; //取回参数的第一个值
}
@OverridepublicString[] getParameterValues(String name) {
Map parameterMap =getParameterMap();
String[] values=parameterMap.get(name);returnvalues;
}
}

835

被折叠的 条评论
为什么被折叠?



