zoukankan      html  css  js  c++  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.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中配置
  • 相关阅读:
    Cannot find module 'webpack'
    Failed to read auto-increment value from storage engine
    laravel框架查看执行过的sql语句
    windows与虚拟机共享文件夹设置
    csv导出文件中有html
    特定中文字符串正则匹配
    运动跟踪等算法的解释
    自控力这本书的读后感
    提取肤色信息原理及操作——opencv
    那些年我们排过的序之希尔排序
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4388647.html
Copyright © 2011-2022 走看看