欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

(十二)Struts2进阶之拦截器

程序员文章站 2022-05-28 17:21:35
...

1.拦截器底层实现原理

(1)AOP思想

(2)责任链模式(一种设计模式)

2.实现拦截器的三种方式

(1)实现Interceptor接口,重写三个方法
(2)继承AbstractInterceptor类,重写intercept方法
(3)继承MethodFilterInterceptor类,重写doIntercept方法

注意:要让拦截器不拦截action中的某个方法,则该拦截器必须使用第三种实现方式,即继承MethodFilterInterceptor类

3.实现一个拦截器

我们自己实现一个拦截器,该拦截器的主要功能是检测用户是否登录,如果用户没有登录,访问某些页面,则跳转到登录页面。

首先是在action中将用户输入的账户密码存入session,然后在拦截器中取得账户密码,进行一个判断,如果登录了,则同意用户的请求,否则跳转到登录页面。

下面是action的代码,就贴关键的

    public String login() {
        // 获取session对象
        ActionContext act = ActionContext.getContext();
        Map<String, Object> map = act.getSession();
        if("admin".equals(username) && "admin".equals(password)) {
            // 登录成功则把信息存入session
            map.put("username", username);
            return SUCCESS;
        } else {
            map.put("loginError", "用户名或密码不正确");
            return "error";
        }
    }

下面是拦截器的代码

@SuppressWarnings("serial")
public class LoginInterceptor extends MethodFilterInterceptor {
    @Override
    public String doIntercept(ActionInvocation invocation) throws Exception {
        // 获取session对象
        ActionContext context = ActionContext.getContext();
        Map<String, Object> session = context.getSession();
        // 判断用户是否已登录
        if(session.get("username") != null) {
            String result = invocation.invoke();
            return result;
        } else {
            return "error";
        }
    }
}

我们使用的第三种方式实现拦截器,重写了doIntercept方法。

下面在struts.xml中进行配置

 <struts>
    <package namespace="/" extends="struts-default" name="default">
        <!-- 注册拦截器 -->
        <interceptors>
            <interceptor name="loginInterceptor" class="com.codeliu.interceptor.LoginInterceptor"></interceptor>
        </interceptors>
        <action name="login" class="com.codeliu.action.LoginAction" method="login">
            <!-- 为某个action显示指定拦截器后,默认的拦截器栈将不会生效,如果要使用,需要手工指定 -->
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <!-- 使用拦截器 -->
            <interceptor-ref name="loginInterceptor">
                <!-- 配置使该拦截器不拦截这个方法,可配置多个方法 -->
                <param name="excludeMethods">login</param>
            </interceptor-ref>
            <result>success.jsp</result>
            <result name="error">/login.jsp</result>
        </action>
    </package>
</struts>

可以看到我们先注册了一个拦截器,然后把拦截器应用在login这个action里面,默认是对action里的所有方法都起作用,但有时候,一个action的有些方法我们不需要被拦截器拦截,这时候得设置param 参数,name的属性值为excludeMethods,我们可以设置多个不被拦截的方法,但注意,拦截器必须使用第三种方式实现才能这样设置。

同时我们还手动进行了默认拦截器defaultStack的设置,当我们自己知道了拦截器的时候,默认的拦截器就不会起作用了,这时得自己设置,在核心jar包里能清楚的看到这些默认的拦截器,就不多说了。
(十二)Struts2进阶之拦截器



到这里Struts2的文章暂时先告一段落了。