转:

过滤器、监听器 拦截器

过滤器 创建一个 Filter 只需两个步骤:

(1)创建 Filter 处理类:

(2)在 web.xml 文件中配置 Filter 。

创建 Filter 必须实现 javax.servlet.Filter 接口,在该接口中定义了三个方法。

? void init(FilterConfig config): 用于完成 Filter 的初始化。

? void destroy(): 用于 Filter 销毁前,完成某些资源的回收。

? void doFilter(ServletRequest request, ServletResponse response,FilterChain chain): 实 现过滤功能,该方法就是对每个请求及响应增加的额外处理。

过滤器 Filter 也具有生命周期:

init()->doFilter()->destroy(), 由部署文件中的 filter 元素驱动。

在 servlet2.4 中,过滤器同样可以用于请求分派器,但须在 web.xml 中声明, <dispatcher>INCLUDE 或 FORWARD 或 REQUEST 或 ERROR</dispatcher>该元素位于 filter-mapping 中。

一、理解 Struts2 拦截器

1. Struts2 拦截器是在访问某个 Action 或 Action 的某个方法,字段之前或之后实施拦截, 并且 Struts2 拦截器是可插拔的,拦截器是AOP的一种实现.

2. 拦截器栈(Interceptor Stack)。Struts2 拦截器栈就是将拦截器按一定的顺序联结成一 条链。在访问被拦截的方法或字段时,Struts2 拦截器链中的拦截器就会按其之前定义的顺 序被调用。

二、实现 Struts2 拦截器原理

 Struts2 拦截器的实现原理相对简单, 当请求 struts2 的 action 时, Struts 2 会查找配置文件, 并根据其配置实例化相对的 中的拦截器

三、定义 Struts2 拦截器。

  Struts2 规定用户自定义拦截器必须实现 com.opensymphony.xwork2.interceptor.Interceptor 接口。该接口声明了 3 个方法, 拦截器对象,然后串成一个列表,最后一个一个地调用列表


void init();

void destroy(); String intercept(ActionInvocation invocation) throws Exception;
其中,init 和 destroy 方法会在程序开始和结束时各执行一遍,不管使用了该拦截器与否, 只要在 struts.xml 中声明了该 Struts2 拦截器就会被执行。 intercept 方法就是拦截的主体了,每次拦截器生效时都会执行其中的逻辑。 不过,struts 中又提供了几个抽象类来简化这一步骤。

public abstract class AbstractInterceptor implements Interceptor; public abstract class MethodFilterInterceptor extends AbstractInterceptor;
都是模板方法实现的。 其中 AbstractInterceptor 提供了 init()和 destroy()的空实现,使用时只需要覆盖 intercept() 方法; 而 MethodFilterInterceptor 则提供了 includeMethods 和 excludeMethods 两个属性,用来 过滤执行该过滤器的 action 的方法。可以通过 param 来加入或者排除需要过滤的方法。 一般来说,拦截器的写法都差不多。看下面的示例:

package interceptor; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; public class MyInterceptor implements Interceptor { public void destroy() { // TODO Auto-generated method stub } public void init() { // TODO Auto-generated method stub } public String intercept(ActionInvocation invocation) throws Exception { System.out.println("Action 执行前插入 代码"); //执行目标方法 (调用下一个拦截器, 或执行 Action)

final String res = invocation.invoke(); System.out.println("Action 执行后插入 代码"); return res; } }

四、配置 Struts2 拦截器 Struts2 拦截器需要在 struts.xml 中声明,如下 struts.xml 配置文件

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.objectFactory" value="spring" />

<package name="default" extends="struts-default"> <interceptors> <interceptor name="MyInterceptor" class="interceptor.MyInterceptor"></interceptor> <interceptor-stack name="myInterceptorStack"> <interceptor-ref name="MyInterceptor"/> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <action name="loginAction" class="loginAction"> <result name="fail">/index.jsp </result> <result name="success">/success.jsp</result> <interceptor-ref

name="myInterceptorStack"></interceptor-ref> </action> </package> </struts>

拦截器与过滤器的区别 : 1. 拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。 2. 拦截器不依赖与 servlet 容器,过滤器依赖与 servlet 容器。 3. 拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用。 4. 拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。 5. 在 action 的生命周期中, 拦截器可以多次被调用, 而过滤器只能在容器初始化时 被调用一次

监听器概述
1.Listener 是 Servlet 的监听器

2.可以监听客户端的请求、服务端的操作等。

3.通过监听器, 可以自动激发一些操作, 如监听在线用户数量,当增加一个 HttpSession 时, 给在线人数加 1。

4.编写监听器需要实现相应的接口

5.编写完成后在 web.xml 文件中配置一下,就可以起作用了

6.可以在不修改现有系统基础上,增加 web 应用程序生命周期事件的跟踪

3.HttpSessionListener

常用接口监听 HttpSession 的操作。 当创建一个 Session 时, 激发 session Created(SessionEvent se) 方法;当销毁一个 Session 时,激发 sessionDestroyed (HttpSessionEvent se)方法。

4.HttpSessionAttributeListener 监听 HttpSession 中的属性的操作。

当在 Session 增加一个属性时,激发 attributeAdded(HttpSessionBindingEvent se) 方法;当在 Session 删除一个属性时,激发 attributeRemoved(HttpSessionBindingEvent se)方法;当在 Session 属性被重新设置时, 激发 attributeReplaced(HttpSessionBindingEvent se) 方法。

使用范例: 由监听器管理共享数据库连接

生命周期事件的一个实际应用由 context 监听器管理共享数据库连接。

在 web.xml 中如下 定义监听器: <listener> <listener-class>XXX.MyConnectionManager</listener-class> </listener> ?

server 创建监听器的实例,接受事件并自动判断实现监听器接口的类型。

要记住 的是由于监听器是配置在部署描述符 web.xml 中,所以不需要改变任何代码就可以添加新 的监听器。

public class MyConnectionManager implements ServletContextListener{ public void contextInitialized(ServletContextEvent e) { Connection con = // create connection e.getServletContext().setAttribute("con", con);

} public void contextDestroyed(ServletContextEvent e) { Connection con = (Connection) e.getServletContext().getAttribute("con"); try { con.close(); } catch (SQLException ignored) { } // close connection } } 监听器保证每新生成一个 servlet context 都会有一个可用的数据库连接,并且所有的连接对 会在 context 关闭的时候随之关闭。

计算在线用户数量的 Linstener (1) Package xxx;

public class OnlineCounter { private static long online = 0; public static long getOnline(){ return online;

} public static void raise(){ online++; } public static void reduce(){ online--; } }

import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener;

public class OnlineCounterListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent hse) { OnlineCounter.raise(); } public void sessionDestroyed(HttpSessionEvent hse){ OnlineCounter.reduce(); } }

在需要显示在线人数的 JSP 中可是使用 目前在线人数: <%@ page import=“xxx.OnlineCounter" %> <%=OnlineCounter.getOnline()%>

退出会话(可以给用户提供一个注销按钮): <form action="exit.jsp" method=post> <input type=submit value="exit"> </form>

exit.jsp: <%session.invalidate() ;%>

在 web.xml 中加入: <listener> <listener-class>servletlistener111111.SecondListener</listener-class> </listener>

转载于:https://www.cnblogs.com/nucdy/p/5761111.html

struts2 javaweb 过滤器、监听器 拦截器 原理相关推荐

  1. 过滤器-监听器-拦截器对比

    1,拦截器的概念     java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action 执行前阻止其执行,同时也提 ...

  2. Struts2中过滤器,拦截器,监听器他们之间有什么区别?

    1.拦截器是基于java反射机制的,而过滤器是基于函数回调的. 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器. 3.拦截器只能对Action请求起作用,而过滤器则可以对几乎所 ...

  3. springBoot 2.x过滤器--监听器--拦截器

    springboot 2.x过滤器 1.什么是 springboot 2.x过滤器 类似于检票员,检验游客的门票 2.springboot里的过滤器 ApplicationContextHeaderF ...

  4. 过滤器和拦截器(SpringMVC实现)

    拦截器是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强. 使用场景:解决请求的共性问题,如:乱码问题.权限验证问题等 过滤器实现乱码问题 Spring MVC默认提供了CharacterEnc ...

  5. JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别

    JavaWeb中监听器Listener+过滤器filter+拦截器interceptor区别 如果从整个项目中看,一个servlet请求的执行过程就变成了这样context-param–>lis ...

  6. java ssh过滤器_SSH中的过滤器,拦截器,监听器的一些基本认识

    今天被一个朋友问起在SSH的项目中,过滤器.拦截器.监听器都分别是什么,又都是干什么用的.结合目前学习到的和自己应用的体会,大概有以下几个方面. 1.过滤器:顾名思义就是过滤请求内容的,所谓的过滤就是 ...

  7. struts2 过滤器和拦截器的区别和使用

    struts2 过滤器和拦截器的区别和使用 java web 过滤器和拦截器的区别和使用  1.1 什么是拦截器:      拦截器,在AOP(Aspect-Oriented Programming) ...

  8. 过滤器、拦截器、监听器的区别与使用

    一.拦截器与过滤器的区别 过滤器 (Filter) 过滤器的配置比较简单,直接实现Filter 接口即可,也可以通过@WebFilter注解实现对特定URL拦截,看到Filter 接口中定义了三个方法 ...

  9. Struts2 过滤器与拦截器

    学习Struts2时,发现有过滤器和拦截器,他们貌似都是一样的功能,但是为什么会有2个不同的名称呢?肯定是有区别的,所以打算自己整理一下. 过滤器,是在java web中,你传入的request,re ...

最新文章

  1. gets scanf以及缓冲区域的问题
  2. sqlserver删除指定列失败
  3. Entity Framework6学习笔记(一)
  4. idea 用iterm 终端_iTerm2 都不会用,还敢自称老司机?(上)
  5. leetcode - 673. 最长递增子序列的个数
  6. 简单易懂设计模式——简单工厂模式
  7. 章子欣父亲发声:感谢提供帮助的媒体,包括百度
  8. 【Spark调优】内存模型与参数调优
  9. win7计算机地址栏在那,win7系统如何使用地址栏功能|win7系统使用地址栏的方法...
  10. 从jsp页面到servlet传值的不同方式
  11. ARM 与 STM32 的关系
  12. 金角大王 python_【51CTO学院三周年】 老男孩python全栈心路
  13. 【MATLAB图像读取】
  14. 【数据挖掘】二手车交易价格预测(三)数据分析
  15. Am335x SD卡 启动制作
  16. vue中yarn install报错:info There appears to be trouble with your network connection. Retrying…
  17. 2022年江苏省职业院校技能大赛网络搭建与应用赛项中职样卷
  18. 总是在崩溃的边缘徘徊,可能这就是成年人的生活吧!!!!
  19. 联想320s笔记本能装服务器系统,联想ideapad 320S-15笔记本怎么安装win7系统
  20. 那些 Cynthia 教我的事 之 PMSec (三)

热门文章

  1. JAVA编写的一个简单的Socket实现的HTTP响应服务器
  2. 索尼高清影视技术学院参观观后感
  3. python twisted应用_如何通过Python(而不是通过Twisted)运行Twisted应用程序?
  4. java graphics旋转_Java图像之自定义角度旋转(实例)
  5. Proxy error: Could not proxy request错误解决
  6. 一个不会画流程图的程序员不是一个好码农
  7. svn: E155007 和 E155004
  8. Kaggle 比赛分类与学习资源整理
  9. 【w3cschool】C语言复习
  10. 【CSP201312-4】有趣的数(数位DP)