Struts拦截器学习笔记

1. Struts2执行流程

这里写图片描述

2. 拦截器简介

2.1 什么事拦截器?

Struts大多数功能是通过拦截器实现的,每个拦截器完成某项功能。
拦截器方法在Action执行之前或者之后执行。

2.2 什么事拦截器栈?

从结构上看,拦截器栈相当于多个拦截器的组合。
从功能上看,拦截器栈也是拦截器。

2.3 拦截器工作原理

拦截器的执行过程是一个递归的过程
这里写图片描述

3. 自定义拦截器

3.1 方式一:实现Interceptor接口

  • void init():初始化拦截器所需资源
  • void destory():释放在init()中分配的资源
  • String intercept(ActionInvocation ai) throws Exception
    - 实现拦截器功能
    - 利用ActionInvocation参数获取Action装态
    - 返回result字符串作为逻辑视图

3.2 方式二:继承AbstractInterceptor类

  • 提供了init()和destory()方法的空实现
  • 只需实现intercept方法即可

4. 入门案例(计算Action的执行时间)

4.1 实现步骤

创建拦截器
在配置文件中定义拦截器并引用他

4.2 具体步骤

这里写图片描述

5. 内建拦截器

这里写图片描述
这里写图片描述
这里写图片描述

6. 用拦截器实现登录权限控制

这里写图片描述
login.jsp

<body>
    <h2>登录界面</h2>
    ${ loginError  }
    <form action="login.action" method="post">
        用户名:<input type="text" name="username">
         密码:<input type="password" name="password"> 
         <input type="submit"   value="登录" />
    </form>
</body>

struts.xml

<struts>
        <!-- 定义常量禁用动态函数调用和开启开发者模式 -->
        <constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
        <constant name="struts.devMode" value="true"></constant>

    <!-- 定义一个包,指定包名为default  命名空间设置为跟命名空间
        继承自struts-default包
    -->
    <package name="default" namespace="/" extends="struts-default">

            <!-- 注册拦截器 -->
            <interceptors>
                    <interceptor name="auth" class="com.imooc.interceptor.AuthInterceptor"></interceptor>
                    <!-- 自定义拦截器栈myStack,组合了defaultStack和auth -->
                    <interceptor-stack name="myStack">
                            <interceptor-ref name="defaultStack"></interceptor-ref>
                            <interceptor-ref name="auth"></interceptor-ref>
                    </interceptor-stack>
            </interceptors>

            <!-- 通过此Action访问后台管理页面,需要判断用户是否已登录
                    如果为未登录则跳转到登录页面(成功完成对auth这个action的拦截并且进行权限的校验)
             -->
            <action name="auth">
                    <result>/WEB-INF/page/manager.jsp</result>
                    <result name="login">/login.jsp</result>
                    <!-- 引用自定义的拦截器栈 -->
                    <interceptor-ref name="myStack"></interceptor-ref>
            </action>

            <action name="login" class="com.imooc.action.LoginAction" method="login">
                <result>/WEB-INF/page/manager.jsp</result>
                <result name="error">/login.jsp</result>
            </action>

    </package>
</struts>    

LoginAction.java

public class LoginAction extends ActionSupport implements SessionAware{
    private String username;
    private String password;
    private Map<String, Object> session;

    public void setSession(Map<String, Object> session) {
        this.session = session;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    //处理登录请求
    public String login() {
        if ("admin".equals(username)&&"123".equals(password)) {
            session.put("loginInfo", username);
            return SUCCESS;
        }else {
            session.put("loginError", "用户名或密码不正确");
            return ERROR;
        }
    }

AuthInterceptor

public class AuthInterceptor extends AbstractInterceptor{

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

        ActionContext context = ActionContext.getContext();
        Map<String, Object> session = context.getSession();
        if (session.get("loginIndo")!=null) {
            String result = invocation.invoke();
            return result;
        }else {
            return "login";
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值