Struts2基础应用4——自定义拦截器

Struts2

这里写图片描述
一个请求在Struts2框架中的处理大概分为以下几个步骤

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求

2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin)

3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 

4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy 

5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类 ,这里,我们一般是从struts.xml配置中读取。

6、ActionProxy创建一个ActionInvocation的实例。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签。在这个过程中需要涉及到ActionMapper

拦截器

这里写图片描述
1. 如果拦截器堆栈中还有其他的Interceptor,那么invocation.invoke()将调用堆栈中下一个Interceptor的执行。
2. 如果拦截器堆栈中只有Action了,那么invocation.invoke()将调用Action执行。
3. 如果在拦截器中,我们不使用invocation.invoke()来完成堆栈中下一个元素的调用,而是直接返回一个字符串作为执行结果,那么整个执行将被中止。
4. 我们可以以invocation.invoke()为界,将拦截器中的代码分成2个部分,在invocation.invoke()之前的代码,将会在Action之前被依次执行,而在invocation.invoke()之后的代码,将会在Action之后被逆序执行。
由此,我们就可以通过invocation.invoke()作为Action代码真正的拦截点,从而实现AOP。
(摘自:http://blog.csdn.net/csh624366188

自定义拦截器

在Struts2程序开发中,如果要创建自己的拦截器,要使用接口:com.opensymphony.xwork2.interceptor.AbstractInterceptor,该接口提供了如下三个方法:

  • void init()
  • void destroy()
  • String intercept(ActionInvocation invocation) throws Exception:用户实现的拦截动作,返回一个字符串作为逻辑视图。

拦截器有什么用?
比如,在一个商城系统中,用户执行了某些敏感操作,那么在执行前我必须判断用户是否登录,如果没有,则跳转到登录页面。

验证登录实例

AuthorizationInterceptor.java (拦截器核心代码)

package com.digital.interceptor;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorizationInterceptor extends AbstractInterceptor {

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {

        Map session=invocation.getInvocationContext().getSession();
        String usr=(String)session.get("CURRENT_USER");
        if (usr==null) {
            return Action.INPUT;    //返回'input'字符串
        }else{
            return invocation.invoke();
        }
    }

}

struts.xml里加上:

<interceptors>
    <interceptor name="myAuthorization" class="com.digital.interceptor.AuthorizationInterceptor"></interceptor>
    <!-- 定义拦截器栈 -->
    <interceptor-stack name="myStack">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="myAuthorization"/>
    </interceptor-stack>
</interceptors>     
<!-- 定义默认的拦截器引用,都拦截 -->
<!--<default-interceptor-ref name="myStack"/>-->

<action name="list" class="com.digital.action.ProductInfoAction" method="list">
    <result name="index">/index.jsp</result>
    <interceptor-ref name="myStack"></interceptor-ref><!--访问list时,拦截--> 
</action>

这样,当访问“list.action”时,会启动拦截器AuthorizationInterceptor进行拦截,如果用户没有登录,则转到登录页面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值