目录
1、JavaWEB的一个重要组件,可以对发送到servlet的请求进行拦截过滤,也可以对响应进行拦截。
2、Filter是实现了Filter接口的Java类
3、Filter需要在web.xml中进行注册,也可以通过注解来注册。
怎么创建一个Filter一只需要创建的一个类,实现Filter接口并重写方法即可。
@WebServlet("/uu.do")----对那个进行拦截如果要对所有进行拦截:("/*")
- @WebServlet("/uu.do")
- public class Hello implements Filter {
- //初始化
- @Override
- public void init(FilterConfig filterConfig) throws ServletException {
- Filter.super.init(filterConfig);
- }
- //主要过滤请求的方法
- @Override
- public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
-
- }
- //销毁
- @Override
- public void destroy() {
- Filter.super.destroy();
- }
- }
这就是一个生命周期:初始化/过滤请求/销毁
- <filter>
- <filter-name>u</filter-name>
- <filter-class>UserNameFilter</filter-class>
- </filter>
- <!-- 配置过滤器过滤拦截什么请求-->
- <filter-mapping>
- <filter-name>u</filter-name>
- <!-- //对什么请求进行过滤-->
- <url-pattern>/uu.do</url-pattern>
- </filter-mapping>
在创建Filter对象的时候,在servlet容器里(tomcat),加载当前web应用(当前工程)被调用只执行一次,当前Filter的初始化请求。Filter和servlet都是单例的。FilterConfig类似于ServletConfig,获取初始化参数
真正Filter要处理的逻辑代码需要写在此方法里,每次拦截都会调用这个方法。
ServletRequest:实际上当请求来的时候,实例化的还是HTTPServletRequest
ServletResponse:实际上当请求来的时候,实例化的还是HTTPServletResponse
FilterChain:过滤器链,一个项目中可以有多个过滤器,既然有多个,就会产生顺序,有顺序,就形成了链,把当前请求传给下一个
Filter顺序: 跟web.xml里的filter-mapping的顺序有关
过滤请求已经通过方法捕获到了,但是不能说,捕获到就不走了,我们是要进行判定等操作,如果条件允许,我们还是会让他通过的:
我们看到doFilter方法里,有三个参数,前两个咱们都认识,那第三个呢,欸,我们传输就用第三个参数:
filterChain.doFilter(servletRequest,servletResponse);
这就是传输给下一位,我的理解就是给他个通行证,让方法放行。
专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理
主要监听作用域的对象的改变
监听器监听的是域对象,不是监听对象的某个地址
servlet、filter、listener
- public class HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
- @Override
- public void contextInitialized(ServletContextEvent sce) {
- ServletContextListener.super.contextInitialized(sce);
- }
-
- @Override
- public void contextDestroyed(ServletContextEvent sce) {
- ServletContextListener.super.contextDestroyed(sce);
- }
-
- @Override
- public void requestDestroyed(ServletRequestEvent sre) {
- ServletRequestListener.super.requestDestroyed(sre);
- }
-
- @Override
- public void requestInitialized(ServletRequestEvent sre) {
- ServletRequestListener.super.requestInitialized(sre);
- }
-
- @Override
- public void sessionCreated(HttpSessionEvent se) {
- HttpSessionListener.super.sessionCreated(se);
- }
-
- @Override
- public void sessionDestroyed(HttpSessionEvent se) {
- HttpSessionListener.super.sessionDestroyed(se);
- }
- }
- @WebListener
- public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener, HttpSessionAttributeListener {
-
- @Override
- public void attributeAdded(ServletContextAttributeEvent scae) {
- ServletContextAttributeListener.super.attributeAdded(scae);
- }
-
- @Override
- public void attributeRemoved(ServletContextAttributeEvent scae) {
- ServletContextAttributeListener.super.attributeRemoved(scae);
- }
-
- @Override
- public void attributeReplaced(ServletContextAttributeEvent scae) {
- ServletContextAttributeListener.super.attributeReplaced(scae);
- }
-
- @Override
- public void attributeAdded(ServletRequestAttributeEvent srae) {
- ServletRequestAttributeListener.super.attributeAdded(srae);
- }
-
- @Override
- public void attributeRemoved(ServletRequestAttributeEvent srae) {
- ServletRequestAttributeListener.super.attributeRemoved(srae);
- }
-
- @Override
- public void attributeReplaced(ServletRequestAttributeEvent srae) {
- ServletRequestAttributeListener.super.attributeReplaced(srae);
- }
-
- @Override
- public void attributeAdded(HttpSessionBindingEvent se) {
- HttpSessionAttributeListener.super.attributeAdded(se);
- }
-
- @Override
- public void attributeRemoved(HttpSessionBindingEvent se) {
- HttpSessionAttributeListener.super.attributeRemoved(se);
- }
-
- @Override
- public void attributeReplaced(HttpSessionBindingEvent se) {
- HttpSessionAttributeListener.super.attributeReplaced(se);
- }
- }
- public class HelloSessionListener implements HttpSessionActivationListener {
- //在钝化之前被调用
- @Override
- public void sessionWillPassivate(HttpSessionEvent se) {
- HttpSessionActivationListener.super.sessionWillPassivate(se);
- }
- //在活化之后被调用
- @Override
- public void sessionDidActivate(HttpSessionEvent se) {
- HttpSessionActivationListener.super.sessionDidActivate(se);
- }
- }
活化:从磁盘中读取session对象
钝化:向磁盘中写入session对象
@WebListener
注解加上以后才可以监听域对象
注解:@WebListener
xml配置: