过滤器编写步骤
- 编写一个类实现javax.servlet.Filter接口
- 重写接口中所有的方法,其中doFilter方法执行过滤的功能
- 配置过滤器
- 在web.xml中配置
- 使用注解@WebFilter
解决乱码需要添加这句代码:req.setCharacterEncoding(“utf-8”); 字符集与网页的编码要一致
EncodingFilter.java:
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebFilter(filterName = "EncodingFilter", urlPatterns = "/*")
public class EncodingFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
// 判断是否是POST方法 在Tomcat8或以上中只有POST方法会出现乱码
if ("POST".equals(request.getMethod())) {
req.setCharacterEncoding("utf-8"); // 解决乱码
}
chain.doFilter(req, resp); // 这句话一定要执行 功能是放行 否则会一直阻塞在这里
}
public void destroy() {
}
}
过滤器的执行流程如下:
- 用户发送请求web资源,如果过滤器发现web资源的访问地址匹配当前过滤器,则先执行过滤器中代码。
- 执行doFilter()方法,在方法内部调用chain.doFilter(request, response)。它的作用就是放行。
- 如果没有放行,则拦截了请求。请求无法到达web资源。
- 放行后,执行完web资源。响应回来的时候,会再次经过过滤器。