你的位置:首页 > Java教程

[Java教程]Struts2(十四)拦截器实现权限管理


一、认识拦截器

拦截器也是一个类

拦截器可以在Action被调用之前和之后执行代码

框架很多核心功能是拦截器实现的

拦截器的特点:

拦截器自由组合,增强了灵活性、扩展性、有利于系统解耦

拦截器可以拦截Action请求

在访问的Action执行之前和执行之后执行代码实现某项功能

Struts2:

大部分功能是在拦截器中实现的如:接收输入的参数,数据验证,文件上传,国际化等

应用程序:

需要在Action执行的前后执行特定功能

Action执行时间统计,Action访问权限管理

Action添加功能,Action代码不动使用拦截器实现功能

二、拦截器工作方式

 

 

三、自带的一些拦截器

 Struts2还有很多拦截器。

四、拦截器栈

 从结构上 :拦截器栈就是一组拦截器

从功能上:拦截器栈也是拦截器

五、默认拦截器

 

六、计算运行Action的时间

 

MyTimerInterceptor

package com.pb.web.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class MyTimerInterceptor extends AbstractInterceptor {    //实现父类的方法  @Override  public String intercept(ActionInvocation invocation) throws Exception {    //执行前的时间     long startTime=System.currentTimeMillis();    System.out.println("执行Action之前的工作,开始时间:"+startTime + " ms");    //执行这个拦截器之后的拦截器或者Action    String result=invocation.invoke();    //获取执行结束的时间 执行Action之后的工作:计算并输出执行时间    long endTime=System.currentTimeMillis();    //执行时间差    long execTime=endTime-startTime;        System.out.println("执行Action之后的工作,结束时间:"+endTime+",执行耗时:" + execTime + " ms");    return result;  }}

struts.

<??><!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>  <!-- 禁用动态方法调用-->  <constant name="struts.enable.DynamicMethodInvocation" value="false" />  <!-- 启用开发模式后,更改设置不用重启Tomcat-->  <constant name="struts.devMode" value="true" />  <!-- 包默认继承strus-default -->  <package name="default" namespace="/" extends="struts-default">  <interceptors>  <interceptor name="myTimer" class="com.pb.web.interceptor.MyTimerInterceptor"></interceptor>  </interceptors>    <action name="hello" class="com.pb.web.action.HelloAction" method="hello">    <result name="success">/index.jsp</result>    <result name="input">/index.jsp</result>    <result name="error">/index.jsp</result>    <!-- 启用自定义的拦截器-->    <interceptor-ref name="myTimer"/>    <!-- 同时启用struts2默认的拦截器名称为defaultStack -->    <interceptor-ref name="defaultStack"/>    </action>  </package></struts>

 七、自定义拦截器

 struts2有三种方法自定义拦截器

  • 实现interceptor接口
  • 继承AbstractInterceptor类
  • 继承MethodFilterInterceptor类

八、简单例子实现登录后某个页面才能访问

登录后才能访问/WEB-INF/page/security.jsp

实体类

package com.pb.entity;/* * 用户类 */public class User {  private String username;  private String password;      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;  }    }

package com.pb.web.action;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionSupport;import com.pb.entity.User;public class LoginAction extends ActionSupport implements SessionAware {  private User user;  private Map<String, Object> session;  //登录  public String login(){    if("admin".equals(user.getUsername())&&"admin".equals(user.getPassword())){      session.put("user", user);      return SUCCESS;    }    return ERROR;  }    public User getUser() {    return user;  }  public void setUser(User user) {    this.user = user;  }  @Override  public void setSession(Map<String, Object> session) {    this.session=session;      }  public Map<String, Object> getSession() {    return session;  }    }

拦截器

package com.pb.web.interceptor;import java.util.Map;import com.opensymphony.xwork2.Action;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;import com.pb.entity.User;public class MyInterceptor extends AbstractInterceptor {  @Override  public String intercept(ActionInvocation invocation) throws Exception {    Map<String, Object> session=ActionContext.getContext().getSession();    //获取session中保持的用户信息    User user=(User) session.get("user");    if(user!=null){      //如果用户已经登录,继续执行剩余的拦截器和Action      return invocation.invoke();    }else{      //如果用户尚未登录,返回到登录页面      return Action.LOGIN;    }      }}

struts.

<??><!DOCTYPE struts PUBLIC  "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"  "http://struts.apache.org/dtds/struts-2.3.dtd"><struts>  <package name="default" namespace="/" extends="struts-default">  <interceptors>  <!--定义权限验证拦截器 -->  <interceptor name="myInterceptor" class="com.pb.web.interceptor.MyInterceptor"></interceptor>  <!--定义拦截器栈 -->  <interceptor-stack name="myStack">  <!--使用默认的拦截器 -->  <interceptor-ref name="defaultStack" />   <interceptor-ref name="myInterceptor" />  </interceptor-stack>  </interceptors>  <!-- 定义全局结果返回login时,返回登录页面-->  <global-results>  <!--以重定向的方式跳转 -->  <result name="login" type="redirect">/login.jsp</result>  </global-results>  <!-- action-->  <action name="login" class="com.pb.web.action.LoginAction" method="login">  <!-- 结果判断和页面跳转-->  <result name="success">/loginSuccess.jsp</result>  <result name="error">/error.jsp</result>  </action>  <action name="security">  <interceptor-ref name="myStack" />  <result name="success"> /WEB-INF/page/security.jsp  </result>   </action>  </package></struts>

九、拦截器使用和与过滤器的不同之处

 

与过滤器的相同之处:

  • 功能相似
  • 原理相似
  • 方法相似

与过滤器的不同之处:

  • 拦截器用于拦截Action请求,而过滤器几乎可以过滤所有的请求
  • 拦截器中可以获取Action的当前执行状态,而过滤器不可以
  • 过滤器是Servlet中概念,在Web.