(十二)Struts2进阶之拦截器

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包里能清楚的看到这些默认的拦截器,就不多说了。
42.png



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

猜你喜欢

转载自blog.csdn.net/a_helloword/article/details/80464173