12.Struts2自定义拦截器

12.自定义拦截器

拦截器是Struts2的一个重要特性。因为Struts2的大多数核心功能都是通过拦截器实现的。

拦截器之所以称之为“拦截器”,是因为它可以拦截Action方法的执行,

即在Acton方法执行之前或之后执行,以加强Action方法的功能。

例如,一般情况下,用户在打开某个页面之前,需要先登录,否则是无法对资源进行访问的。这就是权限拦截器。

1、定义拦截器类

自定义的拦截器类需要实现拦截器接口com.opensymphony.xwork2.interceptor.Interceptor。

该接口中定义了三个方法:

public void init():拦截器实例被创建之前被调用
public void destroy():拦截器实例被销毁之前被调用
public String intercept (ActionInvocation invocation) throws Exception 

该方法在Action执行之前被调用,拦截器的附加功能在该方法中实现。

执行参数invocation的invoke()方法,就是调用Action方法在执行。

intercept()方法的完全结构如下图所示:

2、注册拦截器

拦截器类在定义好后,需要在struts.xml配置文件中注册,以通知Struts2框架。

在<package>中添加如下标签:

<package name="one" extends="struts-default">
<interceptors>
      <interceptor name="permission" class="interceptors.PermissionInterceptor"/>
</interceptors>
    <action name="my" class="actions.MyAction">
            <result>/message.jsp</result>
    </action>
 </package>

注册后的拦截器,便可由Action通过配置文件配置来使用了。

<package name="one" extends="struts-default">        <interceptors>                      <interceptor name="permission" class="interceptors.PermissionInterceptor"/>         </interceptors>        <action name="my" class="actions.MyAction">
                     <interceptor-ref name="permission" />
        </action>  </package>

但,这种用法非常不好。因为这样会使该Action不能再使用Struts2自带的各种核心拦截器,而只使用这一个了。

若要使该Action既能使用自定义的拦截器,又能使用Struts2自带的拦截器,那么就需要在包中定义拦截器栈:

在<interceptors>中添加<interceptor-stack>标签。

<interceptors>
      <interceptor name="permission"
                     class="interceptors.PermissionInterceptor"/>
      <interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="permission" />
      </interceptor-stack>
</interceptors> 

defaultStack为Struts2自带的各种拦截器的栈。

即该自定义的拦截器栈permissionStack中,包括一个拦截器栈与一个拦截器。

<action name="my" class="actions.MyAction">
<interceptor-ref name=" permissionStack " />
</action> 

当然,不定义permissionStack 拦截器栈直接按如下写法也可:

<action name="list" class="actions.MyAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="permission" />
</action> 

这样,该action即可以使用defaultStack核心拦截器栈,又可以使用自定义的拦截器。

若该<package>中的所有Action均要使用该拦截器,

一种方式是,每个Action均像上面那样指定要使用的拦截器栈permissionStack ;

另一种方式是,指定默认的拦截器栈。

即在<package>下定义:

<default-interceptor-ref name=" permissionStack " /> 

这样,每一个本包中的Action不用声明使可直接使用该拦截器栈。

注意:

每个包只能指定一个默认拦截器。

另外,一旦为该包中的某个action显式指定了某个拦截器,则默认拦截器就不会起作用了。

实例:权限拦截器--interceptor

只有经过登录的用户方可访问Action中的方法,否则,将返回“无权访问”提示。

本例的登录,由一个JSP页面完成。即在该页面里将用户信息放入session中。

也就是说,只要访问过该页面,就说明登录了。没访问过,则为未登录用户。

代码文档目录:

Step1:编写index.jsp与login.jsp页面

index.jsp源码如下:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘index.jsp‘ starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
    This is my JSP page. <br>
  </body>
</html>

login.jsp源码如下:

<%@page pageEncoding="utf-8"%>
<%
     session.setAttribute("user", "aynu");
 %>
登陆成功!

Step2:编写MyAction.java与PermissionInterceptor.java

MyAction.java源码如下:

package actions;

public class MyAction {

  public String execute(){
      System.out.println("执行Action方法");
      return "success";
  }
}

PermissionInterceptor.java源码如下:

package interceptors;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class PermissionInterceptor implements Interceptor {

    public void destroy() { }

    public void init() {    }

    public String intercept(ActionInvocation invocation) throws Exception {
        String user=(String) ActionContext.getContext().getSession().get("user");

        //执行Action方法
        String result="success";
        if (user!=null) {
            System.out.println("Action方法执行之前的附加功能");
            result = invocation.invoke();
            System.out.println("Action方法执行之后的附加功能");
            ActionContext.getContext().getSession().put("message","欢迎访问");
        }else{
            ActionContext.getContext().getSession().put("message","无权访问");

        }
        return result;
    }

}

Step3:编写web.xml与struts.xml

web.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

        <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        </filter>

        <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

struts.xml配置如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

     <package name="one" extends="struts-default">
     <interceptors>
       <interceptor name="permission" class="interceptors.PermissionInterceptor"/>
                   <interceptor-stack name="permissionStack">
                   <interceptor-ref name="defaultStack"/>
                   <interceptor-ref name="permission"/>
                   </interceptor-stack>
     </interceptors>
     <default-interceptor-ref name="permissionStack"/>
        <action name="my" class="actions.MyAction">
            <result>/message.jsp</result>
        </action>

    </package>

</struts>

Step4:编写message.jsp页面

<%@ page pageEncoding="utf-8" isELIgnored="false"%>

<html>
  <head>
        <title>message page</title>
  </head>
  <body>
  提示信息:${message}
</body>
</html>

部署发布,启动tomcat,输入地址:

http://127.0.0.1:8080/interceptor_test/my.action


输入地址:

http://127.0.0.1:8080/interceptor_test/login.jsp



输入地址:

http://127.0.0.1:8080/interceptor_test/my.action


时间: 2024-10-25 11:46:57

12.Struts2自定义拦截器的相关文章

Struts2自定义拦截器Interceptor以及拦截器登录实例

1.在Struts2自定义拦截器有三种方式: -->实现Interceptor接口 public class QLInterceptorAction implements Interceptor{ private static final long serialVersionUID = 1L; public void destroy() { } public void init() {} public String intercept(ActionInvocation arg0) throws

Struts2 自定义拦截器时Action无法接收到参数

问题:自定义拦截器,没有添加defaultStack导致Action无法接受到参数 解决办法: 方法一,添加defaultStack,然后在Action中引用 自定义的stack,其实defaultStack中也有细分如basicStack等 <interceptors> <interceptor name="checkUser" class="com.common.interceptor.UserInfoInterceptor"></

Struts2 自定义拦截器(方法拦截器)

一.实现Interceptor接口 1 public interface Interceptor extends Serializable{ 2 public void init(); 3 public void destroy(); 4 public String intercept(ActionInvocation invocation)(); 5 } 并实现上述方法. 二.继承AbstractInterceptor类,重写intercept()方法即可 此方法更可行,其实AbstractI

5、Struts2自定义拦截器

一.拦截器相关知识 1.Struts2框架剖析 Holly版本生活案例: 影视公司(拍电影)    ActionMapper 传媒公司(包装明星) ActionMapping 明星                        Action 经纪人                     ActionProxy(代理对象) 小工所在单位             ActionInvocation 小工                        Interceptor(拦截器) 递归==99归一

Struts2自定义拦截器

自定义拦截器 1). 具体步骤 I. 定义一个拦截器的类 > 可以实现 Interceptor 接口 > 继承 AbstractInterceptor 抽象类 II然后在拦截器类的interceptor()方法中定义这个拦截器的功能 III. 在 struts.xml 文件配置. 1注册拦截器 <interceptors> <interceptor name="hello" class="com.atguigu.struts2.intercept

Struts2 自定义拦截器

自定义拦截器(权限管理),包含了对ajax和表单请求的拦截 package com.interceptor; import java.io.IOException; import java.io.PrintWriter; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts

Struts2自定义拦截器处理全局异常

今天在整理之前的项目的时候想着有的action层没有做异常处理,于是想着自定义拦截器处理一下未拦截的异常. 代码: package cn.xm.exam.action.safeHat; import java.util.HashMap; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Scope;

Struts2自定义拦截器的基本方法

struts.xml struts2配置文件,因为我们为Action配置了拦截器,默认的拦截器就会失效.为了程序的正常运行,需要我们显示引入默认拦截器. 1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "

[原创]java WEB学习笔记74:Struts2 学习之路--自定义拦截器,struts内建的拦截器

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------