• 拦截器Interceptor


    作用:拦截Action调用的对象

    与过滤器区别:

    过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。
    1.拦截器是基于java反射机制的,而过滤器是基于函数回调的。
    2.过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。
    3.拦截器只对action起作用,而过滤器几乎可以对所有请求起作用。
    4.拦截器可以访问action上下文、值栈里的对象,而过滤器不能。
    5.在action的生命周期里,拦截器可以多起调用,而过滤器只能在容器初始化时调用一次。

    使用方法:

    一、拦截器配置。
    第一步:创建一个类,让其继承自AbstractInterceptor

    package maya.util;
    
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    public class MyInterceptor extends AbstractInterceptor {//类名: MyInterceptor
    
        @Override
        public String intercept(ActionInvocation arg0) throws Exception {
            
            return arg0.invoke();
        }
    }

    第二步:配置struts.xml

    1.添加<interceptors>配置节,添加拦截器配置。

    2.在action中引用,<interceptors>中的配置。

    <package name="default" namespace="/" extends="struts-default">
            
         <!--拦截器配置节-->
         <interceptors>
                <interceptor name="myinterceptor" class="maya.util.MyInterceptor"></interceptor>            
                <interceptor-stack name="newStack"><!--在建<interceptors>可以建立stack,把defaultStack也添加在里面,在引用的时候引用此stack即可。-->
                    <interceptor-ref name="myinterceptor"></interceptor-ref><!---->               
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>     
           
            <action name="*_*" class="maya.controller.{1}Action" method="{2}">
                
           <!--在action中需要添加defaultStack引用,上文建立的stack包含defaultStack,引用建立的newStack即可 --> 
           <interceptor-ref name="newStack"></interceptor-ref>
    
    
                <result>
                    {1}/{2}.jsp
                </result>
            </action>
        </package>

    注意:

    1.在action中需要添加defaultStack引用
    2.在建<interceptors>可以建立stack,把defaultStack也添加在里面,在引用的时候引用此stack即可。

     

    二、在拦截器中使用内置对象。
    1.ActionContext 获取Map.
    2.ServletActionContext 获取HttpSession
    3.实现SessionAware接口


    实例:使用拦截器实现登录身份验证。

    思路:有两个action不能拦截。打回登录界面action和登录提交验证并写 session的action
    在登录验证的auth方法中,分两种情况:
    1.第一次登录验证。此时,session中没有信息,需要向session中添加登录信息
    2.非第一次登录验证。此时,session中有信息,不需要再入session中添加信息

    User.java

    package maya.model;
    
    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;
        }
    }

    拦截器AuthInterceptor.java

    package maya.util;
    
    import java.util.Map;
    
    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
    
    public class AuthInterceptor extends AbstractInterceptor {
        private Map<String, Object> session;
        @Override
        public String intercept(ActionInvocation arg0) throws Exception {
            session = ActionContext.getContext().getSession();
            if (session.get("user") == null) {
                //没有登录,打回登录界面
                return "nologin";
            }
            return arg0.invoke();
        }
    }

    LoginAction.java

    package maya.controller;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.struts2.interceptor.SessionAware;
    
    import com.opensymphony.xwork2.ActionSupport;
    import com.opensymphony.xwork2.ModelDriven;
    
    import maya.model.User;
    
    public class LoginAction extends ActionSupport implements ModelDriven<User>,SessionAware{
        private Map<String, Object> session = new HashMap<String,Object>();
        private User user = new User();
        
        public String login() {
            //打登录界面
            return SUCCESS;
        }
        public String auth() {
            //模拟数据库访问验证
            List<String> uid = new ArrayList<String>();
            uid.add("zhangsan");
            uid.add("lisi");
            //如果正确
            Object obj = session.get("user");
            if (obj == null) {//session中没有此数据,第一次登录的验证
                if (uid.contains(user.getUserName())) {//相当于到数据库进行用户名和密码的判断
                    session.put("user", user.getUserName());
                    return SUCCESS;
                } else {
                    return "nologin";
                }
            } else {
                return SUCCESS;
            }
        }
        
        @Override
        public void setSession(Map<String, Object> arg0) {
            // TODO 自动生成的方法存根
            this.session = arg0;
        }
    
        @Override
        public User getModel() {
            // TODO 自动生成的方法存根
            return user;
        }    
    }

    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" />
        <constant name="struts.devMode" value="true" />
    
        <package name="default" namespace="/" extends="struts-default">
            <interceptors>            
                <interceptor name="authinterceptor" class="maya.util.AuthInterceptor"></interceptor>
                
                <interceptor-stack name="newStack">                
                    <interceptor-ref name="authinterceptor"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                </interceptor-stack>
            </interceptors>
            <!--有很多时候一个<result>可供很多<action>使用,这时可以使用<global-results>标签来定义全局的<result>。执行顺序:当一个Action返回的String没有相应的<result>与之对应,Struts2就会查找全局的<result>。-->
            <global-results>
                <result name="nologin">/Login/login.jsp</result>
            </global-results>
            
            <action name="Login_login" class="maya.controller.LoginAction" method="login">
                <result>/Login/login.jsp</result><!--路径为WebContent/Login/login.jsp,上下文<result>同理-->
            </action>
            <action name="Login_auth" class="maya.controller.LoginAction" method="auth">
                <result>/Login/auth.jsp</result>
            </action>        
        </package>
    </struts>

    login.jsp和auth.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>登陆</h1>
    <form action="Login_auth">
    账号:<input type="text" name="userName"><br>
    密码:<input type="text" name="password"><br>
    <input type="submit" value="登陆">
    </form>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    <h1>登录信息</h1>
    username:---<s:property value="userName"/><br>
    password:---<s:property value="password"/><br>
    
    <s:debug></s:debug>
    </body>
    </html>

    运行结果:

  • 相关阅读:
    基于 WebGL 的 HTML5 楼宇自控 3D 可视化监控
    基于 HTML5 的 WebGL 楼宇自控 3D 可视化监控
    基于 WebGL 3D 的 HTML5 档案馆可视化管理系统
    基于 HTML5 的 WebGL 3D 档案馆可视化管理系统
    基于 HTML5 的 WebGL 和 VR 技术的 3D 机房数据中心可视化
    代码管理(四)SVN和Git对比
    代码管理(二)sourcetree 安装与使用
    代码管理(一)git
    iOS11新特性之LargeTitle
    使用Cordova搭建Andoid和iOS开发环境
  • 原文地址:https://www.cnblogs.com/jonsnow/p/6581183.html
Copyright © 2020-2023  润新知