java中的拦截器与过滤器

来源:互联网 发布:食品数据分析公司 编辑:程序博客网 时间:2024/04/29 14:00

1 过滤器 主要是应用于servlet,现在都说拦截器。 也就是说servlet的过滤器与SpringMVC拦截器之间的关系与区别

2 你的每一个请求都会先进你写的拦截器在进入你写的方法,不破坏你的业务逻辑  在你的业务之外做一些其他事情

3 在xml中配置的目的是为了找到这个文件(类),这个文件(类)的内容很正常 就是写方法实现自己的业务


198 拦截器:1 还可以用来转码 过滤一些特殊字 检测一个账号不能重复登录。看自己需求啊 你只要明白你的每一个请求都会先进你写的拦截器在进入你写的方法
            2 可作事还是挺 多的,只要作的事跟请求和响应有关。例如:访问日志(记录访客的ip,来源),在线统计人数,字符集转换,身份验证
            3  不破坏你的业务逻辑  在你的业务之外做一些其他事情
            4拦截器:是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现

,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。

过滤器Filter:过滤器一般是用责任链来实现的,一般我们需要处理过滤的参数的时候来用,比如我们在使用Struts2的时候,需要过滤*.do的请求,我们可以使用过滤器,DispatchFilter处理完之后交给下一个过滤器使用就可以了;

拦截器Interceptor:当我们有一个方法需要在执行之前或之后对其进行拦截,比如:

void test() {
//前面我们需要加身份认证
 System.out.println("你好");
//认证完之后我们需要打印处理成功
}

监听Listner:这个主要应用于事件监听,比如我现在要处理一个按钮,当点击这个按钮的时候,会触发一个Click事件,这个就是监听


http://blog.csdn.net/chenleixing/article/details/44573495


http://blog.csdn.net/u013322876/article/details/50623495

http://blog.csdn.net/qq_36411874/article/details/53996873

区别:

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

    拦截器:是在面向切面编程的就是在你的service或者一个方法,前调用一个方法,或者在方法后调用一个方法比如动态代理就是拦截器的简单实现,在你调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在你调用方法后打印出字符串,甚至在你抛出异常的时候做业务逻辑的操作。 

下面通过实例来看一下过滤器和拦截器的区别: 

使用拦截器进行/admin 目录下jsp页面的过滤 
<package name="newsDemo"extends="struts-default" 
       namespace="/admin"> 
       <interceptors> 
           <interceptor name="auth"class="com.test.news.util.AccessInterceptor"/> 
           <interceptor-stackname="authStack"> 
               <interceptor-ref name="auth"/> 
           </interceptor-stack> 
       </interceptors> 
       <!-- action --> 
       <action name="newsAdminView!*"class="newsAction" 
           method="{1}"> 
           <interceptor-refname="defaultStack"/> 
           <interceptor-refname="authStack"> 
           </interceptor-ref>             

下面是我实现的Interceptor class: 

package com.test.news.util; 

import java.util.Map; 

import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
importcom.opensymphony.xwork2.interceptor.AbstractInterceptor; 
import com.test.news.action.AdminLoginAction; 

 

public class AccessInterceptor extends AbstractInterceptor{ 

    privatestatic final long serialVersionUID =-4291195782860785705L; 

   @Override 
    publicString intercept(ActionInvocation actionInvocation) throwsException { 
        ActionContext actionContext =actionInvocation.getInvocationContext(); 
        Map session = actionContext.getSession(); 
        
       //except login action 
        Object action = actionInvocation.getAction(); 
       if (action instanceof AdminLoginAction) { 
           return actionInvocation.invoke(); 
        } 
       //check session 
       if(session.get("user")==null ){ 
           return "logout"; 
        } 
       return actionInvocation.invoke();//go on 
    } 

} 

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

使用过滤器进行/admin 目录下jsp页面的过滤,首先在web.xml进行过滤器配置: 

     
<filter> 
       <filter-name>accessfilter</filter-name> 
       <filter-class> 
            com.test.news.util.AccessFilter 
       </filter-class> 
   </filter> 
   <filter-mapping> 
       <filter-name>accessfilter</filter-name> 
       <url-pattern>/admin 
    
    public voiddestroy() { 

    } 
   public void doFilter(ServletRequest arg0, ServletResponsearg1, 
            FilterChain filterChain) throws IOException, ServletException{ 
        HttpServletRequest request =(HttpServletRequest)arg0; 
        HttpServletResponse response =(HttpServletResponse)arg1; 
        HttpSession session = request.getSession(); 
       if(session.getAttribute("user")== null&&request.getRequestURI().indexOf("login.jsp")==-1){ 
            response.sendRedirect("login.jsp"); 
           return ; 
        } 
        filterChain.doFilter(arg0, arg1); 

    } 

    public voidinit(FilterConfig arg0) throws ServletException { 

    } 

}




过滤器和拦截器的区别:

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

  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。



0 0
原创粉丝点击