Servlet过滤器
一、Servlet过滤器概述
1.Servlet过滤器是什么
- Servlet过滤器是可用于Servlet编程的Java类;
- 它先于与之相关的Servlet或者JSP页面运行在服务器端。
2.Servlet的作用
- 在客户端的请求访问后端资源之前,拦截这些请求
- 在服务器的响应发送回客户端之前,处理这些响应
二、Servlet过滤器工作原理
1.过滤器运行原理
2.过滤器的种类
- 身份验证过滤器
- 数据压缩过滤器
- 加密过滤器
- 触发资源访问事件过滤器
- 图像转换过滤器
- 日志记录和审核过滤器
- MIME-TYPE链过滤器
- 标记化过滤器
- XSL/T过滤器(XSL/T Filters),转换xml内容
三、Servlet过滤器的核心对象
1.Filter接口概述
- 所有的过滤器在开发中必须实现javax.servlet.Filter接口。
2.Filter接口需要实现的方法
序号 | 方法 | 描述 |
---|---|---|
1 | public void init(FilterConfig filterConfig) | 该方法由Web容器调用,指示一个过滤器被放入服务 |
2 | public void doFilter(ServletRequest,ServletResponse,FilterChain) | 该方法在每次一个请求/响应对因客户端在链的末端请求资源而通过链传递时由容器调用 |
3 | public void destroy() | 该方法由Web容器调用,指示一个过滤器被取出服务 |
3.FilterConfig接口概述
- 有Servlet容器进行实现,主要用于获取过滤器中的配置信息,其他方法以及说明。
4.FilterConfig接口的方法声明及说明
序号 | 方法 | 描述 |
---|---|---|
1 | getFilterName() | 获取过滤器的名字 |
2 | getInitParameter(java.lang.String name) | 获取过滤器的初始化参数 |
3 | getServletContext() | 获取Servlet的上下文 |
5.FilterChain接口概述
- 仍然有Servlet容器进行实现,这个接口中只有一个方法,声明如下。
- FilterChain接口的方法声明及说明
方法 | 描述 |
---|---|
public void doFilter(ServletRequest,ServletResponse,FilterChain) | 该方法用于将过滤后的请求转发给下一个过滤器,如果该过滤器已经是最后一个过滤器,那么,将请求传给目标资源 |
四、Servlet过滤器的配置、实例
-
开发Servlet过滤器的步骤如下:
- 编写实现Filter接口的Servlet类。
- 在web.xml中配置Filter
-
过滤器被部署在部署描述符文件web.xml中,然后映射到您的应用程序的部署描述符中的Servlet名称或URL模式。
-
当Web容器启动Web应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。该过滤器执行的顺序是按它们在部署描述符中声明的顺序。
1.创建和配置过滤器
类文件:
xml文件声明:
2.Filter过滤器的执行顺序
FirstFilter:
package com.hkd.filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FirstFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FirstFilter处理请求");
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("FirstFilter初始化");
}
@Override
public void destroy() {
System.out.println("FirstFilter销毁");
}
}
SecondFilter:
package com.hkd.filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SecondFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("SecondFilter处理请求");
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("SecondFilter初始化");
}
@Override
public void destroy() {
System.out.println("SecondFilter销毁");
}
}
ThirdFilter:
package com.hkd.filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ThirdFilter extends HttpFilter {
@Override
protected void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("ThirdFilter处理请求");
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("ThirdFilter初始化");
}
@Override
public void destroy() {
System.out.println("ThirdFilter销毁");
}
}
xml配置文件:
<filter>
<filter-name>ThirdFilter</filter-name>
<filter-class>com.hkd.filter.ThirdFilter</filter-class>
</filter>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.hkd.filter.SecondFilter</filter-class>
</filter>
<filter>
<filter-name>FirstFilter</filter-name>
<filter-class>com.hkd.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>FirstFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>ThirdFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
执行结果:
由此可见Filter的执行顺序和<filter-mapping>
有关。
3.Filter过滤器的chain.doFilter(request,response)方法
在上述的过滤器Second中加上
执行结果
3.实现禁止为授权的URL访问站点
思路