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响应器!
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。