拦截器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>

运行结果:

原文地址:https://www.cnblogs.com/jonsnow/p/6581183.html