`

Java中的拦截器、过滤器、监听器

 
阅读更多
http://blog.csdn.net/lzwjavaphp/article/details/13771109

一:拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,
                           在你调用方 法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
       1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。
       2.拦截器栈(Interceptor Stack)Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其
          之前定义的顺序被调用。


二: 过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,
然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),
或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。主要为了减轻服务器负载,减少压力

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);
过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;
Action处理完成返回后,拦截器还可以做其他过程,再向上返回到过滤器的后续操作。


三:监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener
           接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
                 主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。

一:拦截器 :是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,
                           在你调用方 法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。
       1.Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现。
       2.拦截器栈(Interceptor Stack)Struts2拦截器栈就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,Struts2拦截器链中的拦截器就会按其
          之前定义的顺序被调用。

[java] view plain copy print?
package com.lzw.struts.Interceptor; 
 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; 
 
public class MyInterceptor extends MethodFilterInterceptor { 
 
    private static final long serialVersionUID = -6410044851077844880L; 
     
    /**
     * 在struts.xml <param name="lzw">struts</param> 
     */ 
    private String lzw; 
     
    public String getLzw() { 
        return lzw; 
    } 
 
    public void setLzw(String lzw) { 
        this.lzw = lzw; 
    } 
 
    @Override 
    public void destroy() { 
        System.out.println("destroy!"); 
    } 
 
    @Override 
    public void init() { 
        System.out.println("init!"); 
    } 
 
    @Override 
    protected String doIntercept(ActionInvocation invocation) throws Exception { 
        System.out.println("MyInterceptor-start"); 
        System.out.println(lzw); 
        String result = invocation.invoke(); 
        System.out.println("MyInterceptor-end"); 
        return result; 
    } 

[java] view plain copy print?
package com.lzw.struts.Interceptor; 
 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor; 
 
public class FirstInterceptor extends MethodFilterInterceptor { 
 
    private static final long serialVersionUID = 1L; 
     
    @Override 
    protected String doIntercept(ActionInvocation invocation) throws Exception { 
        System.out.println("FirstInterceptor-Start"); 
        String result = invocation.invoke(); 
        System.out.println("FirstInterceptor-End"); 
        return result; 
    } 

struts.xml
[java] view plain copy print?
<?xml version="1.0" encoding="UTF-8" ?> 
 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
 
<struts> 
    <!--开发模式开关,本地可以设为true帮助调试问题,部署到服务器上设为false--> 
    <constant name="struts.devMode" value="false"/> 
    <!--务必配上该属性,否则会导致AOP注入异常-->  
    <constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true"/> 
    <constant name="struts.i18n.encoding" value="UTF-8" /> 
    <constant name="struts.multipart.maxSize" value="1000000000"/> 
    <package name="strutsLzw" extends="struts-default" namespace="/"> 
        <interceptors> 
            <interceptor name="lzwInterceptorA" class="com.lzw.struts.Interceptor.MyInterceptor"> 
                <param name="lzw">struts</param> 
            </interceptor> 
            <interceptor name="lzwInterceptorB" class="com.lzw.struts.Interceptor.FirstInterceptor"> 
            </interceptor> 
            <!-- 定义自己的拦截器栈 --> 
            <interceptor-stack name="myStack"> 
                <interceptor-ref name="lzwInterceptorA"></interceptor-ref> 
                <interceptor-ref name="lzwInterceptorB"></interceptor-ref> 
                <interceptor-ref name="defaultStack"></interceptor-ref> 
            </interceptor-stack> 
        </interceptors> 
        <!-- 全局的每个action都会拦截 --> 
        <default-interceptor-ref name="myStack"></default-interceptor-ref> 
         
        <!-- 增加method="lzwTest" 执行LoginAction的lzwTest方法 否则执行execute方法 --> 
        <action name="login" class="com.lzw.struts.action.LoginAction" method="lzwTest"> 
            <result name="success">/result.jsp</result> 
            <result name="failer">/error.jsp</result> 
            <result name="input">/error.jsp</result> 
        </action> 
    </package> 
</struts> 
或者:
[java] view plain copy print?
<?xml version="1.0" encoding="UTF-8" ?> 
 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" 
    "http://struts.apache.org/dtds/struts-2.3.dtd"> 
 
<struts> 
    <package name="strutsLzw" extends="struts-default"> 
        <interceptors> 
            <interceptor name="lzwInterceptor" class="com.lzw.struts.Interceptor.MyInterceptor"> 
                <param name="lzw">struts</param> 
            </interceptor> 
        </interceptors> 
        <!-- 增加method="lzwTest" 执行LoginAction的lzwTest方法 否则执行execute方法 --> 
        <action name="login" class="com.lzw.struts.action.LoginAction" method="lzwTest"> 
            <result name="success">/result.jsp</result> 
            <result name="failer">/error.jsp</result> 
            <result name="input">/error.jsp</result> 
            <interceptor-ref name="lzwInterceptor"></interceptor-ref> 
            <!--增加defaultStack 否则 验证拦截器不执行,也就是  validate 方法不执行--> 
            <interceptor-ref name="defaultStack"></interceptor-ref> 
        </action> 
    </package> 
</struts> 
web.xml中加入:
[java] view plain copy print?
<filter> 
     <filter-name>struts2</filter-name> 
     <!-- 已经过时了<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  --> 
     <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 
     <init-param> 
        <param-name>actionPackages</param-name> 
        <param-value>com.lzw.struts.action</param-value> 
     </init-param> 
</filter> 
<filter-mapping> 
      <filter-name>struts2</filter-name> 
      <url-pattern>/*</url-pattern> 
</filter-mapping> 
[java] view plain copy print?
package com.lzw.struts.action; 
 
import com.opensymphony.xwork2.ActionSupport; 
 
public class LoginAction extends ActionSupport{ 
 
    private static final long serialVersionUID = 1L; 
     
    private String username; 
    private String password; 
     
    public String getUsername() { 
        return username; 
    } 
    public void setUsername(String username) { 
        this.username = username; 
    } 
    public String getPassword() { 
        return password; 
    } 
    public void setPassword(String password) { 
        this.password = password; 
    } 
     
    @Override 
    public String execute() throws Exception { 
        System.out.println("=====execute====="); 
        if ("hello".equals(this.getUsername().trim()) && "world".equals(this.getPassword().trim())) { 
            return "success"; 
        } else { 
            this.addFieldError("username", "username or password error"); 
            return "failer"; 
        } 
    } 
     
    @Override 
    public void validate() { 
        System.out.println("=====validate====="); 
        if (null == this.getUsername() || "".equals(this.getUsername().trim())) { 
            this.addFieldError("username", "username required"); 
        } 
        if (null == this.getPassword() || "".equals(this.getPassword().trim())) { 
            this.addFieldError("password", "password required"); 
        } 
    } 
     
    public String lzwTest() { 
        System.out.println("======Test===="); 
        return SUCCESS; 
    } 
     


[java] view plain copy print?
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> 
<% 
String path = request.getContextPath(); 
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 
%> 
 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
     
    <title>My JSP 'login.jsp' starting page</title> 
     
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">     
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
 
  </head>  
  <body>  
      <form action="login.action" method="post">   
          username:<input type="text" name="username"><br> 
          password:<input type="password" name="password"><br> 
      <input type="submit" value="submit">  
      </form>  
  </body> 
</html> 

控制台结果:
[java] view plain copy print?
init! 
2013-10-31 13:51:15 org.apache.coyote.AbstractProtocol start 
信息: Starting ProtocolHandler ["http-apr-8080"] 
2013-10-31 13:51:15 org.apache.coyote.AbstractProtocol start 
信息: Starting ProtocolHandler ["ajp-apr-8009"] 
2013-10-31 13:51:15 org.apache.catalina.startup.Catalina start 
信息: Server startup in 1699 ms 
MyInterceptor-start 
struts 
FirstInterceptor-Start 
=====validate===== 
======Test==== 
FirstInterceptor-End 
MyInterceptor-end 
二: 过滤器:是在java web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,
然后再传入servlet或者struts的 action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),
或者在传入servlet或者struts的action前统一设置字符集,或者去除掉一些非法字符。主要为了减轻服务器负载,减少压力
[java] view plain copy print?
package com.lzw.filter.demo; 
 
import java.io.IOException; 
 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 
 
public class UserAccessFilter implements Filter{ 
 
    @Override 
    public void destroy() { 
        System.out.println("destroy!"); 
    } 
 
    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)  
            throws IOException, ServletException {   
        HttpServletRequest request = (HttpServletRequest)req;  
        HttpServletResponse response = (HttpServletResponse)res; 
        HttpSession session = request.getSession(); 
        if(session.getAttribute("user")== null && request.getRequestURI().indexOf("login.jsp")==-1 ){  
            response.sendRedirect("login.jsp");  
            return ;  
        }  
        chain.doFilter(req, res);  
    } 
 
    @Override 
    public void init(FilterConfig config) throws ServletException { 
        //ApplicationFilterConfig[name=UserFilter, filterClass=com.lzw.filter.demo.UserAccessFilter] 
        System.out.println(config.toString()); 
    } 
 


web.xml 中加入:
[java] view plain copy print?
<filter>  
        <filter-name>UserFilter</filter-name>  
        <filter-class>com.lzw.filter.demo.UserAccessFilter</filter-class>  
    </filter>  
    <filter-mapping>  
        <filter-name>UserFilter</filter-name>  
        <url-pattern>/jsp/*</url-pattern>  
    </filter-mapping>  

1、拦截器是基于java的反射机制的,而过滤器是基于函数回调
2、过滤器依赖与servlet容器,而拦截器不依赖与servlet容器
3、拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用
4、拦截器可以访问action上下文、值栈里的对象,而过滤器不能
5、在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
执行顺序 :过滤前 - 拦截前 - Action处理 - 拦截后 - 过滤后。
个人认为过滤是一个横向的过程,首先把客户端提交的内容进行过滤(例如未登录用户不能访问内部页面的处理);
过滤通过后,拦截器将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;
Action处理完成返回后,拦截器还可以做其他过程,再向上返回到过滤器的后续操作。


三:监听器:Servlet的监听器Listener,它是实现了javax.servlet.ServletContextListener
           接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。
                 主要作用是:做一些初始化的内容添加工作、设置一些基本的内容、比如一些参数或者是一些固定的对象等等。
[java] view plain copy print?
package com.lzw.filter.demo; 
 
import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
 
public class InitDataListener implements ServletContextListener { 
     
    private static ServletContext servletContext; 
     
    public static ServletContext getServletContext() { 
        return servletContext; 
    } 
 
    @Override 
    public void contextInitialized(ServletContextEvent contextEvent) { 
        servletContext = contextEvent.getServletContext(); 
        //final ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext); 
        System.out.println("服务器启动完毕!"); 
        System.out.println(servletContext); 
    } 
     
    @Override 
    public void contextDestroyed(ServletContextEvent sce) {} 
 

web.xml
[java] view plain copy print?
<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
  <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
  </welcome-file-list> 
   
   <listener> 
        <listener-class>com.lzw.filter.demo.InitDataListener</listener-class> 
   </listener> 
</web-app> 

控制台结果:
[java] view plain copy print?
信息: Starting service Catalina 
2013-10-31 15:13:55 org.apache.catalina.core.StandardEngine startInternal 
信息: Starting Servlet Engine: Apache Tomcat/7.0.42 
服务器启动完毕! 
org.apache.catalina.core.ApplicationContextFacade@7966340c 
2013-10-31 15:13:56 org.apache.coyote.AbstractProtocol start 
信息: Starting ProtocolHandler ["http-apr-8080"] 
2013-10-31 15:13:56 org.apache.coyote.AbstractProtocol start 
信息: Starting ProtocolHandler ["ajp-apr-8009"] 
2013-10-31 15:13:56 org.apache.catalina.startup.Catalina start 
信息: Server startup in 402 ms 
分享到:
评论

相关推荐

    java过滤器、监听器拦截器原理个人总结.pdf

    Java 过滤器、监听器拦截器原理个人总结 Java 过滤器是 Java Servlet 规范中的一种机制,用于对请求和响应进行过滤。过滤器可以实现用户身份验证、日志记录、数据压缩等功能。创建一个过滤器需要两个步骤:创建 ...

    学习常用知识(java,sql,oracle,ejb,ssh,struts,xml,监听器,拦截器,过滤器)

    8. **监听器、拦截器、过滤器**: 这些都是Java Servlet规范中的组件,用于扩展Web应用程序。监听器(Listeners)监听特定事件并作出响应;拦截器(Interceptors)在请求处理前后执行额外逻辑;过滤器(Filters)可以...

    Java中的拦截器、过滤器、监听器用法详解

    Java中的拦截器、过滤器、监听器用法详解 Java中的拦截器、过滤器、监听器是三个重要的概念,它们在Java Web开发中扮演着非常重要的角色。本文将详细介绍Java中的拦截器、过滤器、监听器的用法,包括它们的功能、...

    浅析JAVA中过滤器、监听器、拦截器的区别

    在Java Web开发中,过滤器(Filter)、监听器(Listener)和拦截器(Interceptor)是三种常见的组件,它们各自承担着不同的职责,本文将详细介绍这三者的概念、用途、实现方式和运行机制,并通过代码示例来进行说明...

    springboot2集成代码生成器、监听器、过滤器、拦截器、分布式定时任务、pagehelper

    本教程将探讨如何在Spring Boot 2项目中整合代码生成器、监听器、过滤器、拦截器、分布式定时任务以及PageHelper分页插件。这些组件在实际开发中都有着重要的作用。 1. **代码生成器**: 代码生成器是一种工具,...

    javaEE(上下文_监听器_过滤器) ppt

    Java EE(Java Platform, Enterprise Edition)是用于构建企业级分布式应用程序的框架,它提供了一系列标准接口和组件模型,包括上下文、监听器和过滤器。这些概念是Java EE开发中的核心组成部分,对于理解和优化Web...

    java核心技术-java中监听器和过滤器的使用笔记

    Java核心技术中的监听器和过滤器是Web开发中的关键组件,主要应用于Servlet容器中,用于增强应用程序的功能和控制请求与响应的处理流程。本篇将详细阐述Java中的Filter(过滤器)及其使用方法。 1. **Filter(过滤...

    jsp/servlet中过滤器和监听器的区别

    在这些技术中,过滤器(Filter)和监听器(Listener)是两个关键的概念,它们在处理请求、响应以及管理应用程序状态时发挥着重要作用。下面将详细讲解这两者的区别。 1. **过滤器(Filter)** - **定义**:过滤器...

    java监听器

    总的来说,Java监听器和过滤器是Java编程中重要的概念,它们帮助我们构建响应用户交互、管理应用程序状态和控制网络通信等功能。理解并熟练运用这些机制对于提升Java应用程序的用户体验和功能完整性至关重要。

    拦截器和控制器的区别

    5、拦截器是包裹在过滤器中使用的。 复习 converter 转换器 i18n struts2 spring MVC 拦截器 interceptor 过滤器 filter web.xml implements filter filterchain arg2.doFilter(req,resp); 监听器 servlet...

    过滤器和监听器教程(java)

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们主要用于增强应用程序的功能和管理应用程序的生命周期。本教程将深入探讨这两个核心组件,以帮助开发者更好地理解和应用它们。 ...

    过滤器和监听器的使用与区别

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两种非常重要的组件,它们主要用于增强应用程序的功能和管理应用程序的状态。本篇文章将详细解释这两种技术的使用、配置及其区别。 首先,我们来了解过滤...

    通过Mybatis拦截器自动定位慢SQL并记录日志

    拦截器基于Java的动态代理实现,可以拦截Mapper接口方法的调用。 接下来,我们创建一个自定义的拦截器类,用于检测慢SQL。这个类需要实现`org.apache.ibatis.plugin.Interceptor`接口,并重写`intercept`方法。在`...

    javaweb_高级_过滤器_监听器

    【JavaWeb 高级:过滤器与监听器详解】 在JavaWeb开发中,过滤器(Filter)和监听器(Listener)是两种非常重要的组件,它们能够帮助我们实现更精细的控制和管理应用程序的行为。本篇将详细介绍过滤器的原理、使用...

    servlet中的过滤器与监听器

    在Servlet技术中,过滤器(Filter)和监听器(Listener)是两个非常重要的概念,它们帮助开发者实现对请求和响应的拦截、处理以及管理应用程序的状态。 ### 1. Servlet过滤器 **过滤器** 是Servlet API提供的一种...

    关于过滤器和监听器的使用模板

    在Java Web开发中,过滤器(Filter)和监听器(Listener)是两个非常重要的组件,它们主要用于增强应用程序的功能和管理应用程序的状态。以下是关于这两个概念的详细说明。 **过滤器(Filter)** 过滤器是Servlet...

    websocket多人群聊Demo(主要演示拦截器和获取拦截器里的值).rar

    在这个"websocket多人群聊Demo"中,重点展示了WebSocket如何用于实现一个多人聊天应用,并且强调了拦截器的使用以及如何从拦截器中获取值。 首先,让我们深入了解WebSocket的基础知识。WebSocket协议是基于TCP的,...

    监听器访问计数过滤非法字符

    总之,监听器和过滤器是Java Web开发中的核心组件,它们可以帮助我们实现复杂的功能,如在线人数统计和数据安全过滤。通过合理地设计和使用这些组件,我们可以提升Web应用的性能和安全性,为用户提供更优质的体验。

    过滤器和监听器的使用

    在实际开发中,过滤器和监听器的使用应遵循一定的设计原则,如单一职责原则,避免在一个过滤器或监听器中处理过多逻辑,保持代码的可读性和可维护性。同时,合理地配置过滤器和监听器的执行顺序,可以有效地优化应用...

Global site tag (gtag.js) - Google Analytics