JSP中的Filter拦截器和Listener监听器

合集下载

javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解

javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解

javaweb中监听器、过滤器、拦截器以及AOP的先后顺序和理解java web三⼤器:过滤器、拦截器、监听器(spring框架)spring、springMVC与springBoot的关系详见:⼀、启动顺序监听器---》过滤器---》拦截器案例理解:接到上级命令,要求对电话进去监听,过滤出恐怖分⼦,然后,拦截他们的恐怖袭击⾏动。

配置位置:监听器、过滤器⼀般配置在web.xml中,拦截器⼀般配置在springmvc.xml配置⽂件中⼆、概念监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener接⼝的服务器端程序,它也是随web应⽤的启动⽽启动,只初始化⼀次,随web应⽤的停⽌⽽销毁。

主要作⽤是:做⼀些初始化的内容添加⼯作、设置⼀些基本的内容、⽐如⼀些参数或者是⼀些固定的对象等等Filter过滤器:过滤器拦截web访问url地址。

严格意义上讲,filter只是适⽤于web中,依赖于Servlet容器,利⽤Java的回调机制进⾏实现。

Filter过滤器:和框架⽆关,可以控制最初的http请求,但是更细⼀点的类和⽅法控制不了。

过滤器可以拦截到⽅法的请求和响应(ServletRequest request, ServletResponse response),并对请求响应做出像响应的过滤操作,⽐如设置字符编码,鉴权操作等⽐如:(不是login.do的地址请求,如果⽤户没有登陆都过滤掉),或者在传⼊servlet或者struts的action前统⼀设置字符集,或者去除掉⼀些⾮法字符。

主要为了减轻服务器负载,减少压⼒。

Interceptor拦截器:拦截器拦截以 .action结尾的url,拦截Action的访问。

Interfactor是基于Java的反射机制(APO思想)进⾏实现,不依赖Servlet容器。

拦截器可以在⽅法执⾏之前(preHandle)和⽅法执⾏之后(afterCompletion)进⾏操作,回调操作(postHandle),可以获取执⾏的⽅法的名称,请求(HttpServletRequest)Interceptor:可以控制请求的控制器和⽅法,但控制不了请求⽅法⾥的参数(只能获取参数的名称,不能获取到参数的值)(⽤于处理页⾯提交的请求响应并进⾏处理,例如做国际化,做主题更换,过滤等)。

04_Filter_Listener

04_Filter_Listener

两个当作它的参数就可以了;
在web.xml注册这个Filter,以及它将过滤的页面或Servlet程序。
配置过滤器
与Servlet一样,过滤器也是Web应用的一个组件,因此过滤器也
需要在Web应用的配置文件web.xml中进行配置。
过滤器的配置包括两个部分:第一部分是过滤器在Web应用中的 定义(有时也称为注册),由<filter>元素表示,主要包括<filtername>和<filter-class>两个必须的子元素和<init-param>、<icon>、 <display-name>、<description>这4个可选的子元素;另一部分则是对
配置代码:
<filter> <filter-name>FilterProcess</filter-name>
<filter-class>packagename.FilterClassName</filter-class>
<init-param> <param-name>ParamName1</param-name> <param-value>ParamValue1</param-value> </init-param> <init-param> <param-name>ParamName2</param-name>
Filter 与 Listener
Servlet过滤器—Filter
主要用途:
当客户端请求某个网页(HTML/JSP/Servlet)之前,让过滤器先 对其进行适当的“过滤”;或者当服务器端对客户端的请求做出 响应之前,让过滤器先对其进行适当的“过滤”; 在从一个页面跳转到其他页面的时候;

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三大器之拦截器(Interceptor)的实现原理及代码示例

Java三⼤器之拦截器(Interceptor)的实现原理及代码⽰例1,拦截器的概念java⾥的拦截器是动态拦截Action调⽤的对象,它提供了⼀种机制可以使开发者在⼀个Action执⾏的前后执⾏⼀段代码,也可以在⼀个Action执⾏前阻⽌其执⾏,同时也提供了⼀种可以提取Action中可重⽤部分代码的⽅式。

在AOP中,拦截器⽤于在某个⽅法或者字段被访问之前,进⾏拦截然后再之前或者之后加⼊某些操作。

⽬前,我们需要掌握的主要是Spring的拦截器,Struts2的拦截器不⽤深究,知道即可。

2,拦截器的原理⼤部分时候,拦截器⽅法都是通过代理的⽅式来调⽤的。

Struts2的拦截器实现相对简单。

当请求到达Struts2的ServletDispatcher时,Struts2会查找配置⽂件,并根据配置实例化相对的拦截器对象,然后串成⼀个列表(List),最后⼀个⼀个的调⽤列表中的拦截器。

Struts2的拦截器是可插拔的,拦截器是AOP的⼀个实现。

Struts2拦截器栈就是将拦截器按⼀定的顺序连接成⼀条链。

在访问被拦截的⽅法或者字段时,Struts2拦截器链中的拦截器就会按照之前定义的顺序进⾏调⽤。

3,⾃定义拦截器的步骤第⼀步:⾃定义⼀个实现了Interceptor接⼝的类,或者继承抽象类AbstractInterceptor。

第⼆步:在配置⽂件中注册定义的拦截器。

第三步:在需要使⽤Action中引⽤上述定义的拦截器,为了⽅便也可以将拦截器定义为默认的拦截器,这样在不加特殊说明的情况下,所有的Action都被这个拦截器拦截。

4,过滤器与拦截器的区别过滤器可以简单的理解为“取你所想取”,过滤器关注的是web请求;拦截器可以简单的理解为“拒你所想拒”,拦截器关注的是⽅法调⽤,⽐如拦截敏感词汇。

4.1,拦截器是基于java反射机制来实现的,⽽过滤器是基于函数回调来实现的。

(有⼈说,拦截器是基于动态代理来实现的)4.2,拦截器不依赖servlet容器,过滤器依赖于servlet容器。

listener、filter、servlet内存马原理

listener、filter、servlet内存马原理

listener、filter、servlet内存马原理Listener、Filter、Servlet内存马原理引言随着Web应用程序的快速发展,保护Web应用程序的安全性变得越来越重要。

然而,Web应用程序中的安全漏洞却层出不穷,其中包括内存马(memshell)的攻击方式。

内存马指的是一种攻击技术,通过在服务器内存中注入恶意代码来获取对服务器的控制权。

本文将围绕Listener、Filter和Servlet这三个核心组件展开讨论,探究内存马攻击在这些组件中的原理及防御措施。

一、Listener的基本原理在Java Web应用程序中,Listener是一种用于监听Web应用程序中特定事件的组件。

它可以监听ServletContext(应用程序级别)、HttpSession(会话级别)和ServletRequest(请求级别)等不同级别的事件。

当某个事件发生时,Listener可以执行预定义的操作。

1.1 Listener的注册和触发在Web应用程序启动时,容器会根据部署描述文件(web.xml)中的配置自动注册Listener。

当发生事件时,容器会触发相应的事件监听器进行处理。

1.2 Listener内存马原理攻击者可以通过Listener注入恶意代码来执行恶意操作。

具体来说,攻击者将恶意代码编写到一个实现了特定监听器接口的类中,并将该类的实例注册到应用程序中。

当事件触发时,容器会调用相应的监听器方法。

如果存在恶意代码,它将被执行,并可能对服务器进行攻击,如获取敏感信息、操纵服务器配置等。

1.3 Listener的防御措施为了保护Web应用程序免受Listener注入攻击,我们可以采取以下措施:- 避免使用不必要的Listener:只注册需要的Listener,避免不必要的风险。

- 对注册的Listener进行严格审查:审查应用程序中注册的Listener代码,确保它们不包含任何可疑的操作。

- 限制Listener的执行权限:使用安全策略文件(security policy)对Listener的执行权限进行限制,仅允许它们执行必要的操作。

Filter 与 Listener

Filter 与 Listener

ServletContextListener
• ServletContext Listener 接口有两个:
– ServletContextListener
• 一个实现ServletContextListener接口的程序,当 Container启动时,程序会自动开始监听的工作, 它首先会调用contextInitialized()接收对应的 javax.servlet.ServletContextEvent事件。
– ServletRequestAttributeListener
• 该接口和ServletContextAttributeListener接口功 能相似,只不过该接口监听Request范围的变化。
HttpSession Listener
• HttpSessionAttributeListener
– 和ServletContextAttributeListener接口类似,只不 过该接口是监听Session范围的变化的。 – HttpSessionAttributeListener和 HttpSessionBindingListener两个功能很相似,但是 也有一些不同点:
– ERROR
• 当用户的请求是通过错误机制处理的时候,才会通过此Filter。
Filter 的运作方式
• 简要介绍web.xml中Filter的设定值:
<filter> <filter-name>filterSample</filter-name> <filter-class>com.lesson11.filterSample</filter-class> </filter> <filter-mapping> <filter-name>filterSample</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> <dispatcher>ERROR</dispatcher> </filter-mapping>

jsp实用两例:用filter解决汉字编码及禁止页面缓存_和_用listener实现

jsp实用两例:用filter解决汉字编码及禁止页面缓存_和_用listener实现

1.用filter解决汉字编码及禁止页面缓存 (不用再在每个页面里去加那几行代码了): package beanservlettest; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class servfilter extends HttpServlet implements Filter { private FilterConfig filterConfig; //Handle the passed-in FilterConfig public void init(FilterConfig filterConfig) { this.filterConfig = filterConfig; } //Process the request/response pair public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { request.setCharacterEncoding("GB2312");//设置编码((HttpServletResponse)response).setHeader("Pragma","No-cache"); ((HttpServletResponse)response).setHeader("Cache-Control","no-cache"); ((HttpServletResponse)response).setHeader("Expires","0");//禁止缓存 //自己添加的代码就这上面四行,其它的都是Jbuilder自动生成的:) filterChain.doFilter(request, response); } catch(ServletException sx) { filterConfig.getServletContext().log(sx.getMessage()); } catch(IOException iox) { filterConfig.getServletContext().log(iox.getMessage()); } } //Clean up resources public void destroy() { } } 下面是在web.xml里的配置:(我的是Jbuilder自动生成的)servfilter beanservlettest.servfilter servfilter /* ///这里表示对整个网站都有效2.用listener实现在线人数统计. package beanservlettest;//除了其中三行代码,其余均由Jbuilder自动生成import javax.servlet.*; import javax.servlet.http.*; import java.io.*; import java.util.*; public class sessioncount extends HttpServlet implements ServletContextListener, ServletContextAttributeListener, HttpSessionListener, HttpSessionAttributeListener { private static int activeSessions = 0; public void contextInitialized(ServletContextEvent sce) { } public void contextDestroyed(ServletContextEvent sce) { } public void attributeAdded(ServletContextAttributeEvent scab) { } public void attributeRemoved(ServletContextAttributeEvent scab) { } public void attributeReplaced(ServletContextAttributeEvent scab) { } public void sessionCreated(HttpSessionEvent se) { activeSessions++;//每创建一个新的session 就加1 } public void sessionDestroyed(HttpSessionEvent se) { if(activeSessions > 0) //每销毁一个新的session就减 1 activeSessions--; } public void attributeAdded(HttpSessionBindingEvent se) { } public void attributeRemoved(HttpSessionBindingEvent se) { } public void attributeReplaced(HttpSessionBindingEvent se) { } public static int getActiveSessions() { return activeSessions; } } web.xml里的配置如下:beanservlettest.sessioncount jsp测试页面:JBuilder Generated JSP当前在线人数有人。

java_过滤器、监听器_拦截器_原理个人总结

java_过滤器、监听器_拦截器_原理个人总结

过滤器创建一个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的一种实现.解析:--------------------------------------------------------------------------------------------拦截器和AOP的关系拦截器与AOP (Aspect Orient Program ,面向切面编程)是密切相关的,AOP 从程序运行角度来考虑程序的流程,取得业务处理过程的切面,在特定切面通过系统自动插入特定方法。

web.xml中的listener、filter、servlet加载顺序及其详解

web.xml中的listener、filter、servlet加载顺序及其详解

web.xml中的listener、filter、servlet加载顺序及其详解在项⽬中总会遇到⼀些关于加载的优先级问题,刚刚就遇到了⼀个问题,由于项⽬中使⽤了quartz任务调度,quartz在web.xml中是使⽤listener进⾏监听的,使得在tomcat启动的时候能马上检查数据库查看那些任务未被按时执⾏,⽽数据库的配置信息在是在web.xml中使⽤servlet配置的,导致tomcat启动后在执⾏quartz任务时报空指针,原因就是servlet中的数据库连接信息未被加载。

⽹上查询了下web.xml中配置的加载优先级:⾸先可以肯定的是,加载顺序与它们在 web.xml ⽂件中的先后顺序⽆关。

即不会因为 filter 写在 listener 的前⾯⽽会先加载 filter。

最终得出的结论是:listener -> filter -> servlet同时还存在着这样⼀种配置节:context-param,它⽤于向 ServletContext 提供键值对,即应⽤程序上下⽂信息。

我们的 listener, filter 等在初始化时会⽤到这些上下⽂中的信息,那么 context-param 配置节是不是应该写在 listener 配置节前呢?实际上 context-param 配置节可写在任意位置,因此真正的加载顺序为:context-param -> listener -> filter -> servlet对于某类配置节⽽⾔,与它们出现的顺序是有关的。

以 filter 为例,web.xml 中当然可以定义多个 filter,与 filter 相关的⼀个配置节是filter-mapping,这⾥⼀定要注意,对于拥有相同 filter-name 的 filter 和 filter-mapping 配置节⽽⾔,filter-mapping 必须出现在 filter 之后,否则当解析到 filter-mapping 时,它所对应的 filter-name 还未定义。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

JSP中的Filter过滤器和Listener监听器1. JSP中的过滤器1.1 什么是过滤器过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上。

过滤器可附加到一个或多个servlet 或JSP页面上,并且可以检查进入这些资源的请求信息。

在这之后,过滤器可以作如下的选择:(1)以常规的方式调用资源(即,调用servlet或JSP页面)。

(2)利用修改过的请求信息调用资源。

(3)调用资源,但在发送响应到客户机前对其进行修改。

(4)阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出。

1.2 过滤器的基本原理过滤器可以对客户的请求进行处理,处理完成后,它会交给下一个过滤器处理。

这样,客户的请求在“过滤器链”里逐个处理,直到请求发送到目标为止。

例如,某网站里有提交“修改业务数据”的网页,当用户填写完修改信息并提交后,服务器在进行处理时需要做两项工作:判断客户端的会话查看该用户是否有修改权限;对提交的数据进行统一编码。

这两项工作可以在由两个过滤器组成的过滤链里进行处理。

当过滤器处理成功后,把提交的数据发送到最终目标;如果过滤器处理不成功,将把视图派发到指定的错误页面。

1.3 过滤器的使用开发Servlet过滤器的步骤如下:(1)编写实现Filter接口的类;(2)在web.xml中配置Filter。

1.3.1 实现Filter接口类Filter接口定义了以下方法:成员描述destory() 由Web容器调用,初始化此Filter。

init(FilterConfig filterConfig) 由Web容器调用,初始化此Filter。

doFilter(ServletRequest request, 具体过滤处理代码,其中FilterChain参数非常重要,允许通ServletResponse response,FilterChain chain) 过当前过滤器时须要调用FilterChain.doFilter()下面示例实现一个权限过滤器,若用户尚未登录(Session中没有保存用户信息),将回到登录页面;若已经登录则继续该请求。

public class SecurityFilter implements Filter {public void destroy() { }public void doFilter(ServletRequest req, ServletResponse resp,FilterChain chain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) req;HttpSession session = request.getSession();if(session.getAttribute("user")==null){request.getRequestDispatcher("/login.jsp").forward(request, resp);}else{chain.doFilter(req, resp);}}public void init(FilterConfig arg0) throws ServletException { }}1.3.2 在web.xml中配置Filter要使得Filter生效,还必须在web.xml中对其进行配置,告知服务器,该过滤器应用在什么模式的URL请求上。

<filter><filter-name>securityFilter</filter-name><filter-class>com.securityDemo.filter.SecurityFilter</filter-class></filter><filter-mapping><filter-name>securityFilter</filter-name><url-pattern>/admin/*</url-pattern></filter-mapping>这一段Filter的配置和Servlet的配置很相似,其中“蓝字”部份声明了须要应用的过滤器类,“红字”部份声明了该过滤器所应用的URL路径,就是说在/admin/虚拟目录下的所有请求都要经过该过滤器。

2. JSP中的监听器Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止、Session会话的开始和销毁、用户请求的开始和结束等等。

有时程序员需要在这些事件发生的时机执行一些处理,以完成特定的任务(如通过监控Session的开始和结束,可统计网站的在线人数)。

事实上,这些事件是可以编码处理的,Servelt API提供了大量的监听器Listener来监听Web程序中发生的这些事件,程序员只要实现恰当的特定的事件监听器,就可以对该事件进行处理。

使用监听器需要两个步骤:第一,实现特定的Listener类,编写事件处理;第二,通过web.xml(或者Annotation)配置启用该Listener。

2.1. 实现Listener。

在JSP 2.0/Servlet 2.4中,共有八个Listener接口,六个Event事件类别,实现Listener时,需实现对应的接口。

这些接口及其功能,详见下表所示:监听器接口实现方法事件执行时机ServletContextListener contextInitialized()contextDestroyed()ServletContextEvent加载Web应用时(如启动服务器后),会调用contextInitialized(),移除Web应用时(服务器停止),会调用contextDestroyed ()方法。

ServletContextAttributeListener attributeAdded()attributeReplaced()attributeRemoved()ServletContextAttributeEvent向application设置属性、置换、移除属性时依次调用这三个方法HttpSessionListener sessionCreated() HttpSessionEvent 在HttpSession对象创建和销sessionDestroyed () 毁时会依次调用这两个方法HttpSessionAttributeListener attributeAdded()attributeReplaced()attributeRemoved()HttpSessionBindingEvent向Session设置属性、置换、移除属性时依次调用这三个方法HttpSessionActivationListener sessionDidActivate()sessionWillPassivate()HttpSessionEvent当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以,这两个方法分别执行于Activeate之后与Passivate之前ServletRequestListener requestInitialized()requestDestroyed()RequestEvent在HttpServletRequest对象创建和销毁时会依次调用这两个方法ServletRequestAttributeListener attributeAdded()attributeReplaced()attributeRemoved()ServletRequestAttributeEvent向request对象设置属性、置换、移除属性时依次调用这三个方法HttpSessionBindingListener valueBound()valueUnbound()HttpSessionBindingEvent其实例被加入至session对象的属性中,则调valueBound(),若从session对象的属性中移除,则调valueUnbound();实现HttpSessionBindingListener接口的类无需在web.xml配置注意:HttpSessionBindingListener和HttpSessionListener之间的最大区别:HttpSessionListener只需要设置到web.xml中就可以监听整个应用中的所有session。

HttpSessionBindingListener必须实例化后放入某一个session中,才可以进行监听。

从监听范围上比较,HttpSessionListener设置一次就可以监听所有session,HttpSessionBindingListener 通常都是一对一的。

下面的示例实现了HttpSessionListener监听器,用于统计网站的在线人数。

网站的在线人数往往是一个近似值,统计时一般以Session尚未过期的用户人数作为在线人数计算。

public class MyHttpSessionListener implements HttpSessionListener {public void sessionCreated(HttpSessionEvent event) {HttpSession sess = event.getSession();ServletContext application = sess.getServletContext();Integer online = (Integer)application.getAttribute("online");if(online != null)online++;elseonline = 1;application.setAttribute("online", online);}public void sessionDestroyed(HttpSessionEvent event) {HttpSession sess = event.getSession();ServletContext application = sess.getServletContext();Integer online = (Integer)application.getAttribute("online");if(online != null)online--;elseonline = 0;application.setAttribute("online", online);}}2.2 通过web.xml配置,启用监听器。

相关文档
最新文档