Filter
1. 过滤器实现步骤
- 创建类,实现
javax.servlet.Filter
接口 - 在类上使用
@WebFilter("/xxx")
配置拦截路径 - 实现Filter接口的
init、doFilter、destroy
方法 - 示例如下:
@WebFilter("/s01") //"/*"拦截所有资源
public class Filter01 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("filter01 init...");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//doFilter() 放行方法前做请求拦截
System.out.println("filter01 正在拦截");
//放行资源
filterChain.doFilter(servletRequest, servletResponse);
//doFilter() 放行方法后去做响应拦截
System.out.println("filter01 处理响应");
}
@Override
public void destroy() {
System.out.println("filter01 destroy");
}
}
2. 使用过滤器解决请求乱码问题
- 如何处理:
处理POST请求
request.setCharacterEncoding("UTF-8");
处理GET请求
得到服务器的版本信息
判断Tomcat版本是否小于8
小于8时处理乱码
new String(request.getParameter("参数名").getBytes("ISO-8859-1"), "UTF-8");
- 实现如下:
@WebFilter("/*")
public class AEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//处理请求乱码(POST)
request.setCharacterEncoding("UTF-8");
//处理GET请求且服务器版本在Tomcat8以下
String method = request.getMethod();
//如果是GET请求
if ("GET".equalsIgnoreCase(method)) {
//服务器版本在Tomcat8以下的 Apache Tomcat/9.0.53
String serverInfo = request.getServletContext().getServerInfo();
//得到具体的版本号
int version = Integer.parseInt(serverInfo.substring(serverInfo.indexOf("/") + 1, serverInfo.indexOf(".")));
//判断服务器版本是否小于8
if (version < 8) {
HttpServletRequest myRequest = new MyWapper(request);
System.out.println(myRequest.getParameter("name"));
//放行资源
filterChain.doFilter(myRequest, response);
return;
}
}
//放行资源
filterChain.doFilter(request, response);
}
@Override
public void destroy() {}
}
MyWrapper:
public class MyWapper extends HttpServletRequestWrapper {
public MyWrapper(HttpServletRequest request) {
super(request);
}
@Override
public String getParameter(String name) {
String parameter = super.getParameter(name);
if (parameter != null && !"".equals(parameter.trim())) {
return new String(parameter.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
}
return parameter;
}
}
注
:HttpServletRequestWrapper
继承了ServletRequestWrapper
,实现了HttpServletRequest
接口,只要自定义Wrapper,继承HttpServletRequestWrapper
类,重写其中的getParameter
方法,就能解决乱码问题。