-
监听器(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;
- 这种方式还可以用于保护各类动态、静态资源 完成基本的钓鱼网站请求和请求参数纠错等
-