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

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

程序员文章站 2022-05-28 16:53:11
...

一、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页面不发送请求,不生效。