javaWeb学习十八天------监听器,过滤器

Filter Listener Servlet 是 javaweb 的三大组件

监听器

监听某一个对象(内置对象)的状态

状态:

1.监听内置对象的创建; ServletContext , request, session

2.监听内置对象值的改变 ServletContext request session

3.监听内置对象是否有存某一个固定的值 ==>主要是针对于session

监听内置对象的创建

ServletContex

ServletContex是随着服务器的创建而创建 ,随着服务器的关闭而销毁

步骤:
1.创建一个类  实现  ServletContextListener
  
2.重写两个方法 contextDestroyed(ServletContextEvent sce)  销毁后所执行的方法 
             contextInitialized(ServletContextEvent sce) 初始化所执行的方法
3.在xml进行配置   或者是写注解  @WebListener

xml配置

<listener>
        //完整的包名与类名
        <listener-class>com.study.listeren.MyServletContextListeren</listener-class>
    </listener>

实现ServletContextListener(使用注解,如果写xml会优先加载xml配置)

@WebListener
public class MyServletContextListeren implements ServletContextListener {

    // 创建的时候所执行的方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("contextInitialized");
    }
  // 销毁的时候所执行的方法
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("contextDestroyed");

    }
}

request

request ==随着请求的开始而开始,随着请求的结束而结束(一次请求 )

步骤:
1.创建一个类  实现  ServletRequestListener
2.重写其requestDestroyed(ServletRequestEvent sre)销毁
       requestInitialized(ServletRequestEvent sre)  创建
3.配置注解 注意点(默认的tomcat会发动请求,==>看效果,直接重新访问这个界面)

实现 ServletRequestListener

@WebListener
public class MyRequestListeren implements ServletRequestListener {
    @Override
    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
        System.out.println("requestDestroyed");
    }

    @Override
    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
        System.out.println("requestInitialized");

    }
}

session

session ==>是随着会话的创建而结果 ==>是30分钟之后而关闭(如果不设置默认的时间)

 步骤:
 1.创建一个类  实现  HttpSessionListener
 2.重写其sessionDestroyed(HttpSessionEvent se)销毁  
        sessionCreated(HttpSessionEvent se  创建
 3.配置注解 注意点:只要关闭后三十分钟 sessionId被清除

实现 HttpSessionListener

@WebListener
public class MySessionListeren implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionCreated");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionDestroyed");

    }
}

监听内置对象值的改变

1.监听ServletContext对象值的改变 ==> 实现这个监听 ServletContextAttributeListener

1.attributeAdded(ServletContextAttributeEvent scab)  追加                     
2.attributeRemoved(ServletContextAttributeEvent scab)  删除
3.attributeReplaced(ServletContextAttributeEvent scab)  替换
@WebListener
public class MyServletContextAttributeListener implements ServletContextAttributeListener {

     // 添加至
    @Override
    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
    }


    //删除值

    @Override
    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
    }

    //替换值的时候

    @Override
    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
        System.out.println(servletContextAttributeEvent.getServletContext().getAttribute("uname"));
    }
}

2.监听reques对象里值的改变==> 实现这个监听器 ServletRequestAttributeListener

1.attributeAdded(ServletContextAttributeEvent scab)  追加
2.attributeRemoved(ServletContextAttributeEvent scab)  删除
3.attributeReplaced(ServletContextAttributeEvent scab)  替换
 注意点:在追加数据时候,默认会赋值一个null
@WebListener
public class MyRequestAttributeListener implements ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("增加"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("删除"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent servletRequestAttributeEvent) {
        System.out.println("修改"+servletRequestAttributeEvent.getServletRequest().getAttribute("uname"));
    }
}

3.监听session 的值改变==> 实现 HttpSessionAttributeListener

1.attributeAdded(ServletContextAttributeEvent scab)  追加
2.attributeRemoved(ServletContextAttributeEvent scab)  删除
3.attributeReplaced(ServletContextAttributeEvent scab)  替换
@WebListener
public class MySessionAttributeListener implements HttpSessionAttributeListener {


    @Override
    public void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("增加"+httpSessionBindingEvent.getSession().getAttribute("uname"));
    }

    @Override
    public void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("删除:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
    }

    @Override
    public void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("替换:"+httpSessionBindingEvent.getSession().getAttribute("uname"));
    }
}

4.HttpSessionActivationListener == >防止内存中的数据丢失

 sessionWillPassivate(HttpSessionEvent se)  
 钝化  ==>工业:把一些液体固体化        硬盘  == 内存
 sessionDidActivate(HttpSessionEvent se)  活化  =>把固体化的物质解化
  钝化:也就是把内存中数据保存在磁盘 1.把对象存在session    
  活化 :把磁盘中的数据加载到内存
  注意点 1.要依赖于流,对象必须实现序列化的接口  2.不需要给注 3.不需要新建一个类    4. 在idea中需要配置
public class Person implements Serializable,HttpSessionActivationListener {
     private  String  pname;

    public String getPname() {
        return pname;
    }

    public void setPname(String pname) {
        this.pname = pname;
    }

    // 钝化
    @Override
    public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionWillPassivate");
    }
   //活化
    @Override
    public void sessionDidActivate(HttpSessionEvent httpSessionEvent) {
        System.out.println("sessionDidActivate");

    }
}

HttpSessionBindingListener 监听对象是否绑定在session==>也就是是否把这个对象存到session 里

valueBound()  表示绑定了
valueUnbound() 表示解绑了
1.不需要给注 2.不需要新建一个类

代码

public class Student implements Serializable,HttpSessionBindingListener {
    @Override
    public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("被绑定了");
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {
        System.out.println("解绑了");

    }
}

过滤器:Filter

程序中的过滤器跟生活中的定义一下  1.过滤: 过滤编码格式    2.对某些请求进行过滤
使用的一个步骤(与使用servlet的步骤是一样的):
1.写一个类  实现过滤这个接口
2.实现其抽象方法 
               init()filter 初始化所执行的方法
               doFilter() 满足过滤条件的一切请求与响应都会执行这个方法                                                    
               filterChain.doFilter(servletRequest,servletResponse); 一定放行
               destroy() 销毁的方法
 
3.在web.xml 进行配置  或者配置注解     
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")   加载的顺序是按照名字来进行排序的

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
@WebFilter(filterName = "encodingFilter",urlPatterns = "/*")
public class EncodingFilter  implements Filter {
    //filter 初始化的时候执行
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init");
    }
      //满足过滤条件的请求与响应都会执行
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
         servletRequest.setCharacterEncoding("UTF-8");
         servletResponse.setCharacterEncoding("UTF-8");
         servletResponse.setContentType("text/html;charset=utf-8");
        System.out.println("doFilter");
        //放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
  // 销毁的时候执行
    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

@WebFilter(filterName = "userFilter",urlPatterns = "/admin/*")//过滤条件
public class UserFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {//对符合过滤条件的请求进行处理
          // 首先把 ServletRequest 转化为HttpServletRequest
        HttpServletRequest  request  = (HttpServletRequest) servletRequest;
       HttpSession httpSession  =  request.getSession();
        if(httpSession.getAttribute("uname") !=null){
            //正常放行
            filterChain.doFilter(servletRequest,servletResponse);//处理完成放行
        }else{
              System.out.println("123455");
            //回到index.jsp
              request.setAttribute("msg","非法访问");
              request.getRequestDispatcher("../index.jsp").forward(servletRequest,servletResponse);
        }

    }

    @Override
    public void destroy() {

    }
}

过滤器链

一个请求与响应的路上存在多个过滤器 ==> 过滤器链执行的过程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值