中易网

Spring filter和拦截器的区别和执行顺序

答案:2  悬赏:40  
解决时间 2021-03-22 11:42
Spring filter和拦截器的区别和执行顺序
最佳答案
1.Filter过滤器只过滤jsp文件不过滤action请求解决方案


解决办法:在web.xml中将filter的配置放在struts2配置的前面。


2.拦截器与Filter的区别


spring的拦截器与Servlet的Filter有相似之处,比如二者都是AOP编程思想的体现,都能实现权限检查、日志记录等。不同的是:


使用范围不同:Filter是Servlet规范规定的,只能用于Web程序中。而拦截器既可以用于Web程序,也可以用于Application、Swing程序中。


规范不同:Filter是在Servlet规范中定义的,是Servlet容器支持的。而拦截器是在Spring容器内的,是Spring框架支持的。


使用的资源不同:同其他的代码块一样,拦截器也是一个Spring的组件,归Spring管理,配置在Spring文件中,因此能使用Spring里的任何资源、对象,例如Service对象、数据源、事务管理等,通过IoC注入到拦截器即可;而Filter则不能。


深度不同:Filter在只在Servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在Spring构架的程序中,要优先使用拦截器。


实际上Filter和Servlet极其相似,区别只是Filter不能直接对用户生成响应。实际上Filter里doFilter()方法里的代码就是从多个Servlet的service()方法里抽取的通用代码,通过使用Filter可以实现更好的复用。


filter是一个可以复用的代码片段,可以用来转换HTTP请求、响应和头信息。Filter不像Servlet,它不能产生一个请求或者响应,它只是修改对某一资源的请求,或者修改从某一的响应。


JSR中说明的是,按照多个匹配的Filter,是按照其在web.xml中配置的顺序来执行的。


所以这也就是,把自己的Filter或者其他的Filter(比如UrlRewrite的Filter)放在Struts的DispatcherFilter的前面的原因。因为,它们需要在请求被Struts2框架处理之前,做一些前置的工作。


当Filter被调用,并且进入了Struts2的DispatcherFilter中后,Struts2会按照在Action中配置的InterceptorStack中的Interceptor的顺序,来调用Interceptor。


3.servlet、filter、interceptor的执行顺序
@Override    
    public void doFilter(ServletRequest servletrequest,    
            ServletResponse servletresponse, FilterChain filterchain)    
            throws IOException, ServletException {    
        System.out.println("in  filter 1.");    
        filterchain.doFilter(servletrequest, servletresponse);    
        System.out.println("outing filter 1");    
    }interceptor代码:
public String intercept(ActionInvocation actioninvocation) throws Exception {    
    System.out.println("in logininterceptor");    
    String result=actioninvocation.invoke();    
    System.out.println("outing logininterceptor");    
    return result;    
}action代码:
@Override      
public String execute() throws Exception {      
    System.out.println("in loginaciton");    
    ActionContext context=ActionContext.getContext();    
    Map<String, Object> session=context.getSession();     
    session.put("userName", userName);      

        
    System.out.println("outing loginaciton");    
    return SUCCESS;      
}jsp代码:
<script type="text/javascript">       
   function submitForm(){    
      document.getElementById("form1").submit();     
   }    
</script>    

</head>    

 <body>    
   This is Login page. <br>    
   <form action="<%=path %>/login2.action" method="post" id="form1" name="form1">    
      UserName:<input type="text" id="userName" name="userName"/><input type="button" value="submit" onclick="submitForm()" id="submit1" />    
   </form>    
 </body>struts.xml
<struts>    
<package name="default" extends="struts-default" namespace="/">      

        <interceptors>    
            <interceptor name="MyInterceptor" class="Login.LoginInterceptor"></interceptor>    
            <interceptor-stack name="myInterceptorStack">    
                <interceptor-ref name="MyInterceptor"/>    
                <interceptor-ref name="defaultStack"/>    
            </interceptor-stack>    
        </interceptors>    

        <action name="login2" class="Login.LoginAction">      
                <result name="success">      
                   /Login/success.jsp      
                </result>    
                <interceptor-ref name="myInterceptorStack"></interceptor-ref>    
        </action>      

</package>    
</struts>console:
in  filter 1.  
in logininterceptor  
in loginaciton  
outing loginaciton  
outing logininterceptor  
outing filter 13.servlet、filter的执行顺序
servlet代码:
public void init() throws ServletException {     
    System.out.println("servlet初始化");    
}     

public void doPost(HttpServletRequest request, HttpServletResponse response)            
throws ServletException, IOException {     
    System.out.println("in servlet");    
    response.setContentType("text/html");     
    PrintWriter out = response.getWriter();     
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");     
    out.println("<HTML>");     
    out.println("    <HEAD><TITLE>A Servlet</TITLE></HEAD>");     
    out.println("    <BODY>");     
    out.print("        This is ");     
    out.print(this.getClass());     
    out.println(", using the POST method");          

    out.println("<br>");     
    String x = request.getParameter("x");     
    String y = request.getParameter("y");     
    out.println("x="+x);     
    out.println("<br>");     
    out.println("y="+y);     
    out.println("<br>");     

    out.println("    </BODY>");     
    out.println("</HTML>");     
    out.flush();     
    out.close();     
    System.out.println("outing servlet");    
  }     

public void destroy(){          
    System.out.println("servlet销毁");    
    super.destroy();    
}console:
servlet初始化  
in  filter 1.  
in servlet  
before HttpServletRequest  
after HttpServletRequest  
outing servlet  
outing filter 1  
当tomcat容器停止的时候,输出:servlet销毁
全部回答
spring的拦截器与servlet的filter有相似之处,比如二者都是aop编程思想的体现,都能实现权限检查、日志记录等。 不同的是: 使用范围不同:filter是servlet规范规定的,只能用于web程序中。而拦截器既可以用于web程序,也可以用于application、swing程序中。 规范不同:filter是在servlet规范中定义的,是servlet容器支持的。而拦截器是在spring容器内的,是spring框架支持的。 使用的资源不同:同其他的代码块一样,拦截器也是一个spring的组件,归spring管理,配置在spring文件中,因此能使用spring里的任何资源、对象,例如service对象、数据源、事务管理等,通过ioc注入到拦截器即可;而filter则不能。 深度不同:filter在只在servlet前后起作用。而拦截器能够深入到方法前后、异常抛出前后等,因此拦截器的使用具有更大的弹性。所以在spring构架的程序中,要优先使用拦截器。 实际上filter和servlet极其相似,区别只是filter不能直接对用户生成响应。实际上filter里dofilter()方法里的代码就是从多个servlet的service()方法里抽取的通用代码,通过使用filter可以实现更好的复用。  filter是一个可以复用的代码片段,可以用来转换http请求、响应和头信息。filter不像servlet,它不能产生一个请求或者响 应,它只是修改对某一资源的请求,或者修改从某一的响应。   jsr中说明的是,按照多个匹配的filter,是按照其在web.xml中配置的顺序 来执行的。  综上:  先执行filter 再执行 拦截器
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
用过5.8G图传和1.2G图传的朋友能帮忙选一下图
啄木鸟雕刻机是哪个国家生产的
广州天河棠下大片路
百度糯米网怎么一毛钱买爱达乐
孕后期,走路有时候会觉得小腹痛,是什么情况
是学法律的更理性呢,还是学经济更理性
手背痛是什么原因这几个月,在用电脑的时候偶
哪个游戏不充钱升级块?
如何对系统默认的约束名和索引名重命名
舌头烫伤怎么办,要几天才能好
银耳黑糖鸡蛋汤的功效
热狗,香肠,火腿肠的区别?
男孩与泡泡怪如何使用气球 男孩与泡泡怪气球
没有准考证怎么参加公务员考试
WIN7怎么制作桌面透明图标
推荐资讯
现在的课间一包是不是没有以前好吃了啊?有没
北斗七星是什么动物
喜欢一个人是不是看到他跟别的女生聊的很嗨就
关于讲文明、树新风、文明南江共建共享的作文
在厂里开玩笑意外导致他人受伤我有责任吗
眼袋老是浮肿有淤青怎么回事
长虹电视机和海尔电视机谁最好
想去做房产中介,工作需要注意什么,需要学习
孩子8岁了,食指指甲凹凸不平是什么原因?
我的快递在今天中午12点到的潍坊宝通集散中心
如果拔牙完,再带隐形牙套,一个月内会有效果
有哪些便捷式录音设备的录音效果比较好呢?
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?