filter过滤器
概述
1)什么是filter servlet listener?
服务器端有三个组件:servlet filter listener
servlet: 本质上就是一个实现接口规范(servlet)的类,可以对浏览器的请求和响应做处理
filter:本质上就是一个实现接口规范(filter)的类,可以对浏览器访问服务器请求时的一种过滤
lstener:本质上就是一个实现接口规范(很多)的类,监听域对象的状态变化(创建和销毁)
2)filter的作用?
filter的核心作用:对浏览器的请求做拦截过滤(不放行 放行)
3)filter如何使用?
1 xml的配置方式
适用于第三方提供的过滤器或者是自己编写的过滤器
2 注解的配置方式
适用自己编写的过滤器
xml配置文件方式:
创建一个java类,实现filter的接口
在web.xml中配置filter要拦截的资源
注解方式:
在自定义的filter类上添加注解:
@WebFilter(filterName = "MyFilter1",urlPatterns = "/sd1")
注解方式:
package cn.itcast.filter;
import javax.servlet.*;
import java.io.IOException;
//注解配置
@WebFilter(urlPatterns = "/sd1")
public class MyFilter1 implements Filter {
// filter创建会执行的方法
public void init(FilterConfig config) throws ServletException {
}
// filter的核心过滤方法
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("我是拦截器,我拦截住了浏览器的请求...");
// 默认没有放行
//手动放行
chain.doFilter(req,resp);
}
//filter销毁会执行的方法
public void destroy() {
}
}
xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>cn.itcast.filter.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<!--filter要拦截的路径-->
<url-pattern>/sd1</url-pattern>
</filter-mapping>
</web-app>
filter知识点
1) 多个filter的执行顺序
特点:多个filter对同一个资源匹配,如果访问该资源多个filter都会执行
配置文件方式:如果多个filter对同一个资源进行了拦截 执行的顺序是配置文件的从上到下顺序
注解方式:如果多个filter对同一个资源进行了拦截 执行的顺序是按照filter文件名的自然排序循序
2) filter的执行流程
3) filter的生命周期(了解)
从filter的出生到filter的死亡 有3个方法伴随:init() destory() dofilter()
服务器启动创建filter对象执行init方法
浏览器访问到了匹配到的资源 执行dofilter方法 访问一次执行一次
当服务器关闭的时候 销毁当前filter 执行destory方法
总结:filter的关注点:开发只关注doFilter()核心过滤方法
filter生命周期方法中参数:(了解)
方法:init(FilterConfig config)
参数:filterConfig 当前filter的配置对象
作用: 1 可以获取到当前filter的名称 getFilterName()
2 可以获取到ServletContext对象 getServletContext()
方法:doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain)
参数:request response filterChain
作用:request response之前怎么用 在filter中还怎么用
filterChain可以做当前filter的放行 放行方法:filterChain.dofilter(req,res)
@WebFilter(urlPatterns = "/*")
public class MyFilter3 implements Filter {
@Override //出生:服务器启动执行
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("1111111111");
//FilterConfig:filter的配置信息对象
// 1 filter的名字获取
System.out.println(filterConfig.getFilterName());
// 2 servletcontext对象获取
System.out.println(filterConfig.getServletContext());
}
@Override //核心方法 进行拦截过滤的方法 匹配一次 执行一次
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("我拦截了浏览器访问服务器的请求...33333");
//放行(固定代码) 默认不写是不放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override //死亡:服务器关闭执行
public void destroy() {
System.out.println("2222222222222");
}
}
4)Filter的配置
1.filter的资源路径配置
有3种方式来配置filter的拦截路径
完全路径匹配: 以/开始 例如:/a /a/sd1
注意:url-pattern可以写多个
目录匹配:以/开始 以*结尾 例如:/* /a/*
扩展名匹配:不以/开始 以.结尾 例如:*.do *.action
2.filter的拦截方式
默认:filter只拦截浏览器过来的请求 不拦截服务器内部的请求
如果想让filter拦截服务器内部的请求:
1:xml方式配置
在<filter-mapping>的标签中添加标签<dispatcher>FORWARD</dispatcher>
但是这种配置将filter默认的拦截方式给覆盖了 只会连接服务器内部的请求 不会再拦截默认的浏览器请求了
想让让filter拦截服务器内部的请求又拦截浏览器过来的请求:
<filter-mapping>
<filter-name>MyFilter2</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher> 配置拦截服务器内部请求
<dispatcher>REQUEST</dispatcher> 配置拦截浏览器的请求
</filter-mapping>
2:注解方式配置
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
该注解配置既会拦截浏览器过来的请求 又会拦截服务器内部的请求
Listener(监听器)
概述
1)什么是监听器?
servlet:本质上是一个类,实现了java的servlet规范,可以进行浏览器请求的接受和给浏览器响应
filter: 本质上是一个类,实现了java的filter规范,可以对浏览器访问服务器资源时的一种拦截
listener:本质上是一个类,实现了java的各种监听器规范,可以监听其它对象(域)的状态变化(创建 销毁)
2)监听器的作用
作用:就会为了监听servletContext,request,session三大域对象的状态变化
三个域对象的创建和销毁
3)java提供的监听器规范
java为我们提供了监听器规范,不同的监听器规范要监听的内容不一样
监听三个域对象的创建和销毁:
ServletContextListener(掌握)
----后期框架的配置文件在服务器启动就执行
ServletRequestListener
HttpSessionListener
监听器的使用
1 编写一个类,实现listener接口
2 去web.xml/注解里面做配置
监听servletContext的创建和销毁:ServletContextListener
创建:服务器只要一开启,就为每个项目创建一个对应的ServletContext对象
销毁: 服务器只要一关闭,就销毁ServletContext对象
代码实现:
// 监听servletContext对象的创建和销毁 实现java提供的监听器规范(ServletContextListener)
//@WebListener
public class ServletContextLoaderListener implements ServletContextListener {
@Override //当servletContext对象被创建了 监听器触发 该方法执行
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("servletContext对象被创建了...");
// 让服务器一加载 就读取框架的配置信息 进行加载
ServletContext servletContext = servletContextEvent.getServletContext();
String value = servletContext.getInitParameter("spring");
System.out.println("就可以正式根据获取到的配置文件名,对该文件的内容进行加载了:"+value);
System.out.println("正在加载该配置文件中....");
}
@Override //当servletContext对象被销毁了 监听器触发 该方法执行
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("servletContext对象被销毁了...");
}
}
监听ServletRequest的创建和销毁:ServletRequestListener
创建: 浏览器每次访问服务器就会创建request对象
销毁: 服务器响应给浏览器的时候该request对象销毁
代码实现:
// 监听request对象的创建和销毁 实现java提供的监听器规范(ServletRequestListener)
//@WebListener
public class RequestLoaderListener implements ServletRequestListener{
@Override
public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
System.out.println("request对象销毁了。。");
}
@Override
public void requestInitialized(ServletRequestEvent servletRequestEvent) {
System.out.println("request对象创建了。。");
}
}
监听HttpSession的创建和销毁:HttpSessionListener
创建:第一次调用request.getSession 创建session对象
销毁:
默认不用30分钟后自动销毁或者主动销毁session.invalidate()
代码实现:
// 监听session对象的创建和销毁 实现java提供的监听器规范(HttpSessionListener)
@WebListener
public class SessionLoaderListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
System.out.println("session创建了...");
}
@Override
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session销毁了...");
}
}