Fork me on GitHub

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.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!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.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!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.xml中配置;拦截器是Struts2/Webwork中的概念在struts.xml中配置

 

posted @ 2015-04-03 01:28  森林森  阅读(909)  评论(0编辑  收藏  举报