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()方法的完全结构如下图所示:
12.Struts2自定义拦截器
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中。
也就是说,只要访问过该页面,就说明登录了。没访问过,则为未登录用户。
代码文档目录:
12.Struts2自定义拦截器
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  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
12.Struts2自定义拦截器

 输入地址:
 http://127.0.0.1:8080/interceptor_test/login.jsp

12.Struts2自定义拦截器

输入地址:
http://127.0.0.1:8080/interceptor_test/my.action
12.Struts2自定义拦截器
 
 12.Struts2自定义拦截器
更多相关文章
  • Struts2自定义拦截器
    Struts2提供的默认的拦截器已经包含了开发应用项目所用到的大部分拦截功能,开发人员也可以开发自己是拦截器实现类,并在配置文件中使用自定义的拦截器,来完成拦截功能!Struts2框架为开发自定义拦截器实现类提供了Interceptor接口,我们可以实现该接口来自定义拦截器实现类Intercepto ...
  • 目的:测试开发时,为了减少用户登入这个繁琐的登入验证,就用struts2做了个简单的struts2拦截器,涉及到了与cookie整合,具体的看代码 结构(两部份)=struts2.xml+自定义拦截器对象 配置文件 <!-- 自定义拦截栈与拦截器 --> <interceptors ...
  • 要自定义拦截器需要实现com.opensymphony.xwork2.interceptor.Interceptor接口: 新建一个MyInterceptpackage com.action; import com.opensymphony.xwork2.ActionInvocation; impo ...
  • 1.定义struts2拦截器(网上例子很多) 代码如下: ); } }); }); </script> 这样就完成了,希望能给大家带来帮助.
  • 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188       在上一篇博客中,我们一起看了拦截器的具体实现原理,并且看了一下源码(细谈struts2(八)拦截器的实现原理及源码剖析),这一篇博客,我即将带领大家一起来看一下Struts2内置 ...
  • 拦截器是很实用的功能下面完成以下的需求如果用户登录后可以访问action中的所有的方法,如果用户没有登录那么不允许访问action中的方法,并且提示你没有权限执行该操作1.在一个类中完成要用到的属性和方法package com.qn.struts;import java.io.File;import ...
  • 简单理解Struts2中拦截器与过滤器的区别及执行顺序
    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会去查找相应的ActionMapper,如果找 ...
  • 最近在利用struts2拦截器实现文字过滤功能是出现了如下异常:java.lang.NullPointerException dr.interceptor.MyInterceptor.intercept(MyInterceptor.java:19) com.opensymphony.xwork2.D ...
一周排行
  • 本主题介绍文件级防病毒程序对运行 Microsoft Exchange Server 2013 的计算机的影响.如果按照本主题中所述的建议操作,可以帮助提高 Exchange 组织的安全性并改善运行状况.文件级扫描程 ...
  • 在linux下创建了用户,发现有问题,想删除重建,结果就遇到了这个问题,网上找解决方法,发现有如下两种方法:http://blog.itechol.com/space-33-do-blog-id-5954.htmlh ...
  • 添加tab支持tab内容:vim tab.py#! /usr/bin/pythonimport sysimport readlineimport rlcompleterimport osreadline.parse_ ...
  • 在<在Linq to Sql中管理并发更新时的冲突(2):引发更新冲突>一文中,我们描述了Linq to Sql检测在更新时是否产生了冲突的基本方法:将该记录每个字段原来的值和更新时的值进行对比,如果稍有 ...
  • 转自<沈阳晚报>    新闻背景:7月1日以后,在我国境内生产销售的计算机出厂前将预装一款名为"绿坝-花季护航"的上网过滤软件.这款软件具备拦截色情内容.过滤不良网站.控制上网时间.查 ...
  • SeleniumFFWebDriver加载firebug和设置代理
    首先这次使用的webDriver for Firefox的 由于项目的原因,需要在测试的时 ...
  • 第一个:自己第一次暗恋的人.所有关于初恋的美好苦涩都发生在这个阶段.小心翼翼而又不敢靠近.时光流转,记忆依然是那么的清晰.依稀记得:在街道的转角遇到她时砰砰的心跳,在班级上呆呆地看着坐在前排的她,自己写给她的诗,写给 ...
  • Exchange2003之发送加密认证邮件案例详解
    注意:虽然标题是如何发送加密认证的邮件,其实整个过程包括<服务器的部署 ,PKI的配 ...
  • Android之手机电池电量应用
    原理概述:     手机电池电量的获取在应用程序的开发中也很常用,Android系统中手机 ...
  • 嵌入式系统无疑是当前最热门最有发展前途的IT应用领域之一.嵌入式系统用在一些特定专用设备上,通常这些设备的硬件资源(如处理器.存储器等)非常有限,并且对成本很敏感,有时对实时响应要求很高等.特别是随着消费家电的智能化 ...