Struts2——拦截器(interceptor)

1、拦截器与过滤器

 1、拦截器属于struts框架,只能拦截action及其方法
 2、过滤器属于web容器,过滤一切请求(action,servlet,hsp,html等)
 3、实现方法:拦截器——动态代理;过滤器——函数回调。

2、拦截器与拦截器栈(stark)

 1、多个拦截器组成拦截器栈
 2、二者的引用方法一致

3、拦截器的实现步骤

 1、编写拦截器(接口Interceptor//继承AbstractInterceptor)
 2、在struts.xml中配置拦截器
 3、在action中引用配置好的拦截器

4、拦截器常用配置

 1、当引用了自定义的拦截器后,默认配置拦截器失效;
 2、当引用了自定义的拦截器后,又想使默认拦截器,可配置成拦截器栈,再引用到action
 3、当多个action都要引用同一个拦截器时,可配置为默认拦截器
    <package name="interceptor" namespace="/" extends="struts-default">
        <!-- 拦截器/栈配置部分 -->
        <interceptors>
            <!-- 配置拦截器 -->
            <interceptor name="time" class="com.interceptor.TimeInterceptor"></interceptor>

            <!-- 配置拦截器栈 -->
            <interceptor-stack name="mystack">
                <interceptor-ref name="time"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 配置默认拦截器/栈 -->
        <default-interceptor-ref name="mystack"></default-interceptor-ref>

        <action name="hello" class="com.action.HelloAction">
            <result>/index.jsp</result>
            <!-- 拦截器/栈引用部分 -->
            <interceptor-ref name="time"></interceptor-ref>
        </action>
    </package>

5、方法拦截器(拦截action的方法)

java类
//改为继承的类是MethodFilterInterceptor
public class ListInterceptor extends MethodFilterInterceptor
struts.xml需要注意的配置
<interceptor name="" class="">
    <param name="includeMethods">被拦截的方法名</param>
    <param name="excludeMethods">不被拦截的方法名</param>
</interceptor>

6、案例:权限控制

login.jsp
<body>
    <form action="login" method="post">
        请输入姓名<input type="text" name="name"><br>
        <input type="submit" value="登录"><br>
    </form>
    <a href="hello">去隐藏页面</a>
</body>
success.jsp
为了便与测试该页放在WEB-INF下(无法直接访问)
<body>
    <h1>user:${user}name:${name},欢迎您来到登录后才能显示的页面!</h1>
</body>
 LoginAction.java
public class LoginAction extends ActionSupport{
    private String name;
    @Override
    public String execute() throws Exception {
        // TODO 自动生成的方法存根
        //把用户名保存到session
        ActionContext.getContext().getSession().put("user", name);
        System.out.println("execute----------"+"put(user, name)");
        return super.execute();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
 LoginInterceptor.java
public class LoginInterceptor extends AbstractInterceptor{
    //注意:如果是接口Interceptor是xwork2包下的
    @Override
    public String intercept(ActionInvocation arg0) throws Exception {
        // TODO 自动生成的方法存根
        //现获取发起请求的action的名(没有后缀),判断是否为登录的action
        String ActionName=arg0.getProxy().getActionName();
        if (ActionName.equals("login")) {
            return arg0.invoke();
        }
        Object object=arg0.getInvocationContext().getSession().get("user");
        if (object==null) {
            System.out.println("LoginIntercept----------"+"object==null");
            return Action.LOGIN;
        }
        return arg0.invoke();
    }
}
 HelloAction.java
public class HelloAction extends ActionSupport{

    private String name;

    @Override
    public String execute() throws Exception {
        // TODO 自动生成的方法存根
        System.out.println("hello-------name="+ActionContext.getContext().getSession().get("user"));
        return super.execute();
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
struts.xml
    <package name="interceptor" namespace="/" extends="struts-default">
        <interceptors>
            <interceptor-stack>
        <interceptor name="loginInterceptor" class="com.interceptor.LoginInterceptor">
        </interceptor>
        <interceptor-stack name="mystack">
        <interceptor-ref name="loginInterceptor"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>

        <!-- 配置默认拦截器/栈 -->
        <default-interceptor-ref name="mystack"></default-interceptor-ref>
        <!-- 配置默认result -->
        <global-results>
            <result name="login">/login.jsp</result>
        </global-results>

        <action name="hello" class="com.action.HelloAction">
            <result>/WEB-INF/success.jsp</result>
        </action>
        <action name="login" class="com.action.LoginAction">
            <result>/WEB-INF/success.jsp</result>
        </action>

    </package>
测试hello 

这里写图片描述

测试login 

这里写图片描述

再测试hello

这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值