拦截/过滤器 : 拦截请求,对请求和响应做出处理。本质上与servlet类似。
特点 :
- 请求最终是要到Servlet
- 拦截了请求,如果不放行,就不会到对应的Servlet
- 如果放行了,就会到对应的Servlet
- 如果Servlet有响应,那么还会再次经过Filter再到浏览器
演示单个拦截器
Filter实现类:
package com.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class MyFilter1 implements Filter{
public MyFilter1() {
System.out.println("MyFilter1 拦截器创建");
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter1 拦截器初始化");
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("MyFilter1 拦截器 执行拦截");
// 放行 : 放行到下一个拦截器,如果这是最后一个,那就放行到对应的Servlet
chain.doFilter(request, response);
System.out.println("放行后");
}
public void destroy() {
System.out.println("MyFilter1 拦截器销毁");
}
}
web.xml :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>day41_filter</display-name>
<welcome-file-list>
<welcome-file>index.htm</welcome-file>
</welcome-file-list>
<!-- 拦截器 -->
<filter>
<filter-name>f1</filter-name>
<filter-class>com.zhiyou100.filter.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>f1</filter-name>
<url-pattern>/f1</url-pattern>
</filter-mapping>
<!-- 映射Servlet -->
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>com.zhiyou100.filter.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/f1</url-pattern>
</servlet-mapping>
</web-app>
Servlet继承类:
public class MyServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("MyServlet 执行了");
resp.sendRedirect("index.jsp");
}
}
多个拦截器
配置了3个拦截器, MyFilter1 , 2, 3 三个拦截器的名字是f1 f2 f3 ,但是拦截的路径都是/f1
Filter的生命周期
1 项目启动,拦截器即创建
2 创建后立即初始化
3 每次有对应的请求,都会执行拦截
4 项目卸载或者是服务器宕机就会销毁
编码格式过滤
拦截所有请求,到EncodingFilter 拦截器,对请求进行编码格式过滤,后再将请求放行, 后续的所有Servlet就不再需要对编码进行过滤