Filter
简介
filter也称之为过滤器,它是javaWeb三大组件之一(Servlet程序、Listener监听器、Filter过滤器)
作用:既可以对请求进行拦截,也可以对响应进行处理。
Filter详细介绍
/**
* web应用启动时,web服务器将创建Filter的实例对象,并调用init方法,读取web.xml的配置,完成对象的初始化功能,
* 从而为后续的用户请求做好拦截的准备工作(filter对象只会创建一次,init方法也只会执行一次,开发人员通过init的参数,
* 可或得代表当前filter配置信息的FilterConfig对象)
* @param filterConfig
* @throws ServletException
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
/**
* 这个方法完成实际的过滤操作,当客户请求访问与过滤器相关联的URL的时候,Servlet过滤器将先执行doFilter方法,FilterChain参数用于访问后续过滤器
* @param servletRequest
* @param servletResponse
* @param filterChain
* @throws IOException
* @throws ServletException
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
/**
* filter创建后会保存在内存中,当web应用移除或者服务器停止时才销毁,该方法在Filter的生命周期中仅执行一次,在这个方法中,可以释放过滤器使用的资源
*/
@Override
public void destroy() {
}
生命周期
(1)init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
(2)doFilter:每一次请求被拦截资源时,会执行。执行多次
(3)destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
过滤器链
执行顺序:如果有两个过滤器:过滤器1和过滤器2
(1)过滤器1
(2)过滤器2
(3) 资源执行
(4) 过滤器2
(5)过滤器1
过滤器先后顺序问题:
(1)注解配置:按照类名的字符串比较规则比较,值小的先执行
如: AFilter 和 BFilter,AFilter就先执行了。
(2)web.xml配置: <filter-mapping>谁定义在上边,谁先执行
如何配置过滤器
要想调用配置一个过滤器:
1)启动类上增加注解@ServletComponentScan
2)新建一个类使其实现Filter接口,并实现里面的三个方法
3)在新建类上加上@WebFilter()注解,配置需要拦截的规则
4)在doFilter方法中控制filterChain.doFilter(servletRequest, servletResponse)调用
案例
package com.filters;
import javax.servlet.*;
import java.io.IOException;
/*
1.实现Filter接口
2.重写过滤方法
3.配置过滤器
web.xml
注解
*/
public class LoggingFilter implements Filter {
/*
过滤请求和响应的方法
1.请求到达目标资源之前,先经过该方法
2.该方法有能力控制请求是否继续向前到达目标资源,可以在该方法内直接向客户端做响应处理
3.请求到达目标资源后,响应之前,还会经过该方法
*/
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
/*
1.请求达到目标资源之前的功能代码
判断是否登录
校验权限是否满足
······
2.放行代码
3.响应之前 HttpServletResponse 转换为响应报文之前的功能代码
*/
//请求到达目标资源之前的代码
System.out.println("LoggingFilter before filterChain");
//放行
filterChain.doFilter(servletRequest, servletResponse);
//响应之前的功能代码
System.out.println("LoggingFilter after filterChain");
}
}
package com.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/servlet1")
public class Servlet1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet1");
resp.getWriter().println("servlet1");
}
}
<?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>loggingFilter</filter-name>
<filter-class>com.filters.LoggingFilter</filter-class>
</filter>
<!--配置过滤器的过滤资源规则 路径 servlet-name-->
<filter-mapping>
<filter-name>loggingFilter</filter-name>
<!--
url-pattern 根据请求的资源路径 对路径的请求进行过滤
/* 过滤全部资源
/a/* 过滤以a开头的资源
*.html 过滤以html为后缀的资源
/servlet1 对servlet1进行过滤
servlet-name 根据请求的servlet的别名,对指定的servlet的资源进行过滤
-->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<context-param>
<param-name>encoding</param-name>
<param-value>haha</param-value>
</context-param>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>com.servlet.Servlet1</servlet-class>
<init-param>
<param-name>keya</param-name>
<param-value>valueA</param-value>
</init-param>
<init-param>
<param-name>keyb</param-name>
<param-value>valueB</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>-->
</web-app>

浙公网安备 33010602011771号