zoukankan      html  css  js  c++  java
  • ssh2——Interceptor拦截器

           尽管没学过struts1吧。可是了解到struts1中并没有拦截器,  到Struts2才有。它是基于WebWork发展起来的, 顾名思义,说到拦截器大家首先肯定会想到它是拦截东西的,起到一个限制的作用。那么好,在这里它是拦截什么的呢?在struts2中拦截器是用来拦截Action的。在运行Action之前拦截器会起一定的作用,运行一些预先处理的代码, 接着去运行Action中相关的方法,之后,又会回到拦截器里面,接着去运行兴许的一些操作。刚刚学习,假设我理解的不正确的话,请大家留言指正啊。


    Struts2拦截器原理

    Struts2拦截器的实现原理我理解的还是相对简单的,当请求struts2的Action时,Struts2会查找配置文件,然后依据其配置
    实例化相对的拦截器对象,然后串成一个列表,最后一个一个的调用列表中的拦截器。

                                                                      


    定义拦截器

    public class MyInterceptor implements Interceptor{
    
    	@Override
    	public void destroy() {
    		System.out.println("--destroy()--");
    		
    	}
    
    	@Override
    	public void init() {
    		System.out.println("--init()--");
    		
    	}
    
    	@Override
    	public String intercept(ActionInvocation invocation) throws Exception {
    		System.out.println("--intercept()--");
    		Map<String,Object> session= invocation.getInvocationContext().getSession();
    		if(session.get("username")!=null){
    			return invocation.invoke();
    		}
    		else{
    			return"error";			
    		}
    	}
    
    }
    
    //当须要对action中指定的方法须要拦截的时候须要用的MethodFilterInterceptor
    //public class MyInterceptor extends MethodFilterInterceptor{
    	public class MyInterceptor extends AbstractInterceptor{
    	@Override
    	public String intercept(ActionInvocation invocation) throws Exception {
    		System.out.println("--intercept()--");
    		Map<String,Object> session= invocation.getInvocationContext().getSession();
    		if(session.get("username")==null){
    			return "error";
    		}
    		else{
    			return"user";			
    		}
    	}
    
    }

            说明:自己定义的接口须要继承自AbstractInterceptor的类。com.opensymphony.xwork2.interceptor.Interceptor接口。声明了3个方法,包含init,destroy和intercept方法,当中,init和destroy方法会在程序開始和结束时各运行一遍。无论使用了该拦截器与否,仅仅要在struts.xml中声明了该Struts2拦截器就会被运行。intercept方法就是拦截的主体了。每次拦截器生效时都会运行当中的逻辑。

    只是,struts中还提供了抽象类来简化这一步骤。public class MyInterceptor extends MethodFilterInterceptor和public class MyInterceptor extends AbstractInterceptor,当中AbstractInterceptor提供了init()和destroy()的空实现。使用时仅仅须要覆盖intercept()方法;而MethodFilterInterceptor则提供了includeMethods和excludeMethods两个属性,用来过滤运行该过滤器的Action的方法。能够通过param来增加或者排除须要过滤的方法。

    注冊拦截器

    		<interceptors>
    			<interceptor name="myInterceptor" class="MyInterceptor"></interceptor>
    			
    			<interceptor-stack name="defaultInterceptorStack">
    				<interceptor-ref name="myInterceptor"></interceptor-ref>
    				<interceptor-ref name="defaultStack"></interceptor-ref>(必须加,否则出错)
    			</interceptor-stack>	
    					
    		</interceptors>

    配置拦截器

    配置都是在struts.xml里面的,以下是我的一个小样例,注意:在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack。

    	<package name="testLogin" namespace="/" extends="struts-default">	
    		<interceptors>
    			<interceptor name="myInterceptor" class="MyInterceptor"></interceptor>
    			
    			<interceptor-stack name="defaultInterceptorStack">
    				<interceptor-ref name="myInterceptor"></interceptor-ref>
    				<interceptor-ref name="defaultStack"></interceptor-ref>(必须加,否则出错)
    			</interceptor-stack>	
    					
    		</interceptors>
    		(这句是设置全部Action自己主动调用的拦截器堆栈)
    		<default-interceptor-ref name="defaultInterceptorStack"></default-interceptor-ref>
    	
    		<action name="Login" class="LoginAction">
    			<result name="user">/user.jsp</result>
    			<result name="error">/error.jsp</result>
    			<interceptor-ref name="defaultInterceptorStack"></interceptor-ref>
    		</action>	
    			
    	</package>
    	

        说明:至于前面说到的Action里边必须在最后引用struts2自带的拦截器缺省堆栈defaultStack。实际我也不是非常清

    楚。只是后边还会深入的理解这一知识点,再来补充。

            这样,我们的拦截器就能使用啦,这仅仅是拦截器非常基础的一部分,简单能实现了,刚刚接触ssh。随后还须要通过总结来填充这一部分的学习,记得视频中讲到它与filter有一定的关系与差别,当时没有细致的考虑,接下来会通过对filter的学习比較它与interceptor的差别。


  • 相关阅读:
    MySQL数据库的优化
    PHP中获取文件扩展名
    PHP实现几种经典算法详解
    Linux服务器上crontab定时执行脚本文件
    LeetCode每日一题(五):加一
    巧妙利用枚举找出数组元素所在区间
    PHP实现几种经典算法详解
    _initialize() 区别 __construct()
    LeetCode每日一题(四):搜索插入位置
    LeetCode每日一题(三):移除元素
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/6723347.html
Copyright © 2011-2022 走看看