过滤器介绍
过滤器能够对ServletRequest和ServletResponse对象进行检查和修改。在Web组件被调用之前检查ServletRequ对象。修改请求头和请求正文。或对请求进行预处理。在Web组件被调用之后检查ServletResponse对象,修改响应头和响应正文。(可以过滤的Web组件有Servlet html jsp)
特点
1.过滤器可以检查ServletRequest和ServletResponse对象,并且利用ServletRequestWrapper和ServletResponseWrapper包装类来修改ServletRequest和ServletResponse对象。
2.可以在Web.xml中位过滤器配置映射url
3.多个过滤器可以被串联在一起。
创建过滤器
过滤器需要实现Filter接口,且实现三个方法。
init(FilterConfig config):初始化方法,在Web应用启动时,会创建过滤器,此时会执行此方法。
doFilter(ServletRequest req,ServletResponse res,FilterChain chain):访问响应url时会执行该方法,chain为下一个要执行得过滤器或者web组件
destroy():过滤器销毁时执行。
拦截器类
拦截器1
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("拦截器1初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截器1执行(前)");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("拦截器1执行(后)");
}
@Override
public void destroy() {
System.out.println("拦截器1销毁");
}
}
拦截器2
public class MyFilter2 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("拦截器2初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截器2执行(前)");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("拦截器2执行(后)");
}
@Override
public void destroy() {
System.out.println("拦截器2销毁");
}
}
拦截的Servlet
@WebServlet(urlPatterns = "/filter")
public class TestFilterServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("GBK");
resp.setContentType("text/html;charset=gbk");
PrintWriter writer = resp.getWriter();
writer.write("helloWord");
}
}
注册拦截器
方法一:
在web.xml文件中注册
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<filter>
<filter-name>f1</filter-name>
<filter-class>com.sea.Filter.MyFilter1</filter-class>
</filter>
<filter>
<filter-name>f2</filter-name>
<filter-class>com.sea.Filter.MyFilter2</filter-class>
</filter>
<filter-mapping>
<filter-name>f2</filter-name>
<url-pattern>/filter</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>f1</filter-name>
<url-pattern>/filter</url-pattern>
</filter-mapping>
</web-app>
注意此时如果存在拦截器串联的话,执行顺序和 的先后顺序有关(例如上面就是先执行拦截器2)
当浏览器访问TestFilterServlet时的执行结果
方法二:注解
//注解
@WebFilter(urlPatterns = "/filter")
public class MyFilter1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("拦截器1初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("拦截器1执行(前)");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("拦截器1执行(后)");
}
@Override
public void destroy() {
System.out.println("拦截器1销毁");
}
}