文章目录
Filter:过滤器
概念
- 生活中的过滤器:净水器,空气净化器
- web中的过滤器,当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能
作用
- 一般用来拦截一些通用的操作.如:登录验证,统一编码设置,敏感字符过滤…
快速入门
步骤:
- 定义一个类,实现Filter接口
- 复写方法
- 配置(配置拦截路径)
- web.xml配置
- 注解配置
package per.leiyu.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** * @author 雷雨 * @date 2020/5/17 9:26 * * 过滤器的快速入门 * 1.创建一个类实心Filter接口(注意导入的包是javax.servlet.Filter) * 2.复写方法 * 3,配置拦截路径 */
@WebFilter("/*")
public class FilterDemo1 implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("filterDemo1被执行了....");
filterChain.doFilter(servletRequest,servletResponse);//拦截放行
}
@Override
public void destroy() {
}
}
过滤器细节:
1.使用web.xml配置拦截路径
和注解方法的配置的作用是一样的
<filter>
<filter-name>demo1</filter-name>
<filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--表示的是拦截路径 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
2.过滤器执行过程
拦截前对request资源进行增强------>执行要拦截的资源------->拦截之后对于response资源进行增强
3.过滤器生命周期方法
package per.leiyu.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** * @author 雷雨 * @date 2020/5/17 10:36 */
@WebFilter(filterName = "FilterDemo3")
public class FilterDemo3 implements Filter {
public void destroy() {
//在服务器启动后自动执行,只执行一次,一般用于资源的加载
System.out.println("filter拦截器执行之前");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//我们需要拦截器执行的业务逻辑方法写在这里
System.out.println("filter拦截器执行");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
//在服务器关闭时执行,只执行一次,一般用于资源的释放
System.out.println("filter拦截器执行后");
}
}
4.过滤器配置详解
4.1拦截路径的配置
- 具体的资源路径: 例如/index.jsp 只有访问index.jsp资源时过滤器才会执行
- 目录拦截: /user/* 访问/user下的所有资源时,过滤器都会执行
- 后缀名拦截: *.jsp 访问所有后缀名为jsp的资源时,过滤器都会被执行
- 拦截所有资源: /* 访问所有资源时,过滤器都会被执行
package per.leiyu.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/** * @author 雷雨 * @date 2020/5/17 10:46 * *拦截路径的配置方式 * 1:具体的路径拦截 */
//@WebFilter("/index.jsp") //具体的路径拦截
//@WebFilter("/user/*") //目录拦截方式
//@WebFilter(".jsp") //后缀名拦截方式
@WebFilter("/*") //拦截所有的资源
public class FilterDemo4 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("filterDemo4...");
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
}
}
4.2拦截方式的配置
- 拦截方式:资源被访问的方式
我们之前的资源的访问方式可以是:
1.发送请求,即直接浏览器向服务器发送请求,
2.请求转发,正在访问浏览器的资源,在浏览器中进行请求转发,直接访问服务器中的资源
而现在用Filter也可以来配置资源被访问的方式(拦截方式),有两种方式
4.2.1注解方式配置拦截方式
- 设置dispatcherTypes属性:
- REQUEST:默认值.浏览器直接请求资源
- FORWARD:转发访问资源
- INCLUDE:包含访问资源
- ERROR:错误跳转资源
- ASYNC:异步访问资源
4.2.2web.xml方式配置拦截方式
设置dispatherTypes标签
<filter>
<filter-name>demo1</filter-name>
<filter-class>per.leiyu.web.filter.FilterDemo1</filter-class>
</filter>
<filter-mapping>
<filter-name>demo1</filter-name>
<!--表示的是拦截路径 -->
<url-pattern>/*</url-pattern>
<!--dispatherTypes还是5个取值和在注解中的取值是一样的 -->
<dispatherTypes>REQUEST</dispatherTypes>
</filter-mapping>
5.过滤器链(配置多个过滤器)
- 执行顺序的问题:
如果有两个过滤器,分别为过滤器1和过滤器2
执行顺序:
过滤器1---->过滤器2---->资源执行----->过滤器2----->过滤器1
-
过滤器先后顺序问题:
-
注解配置:按照类名的字符串比较规则比较,值小的先执行
如:AFilter 和BFilter ,那么肯定是AFilter过滤器先执行
-
web.xml:谁定义在上面,谁先执行
-
案例:登录验证:
需求:
- 访问case_filter案例的资源.验证其是否登录
- 如果登录了,则直接放行
- 如果没有登录,则跳转带登录页面,提示"您尚未登录,请先登录"
Listener***
- web的三大组件之一.
事件监听机制:
- 事件: 一件事情
- 事件源 事件发生的地方
- ***: 一个对象
- 注册监听: 将事件.事件源,***绑定在一起.当事件源上发生某个事件后,执行***代码
servletContextListener:监听servletContext对象的创建和销毁
-
void contextDestroyed(ServletContextEvent sce):servletContext对象在销毁之前会调用这个方法
-
void contextInitialized(ServletContextEvent sce):servletContext对象在创建后悔调用该方法
-
一般用于加载资源
-
步骤:
-
获取servletContext对象:servletContext servletcontext = servletContextEvent.getservletContext();
-
加载资源文件
String contextfigLocation = servletContext.getInitParameter(“contextfigLocation.xml”);
-
获取真实路径
Sting realPath = servletContext.getReaPath(contextfigLocation )
-
用一个流对象关联(加载进内存
FileInputStream fis = new FileInputStream(realpath);
-
-
实现***的步骤:
- 定义一个类,实现servletContextListener接口
- 复写方法
- 配置
- web.xml
- 注解的配置方式