首页 > 学院 > 开发设计 > 正文

Struts2(十四)拦截器实现权限管理

2019-11-14 23:36:50
字体:
来源:转载
供稿:网友
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中配置


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表