我们在做登陆注册时,有时要用到登陆注册等,再这之前我们可能会对用户是否合法进行一下检测,和判断用户是否已经存在等,这是我们就要用到拦截器或者session,进行调用出数据,进行权限控制等,当人在使用之前我们要明白拦截器的具体含义。下面我就给大家介绍以下。
拦截器顾名思义就是能够拦截用户操作。拦截器的功能就是在进行一个操作(如调用方法)时,它会在用户执行操作前进行一系列操作,同样在用户操作完成后,进行一系列操作。到底什么是拦截器呢?我们可以通过一个实际例子来说明。比如现在你要乘坐电梯,在你进入电梯之前,电梯门首先要打开你才能进入。当你进入电梯后,电梯门会自动关闭。这时电梯就可以看做是一个拦截器,在你进入之前和之后都进行了一系列操作。所谓的拦截其实就是动态地生成一个代理对象,这个对象中包含了拦截器方法的调用。当调用这个对象时,就会同时调用拦截器的方法,从而实现动态调用拦截器方法的目的。拦截器(Interceptor)是动态拦截Action调用的对象,类似于Servlet中的过滤器。在执行Action的业务逻辑处理方法(execute())之前,Struts2会首先执行在struts.xml中引用的拦截器。拦截器是struts2的一个重要特性。Struts2框架的大多数核心功能都是通过拦截器来实现的,像避免表单重复提交、类型转换、对象组装、验证、文件上传等,都是在拦截器的帮助下实现的。拦截器之所以称为“拦截器”,是因为它可以在Action执行之前和执行之后拦截调用。
拦截器的工作流程
nStruts2将它的核心功能放到拦截器中实现,而不是分散到Action中实现,有利于系统的解耦,使得功能的实现类似于个人电脑的组装,变成了可插拔的,需要某个功能就“插入”一个拦截器,不需要某个功能就“拔出”一个拦截器。你可以任意组合拦截器来为Action提供附加的功能,而不需要修改Action的代码。
n配置拦截器
<interceptors>
<!-- 配置拦截器 -->
<interceptor name="拦截器名称" class="拦截器实现类"/>
<param name="拦截器参数名称">拦截器参数值</param>
</interceptor>
n配置拦截器链
<!-- 配置拦截器栈 -->
<interceptor-stack name="拦截器链名称">
<interceptor-ref name="拦截器名称1"><param name="拦截器参数名1称">拦截器参数值1</param>
</interceptor-ref>
<interceptor-ref name="拦截器名称2"><param name="拦截器参数名称2">拦截器参数值2</param>
</interceptor-ref>
</interceptor-stack>
</interceptors>
Struts2内建了大量的拦截器,这些拦截器以name-class对的形式配置在struts-default.xml文件中,其中name是拦截器的名字,就是以后使用该拦截器的唯一标识;class则指定了该拦截器的实现类,如果我们定义的package继承了Struts2的struts-default包,则可以自由使用下面定义的拦截器,否则必须自己定义这些拦截器。
大部分时候,开发者无需手动控制这些拦截器,因为struts-default.xml文件中已经配置了这些拦截器,只要我们定义的包继承了系统的struts-default包,就可以直接使用这些拦截器。下面就写一个Strust的配置文件xml
n
Struts-default.xml配置文件
<interceptor-stack name="defaultStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="alias"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="i18n"/>
<interceptor-ref name="chain"/>
<interceptor-ref name="debugging"/>
<interceptor-ref name="profiling"/>
<interceptor-ref name="scopedModelDriven"/>
<interceptor-ref name="modelDriven"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="params“/>
<interceptor-ref name="conversionError"/>
<interceptor-ref name="validation">
<interceptor-ref name="workflow">
</interceptor-stack>
n通常情况下,拦截器都是通过代理的方式调用。当请求到达Struts 2的StrutsPrepareAndExecuteFilter时,Struts 2会查找配置文件,并根据配置实例化相应的拦截器对象,然后将这些对象组成一个列表,最后逐个调用列表中的拦截器。
其他还有一些自定义拦截器类,大家也可以看看。