JavaEE基础六之监听器、过滤器

  • 监听器(Listener)

    • 监听器作用

      • 当发生时间不确定的事件发生时,需要对其进行一些处理。请参照事件委托机制
        • 补充:换句话说就是,监听器用来在某个事件触发时进行处理。
      • 例如,上下文对象被创建或被销毁就是一个事件,会被监听到
    • 监听器相关API 包含事件类以及监听器接口

      • 补充,所以要了解,javaee提供了哪些事件,以及那些处理方法接口。处理逻辑当然自己写啦。
      • 事件类型----表示相应发生的事件
        • 请求相关的事件
          • ServletRequestEvent:创建或销毁请求对象时,触发请求事件。
          • ServletRequestAttributeEvent:该类表示请求属性事件,当请求中的属性改变,如增加、删除、覆盖请求中的属性时,触发请求属性事件。
        • 会话相关的事件
          • HttpSessionEvent:创建或销毁会话对象,活化或钝化会话对象时,将触发会话事件。
          • HttpSessionBindingEvent:该类表示会话绑定事件,当会话中的属性发生变化时,如增加、删除、覆盖会话中的属性时,将触发会话绑定事件。
        • 上下文相关的事件
          • ServletContextEvent:上下文对象创建或被销毁
          • ServletContextAttributeEvent :上下文属性增删改,比如调setAttribute、removexxx、等方法
      • 监听器类型  8种----监听事件,并执行相应的处理
        • 上下文相关的监听器
          • ServletContextListener:上下文监听器
          • ServletContextAttributeListener:上下文属性监听器
        • 请求相关的监听器
          • ServletRequestListener:请求监听器,监听ServletRequestEvent事件。
          • ServletRequestAttributeListener:请求属性监听器,用来监听ServletRequestAttributeEvent事件。
        • 会话相关的监听器
          • HttpSessionListener:会话监听器,监听HttpSessionEvent。
          • HttpSessionActivationListener:会话活化监听器,监听HttpSessionEvent事件。
          • HttpSessionAttributeListener:会话属性监听器,监听HttpSessionAttributeEvent事件。
          • HttpSessionBindingListener:会话绑定监听器,监听HttpSessionAttributeEvent事件。
    • 监听器开发与配置

      • 补充:类比一下,servlet也是继承HttpServlet然后重写方法,然后进行配置。xml或注解。
      • 创建类 实现相应的XXXListener接口 并重写相应的方法
      • xml配置:
      位置:web.xml---根目录
      <listener>
      	<listener-class>com.chinasofti.demo.listener.VisitCountsListener</listener-class>
      </listener>
      //表示Tomcat注册该监听器后。当tomcat发生事件时,调用相应的监听器处理。
      
      • 注解配置
        • @WebListener 声明该类为一个监听器
    • 上下文相关监听器

      • 事件:
        • ServletContextEvent:该类表示上下文事件,当应用上下文对象发生改变,如创建或销毁上下文对象时,将触发上下文事件。
        • ServletContextAttributeEvent:该类表示上下文属性事件,当应用上下文的属性改变,如增加、删除、覆盖上下文中的属性时,将触发上下文属性事件。
      • 监听器
        • ServletContextListener:上下文对象监听器,监听ServletContextEvent事
        • ServletContextAttributeListener:上下文属性监听器,用来监听ServletContextAttribute事件。
      • 实例:文本文件中保存网站登录人次信息,服务器重启仍然会继续累加
    • 会话相关监听器

      • 总结:我们对什么事件感兴趣,就编写相应的监听器类,然后注册。就可以用了。。
  • 过滤器

    • 过滤器作用

      • 实现:将通用的、相同的处理代码用过滤器实现,然后配置给相关资源使用即可

      • 作用:控制访问、防盗链等

      • 过滤链

        例如:
        客户端---》编码过滤器---》权限过滤器---》加密过滤器---Servlet/jsp
        //处理代码是在过滤器中,分发则是在web.xml中进行配置
        
    • 过滤器开发与配置

      • 自定义类实现Filter接口 并实现接口方法,特别是doFilter方法
      Filter接口方法:
        init( FilterConfig filterConfig)  容器初始化过滤器对象后调用,参数用于获取过滤器配置信息
        doFilter(ServletRequest request,ServletResponse response,FilterChain chain)  //处理逻辑
        destroy()  容器销毁过滤器对象前调用
        
      FilterConfig接口方法:
        getFilterName() 	 //获取web.xml中配置的Filter名字
        getInitParameter(String name)  //返回Filter中初始化参数值
        getInitParameterNames()   //返回所有初始化参数名
        getServletContext()       //获取当前上下文对象
      
      FilterChain接口:
        doFilter(request,response)    //用于传递请求和响应
        
      例子:
        public class MyFilter implements Filter{
          @Override
          public void destroy(){
            
          }
          @Override
          public void doFilter(ServletRequest arg0,ServletResponse arg1,FilterChain arg2){
            //处理逻辑
            arg2.doFilter(arg0,arg1);//表示对当前请求的过滤还没有完成,还要经过下一个过滤器
          }
        }
      
      • 过滤器配置
        • xml配置
      <filter>
      	<filter-name>CharacterFilter</filter-name>  <!--过滤器名-->
      	<filter-class>com.chinasofti.demo.filter.MyFilter</filter-class><!--过滤器全类名-->
      	<init-param><!--初始化参数-->
      		<param-name>character</param-name>
      		<param-value>utf-8</param-value>
      	</init-param>
      </filter>
      <filter-mapping>
      	<filter-name>CharacterFilter</filter-name>
      	<url-pattern>*</url-pattern><!--对哪些请求路径进行过滤-->
      	<!--配置以何种方式访问url-pattern指定的资源才被过滤 -->
      	<dispatcher>REQUEST</dispatcher><!--默认,直接URL访问、响应重定向、超链、表达那提交、静态包含-->
      	<dispatcher>FORWARD</dispatcher><!--请求转发时-->
      	<dispatcher>INCLUDE</dispatcher><!--动态包含-->
      	<dispatcher>ERROR</dispatcher>
      </filter-mapping>
      
    • 过滤器实现访问控制

    • 防盗链等其他过滤器应用场景

      • 盗链:在自己页面展示一些不在自己服务器上的内容
      • 防盗链:防止盗链
        • 基本方法:请求资源时判定请求资源和发起请求的来源是否为同一个站点
        • 原理:Http协议中的referer字段,它采用URL格式表示从哪儿链接到当前网页或文件。如果检测到来源不是本站就就进行阻止或返回指定页面。
      //--这段代码放到过滤器就可以搞定
      实例:
      //获取本站到contextroot的域名信息
      String path=request.getContextPath();
      String basePath=request.getScheme()+"://"+request.getServerName()
      	+":"+request.getServerPort()+path+"/";
      //获取上一个页面的地址
      String fromUrl=request.getHeader("referer");
      //判断是否为外站请求并返回结果 
      return fromUrl!=null&&fromUrl.startsWith(basePath)?true:false;
      
      • 这种方式还可以用于保护各类动态、静态资源 完成基本的钓鱼网站请求和请求参数纠错等
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值