Servlet 如何编写过滤器呢?
Servlet过滤器的功能及目的
Servlet过滤器的功能:- 可用于动态拦截请求和响应
- 可修改请求或响应中的内容
Servlet过滤器常根据类型区别过滤器类型
- 身份验证过滤器(Authentication Filters)
- 数据压缩过滤器(Data compression Filters)
- 加密过滤器(Encryption Filters)
- 触发资源访问事件过滤器
- 图像转换过滤器(Image Conversion Filters)
- 日志记录和审核过滤器(Logging and Auditing Filters)
- MIME-TYPE 链过滤器(MIME-TYPE Chain Filters)
- 标记化过滤器(Tokenizing Filters)
- XSL/T 过滤器(XSL/T Filters),转换 XML 内容
Servlet过滤器的个数
我们可以为一个Servlet添加一个或多个Servlet过滤器或附加一组过滤器Servlet过滤器如何配置呢?
Servlet过滤器需在web.xml文件中进行申明,然后映射到相应的Servlet或URL上
它会为每个过滤器创建一个实例
Servlet过滤器注意事项:
1.Servlet过滤器可变相的用于JSP或Page页面上
2.Servlet运行前会调用附加的Servlet过滤器
3.过滤器类型只是我们根据过滤器的目的定义,都是采用想用的编写方式
4.Servlet过滤器的运行顺序同web.xml配置文件中的配置顺序一致
通常将过滤器配置在所有的Servlet之前
Servlet过滤器包含哪些方法呢?
Servlet过滤器必须实现javax.servlet.Filter接口,必须实现以下三个方法,如下所示: 过滤器是一个实现了 的 Java 类。javax.servlet.Filter 接口定义了三个方法:
| 编号 | 方法及备注 |
| 1 | public void doFilter (ServletRequest, ServletResponse, FilterChain) 完成过滤器的逻辑处理 当请求Servlet时,首先运行此方法,然后进行ServletRequest或ServletResponse的判断或处理 当允许放行时,调用FilterChain(带着处理后的ServletRequest及ServletResponse)进入下一个过滤链 |
| 2 | public void init(FilterConfig filterConfig) 此方法用于web服务器创建Filter实例对象时调用 其功能用于完成Filter对象的初始化操作 此方法只会运行一次 |
| 3 | public void destroy() Servlet容器在销毁过滤器实例前运行此方法 常将一些释放资源的操作放入此方法中 |
FilterConfig使用示例说明
例: 为Filter的init方法定义一个FilterConfig对象如:
web.xml内容如下:
<filter>
<filter-name>LogFilter</filter-name>
<filter-class>com.java265.test.LogFilter</filter-class>
<init-param>
<param-name>Site</param-name>
<param-value>Java爱好者</param-value>
</init-param>
</filter>
Filter中获取FilterConfig的方法如下:
public void init(FilterConfig config) throws ServletException {
// 获取初始化参数
String site = config.getInitParameter("Site");
// 输出初始化参数
System.out.println("网站名称: " + site);
}
/*
以上过滤器会在控制台 输出:
网站名称: Java爱好者
*/
Servlet过滤器示例
/*
ServletFilter1.java
*/
package servlet01;
import java.io.IOException;
import java.io.PrintWriter;
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 ServletFilter1 implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 输出站点名称
System.out.println("我是过滤器:http://www.java265.com");
// 设置所有网页为utf-8
response.setContentType("text/html;charset=utf-8");
PrintWriter t = response.getWriter();
t.write("<b>我是过滤器加入的Response! </b><br />");
chain.doFilter(request, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 获取初始化参数
String v = filterConfig.getInitParameter("ParmName");
// 输出初始化参数
System.out.println("FilterConfig-Value: " + v);
}
}
/*
ServletHelloWorld.java
*/
package servlet01;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/helloWorld")
public class ServletHelloWorld extends HttpServlet {
private static final long serialVersionUID = 888;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("我是Servlet响应器!");
PrintWriter t = resp.getWriter();
t.write("我是Servlet输出的信息");
}
}
/*
web.xml
*/
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<display-name>servlet01</display-name>
<welcome-file-list>
<welcome-file>PostTest.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<filter>
<filter-name>testFilter</filter-name>
<filter-class>servlet01.ServletFilter1</filter-class>
<init-param>
<param-name>ParmName</param-name>
<param-value>Java爱好者</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>testFilter</filter-name>
<url-pattern>/index</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>helloWorld</servlet-name>
<servlet-class>servlet01.ServletHelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>helloWorld</servlet-name>
<url-pattern>/index</url-pattern>
</servlet-mapping>
</web-app>
1.启动web容器,控制台将输出以下信息:
信息: 已开始重新加载名为[/servlet01]的上下文
FilterConfig-Value: Java爱好者
8月 12, 2021 2:55:37 下午 org.apache.catalina.core.StandardContext reload
信息: 已完成重新加载名为/servlet01的上下文
2.访问url ,控制台将输出以下信息:
http://localhost:8080/servlet01/index
我是过滤器:http://www.java265.com
我是Servlet响应器!
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


