struts2入门(三)——使用拦截器简单的登录验证

一、Struts2拦截器定义

Struts2拦截器是struts2的核心和基础,许多功能都建立在他的基础上、例如:国际化,转换器、校验。
他是实现一个实现一定功能的类,以一种可拔插的方式被定义在action之前或之后,拦截器是AOP的一种实现,底层是一种动态代理模式.
当拦截器按一定的顺序联结成一条链,就会形成拦截器栈(Interceptor Stack)。Struts2拦截器栈在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

二、拦截器和过滤器的区别:

  1. 拦截器和过滤器的概念非常类似。

  2. 过滤器隶属于web容器,可以过滤一切请求(包括action、servlet、jsp、html等等)。

  3. 而拦截器隶属于struts2框架,只能拦截action(无法拦截对jsp的请求)。

  4. 过滤器内部采用函数回调来实现。拦截器采用动态代理来实现!

三、配置自定义拦截器及分析原理

自定义拦截器及其使用:
1. 直接或间接实现接口com.opensymphony.xwork2.interceptor.Interceptor或者继承类com.opensymphony.xwork2.interceptor.AbstractInterceptor
2.通过元素来定义拦截器
3..通过元素来使用拦截器


首先创建拦截器类:

package com.it.struts.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

@SuppressWarnings("serial")
public class MyInterceptor implements Interceptor {

    @Override
    public void destroy() {


    }

    @Override
    public void init() {


    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("method start");
        String result = invocation.invoke();
        System.out.println("method end");
        return result;
    }

}

其次需要在struts.xml中定义拦截器:

<package name="default" namespace="/person" extends="struts-default">
     <interceptors>
          <interceptor name="inter01" class="com.it.struts.interceptor.MyInterceptor"></interceptor>
     </interceptors>

然后在需要使用拦截器的action中手动引入:

 <action name="personAction" class="com.it.struts.action.PersonAction1">
      <interceptor-ref name="inter01"></interceptor-ref>//自定义拦截器
      <interceptor-ref name="defaultStack"></interceptor-ref>//默认拦截器
      <result name="success">show.jsp</result>
      <result name="error" type="redirect">login.jsp</result>
</action>
  </package>

这里需要注意的是如果设置自定义拦截器,默认拦截器就会失效,需要手动引入:

  <interceptor-ref name="defaultStack"></interceptor-ref>

这里的登录的所有文件在struts2标签中都有,这里不再重复。当运行完整个登录过程后,控制台可以看到:
method start
login
method end


从此结果我们可以看出,拦截器在请求之前进行拦截处理,在请求之后也会进行拦截处理。

四、实现简单的登录拦截

首先创建拦截器:
MyInterceptor2.java

package com.it.struts.interceptor;

import java.util.Map;

import com.it.struts.entity.person;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class MyInterceptor2 extends AbstractInterceptor{
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            Map session = ActionContext.getContext().getSession();
                  //获取session作用域内是否有值,这里的session是struts2封装过的。
            person person = (person) session.get("person");
                if(person!=null){//合法访问
                         return invocation.invoke();
              }else{//user为空说明未经过登陆,跳到登陆页面

                        return Action.LOGIN;
                   }
        }
}

然后配置struts.xml

 <interceptors>
     <interceptor name="inter02" class="com.it.struts.interceptor.MyInterceptor2"></interceptor>
     //拦截器定义
     </interceptors>
<global-results>
            <result name="error">/WEB-INF/jsp/error.jsp</result>
           <result name="login">login.jsp</result>
           //login全局设置
 </global-results>
  <action name="UserAction" class="com.it.struts.action.UserAction">
  //对于任意一action都适用,这里的UserAction只是示例
          <interceptor-ref name="inter02"></interceptor-ref>
          //引入登录验证
          <interceptor-ref name="defaultStack"></interceptor-ref>
          //引入默认拦截器,必须引入
      <result name="success">show.jsp</result>
</action>

这里我们假设此UserAction需要进行登录验证,将inter02定义并引入,这里的<global-results>为全局配置,当请求UserAction时,拦截器进行拦截,获取session中的值为空时,就会返回login通过全局配置跳转到ogin.jsp
这里的 session设置方法为:

 ActionContext.getContext().getSession().put("person", person);

此拦截器可以作为一个插件,引入到任意struts2项目中进行配置进行使用进行登录验证,有一点是拦截无法实现的,此拦截器只能拦截action请求,如果只进入jsp页面不发送请求,不生效。

猜你喜欢

转载自blog.csdn.net/hqh1129/article/details/81272329