博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2之类范围拦截器和方法拦截器
阅读量:5080 次
发布时间:2019-06-13

本文共 3133 字,大约阅读时间需要 10 分钟。

 1、Struts2拦截器的体系结构

Struts2拦截器最大的特点是其透明性,即用户感觉不到它的存在,但我们在使用Struts2框架时,拦截器时时刻刻都在帮助我们处理很多事情。

包括:

 文件上传

 表单校验

 自动将预定义好的表单参数值封装给Action使用等

说明:

每一个Action请求都包装在一系列的拦截器内部。拦截器可以动态拦截Action。拦截器所提供的机制可以保证在执行一个Action的前后执行拦截器中的代码,也可以在一个Action执行前阻止其执行。

2、Struts2内建拦截器

Struts2内建了大量的拦截器,这些拦截器以name-class形式配置在struts-default.xml中。

 name是拦截器的名称,即以后使用该拦截器的唯一标识

 class则指定了该拦截器的实现类

如果我们定义的package继承了Struts2的默认struts-default包,则可以自行使用下面定义的拦截器。

/HelloWorld.jsp

常见的struts2内建拦截器介绍见下表

在处理与系统逻辑相关的通用功能时,需要通过自定义拦截器来实现。

 如权限控制,日志记录

一、自定义基于类范围的拦截器

创建自定义拦截器步骤如下:

  1、创建类SimpleAction,继承于ActionSupport,定义operator方法,用于获取当前系统时间

public class SimpleAction extends ActionSupport{     public String operator(){          System.out.println("开始执行SimpleAction类的operator()时间为:"+DateTimeUtils.getStringDate(new Date()));          return  "operator";     }}

  2、创建拦截器类SimpleInterceptor,继承于AbstracInterceptor,该类用于对SimpleAction类进行拦截

public class SimpleInterceptor extends AbstractInterceptor{         public String intercept(ActionInvocation  invocation) throws Exception {              //打印出在执行SimpleAction类之前执行拦截器的时间              System.out.println("在执行SimpleAction之前开始执行SimpleInterceptor的intercept()的时间为:"+DateTimeUtils.getStringDate(new Date()));                            //调用下一个拦截器,如果没有拦截器就调用匹配的Action              String  result=invocation.invoke();  //该result是方法的返回值 本例中result=operator              //打印出在执行SimpleAction类之后执行拦截器的时间              System.out.println("在执行SimpleAction之后开始执行SimpleInterceptor的intercept()的时间为:"+DateTimeUtils.getStringDate(new Date()));              return result;           }    }

  3、在struts.xml文件中,配置SimpleAction和SimpleIntercept的相关信息

/success.jsp

注意:如果为Action指定一个拦截器,则系统默认的拦截器就会失效,导致Struts2的很多功能无法使用。所以Action在指定了一个拦截器后,还需要将默认的拦截器注册给Action。Struts2默认拦截器的别名为defaultStack。

  4、浏览器输入:http://localhost:8080/项目名/simple_operator.action

 二、方法拦截器

在上面的类拦截器中,我们可以在SimpleAction再定义一个方法query()方法,然后访问:http://localhost:8080/项目名/simple_query.action,即可对query方法拦截。

更细粒度的控制方法拦截,则需要进行如下的配置:

  
  
query

并且拦截器类要继承MethodFilterInterceptor类,而不是继承AbstractInterceptor类,否则每个访问到的方法都会被自动拦截,达不到控制的目的。

public class SimpleInterceptor extends MethodFilterInterceptor{    @Override    protected String doIntercept(ActionInvocation invocation) throws Exception {        System.out.println("进入拦截器");        //调用下一个拦截器        String result = invocation.invoke();                System.out.println("调用完拦截器"+"--result的值:"+result);                return result;    }}

 常见的登录拦截操作如下:

@Overridepublic String intercept(ActionInvocation invocation) throws Exception {  HttpSession session = ServletActionContext.getRequest().getSession();   Object account = session.getAttribute("account");   if(account != null){       return invocation.invoke();   }   HttpServletRequest request = ServletActionContext.getRequest();   request.setAttribute("err", "请登录后操作!");   return "login";}

 

转载于:https://www.cnblogs.com/x-jingxin/p/8458466.html

你可能感兴趣的文章
『Python基础-4』字符串
查看>>
tp框架 使用ajax
查看>>
Mysql: 强制走索引:mysql between 日期索引 索引问题-日期索引使用
查看>>
改变word的语言字典
查看>>
Android APP的安装路径
查看>>
煮鸡蛋的启示
查看>>
python_列表结构模拟栈和队列
查看>>
IIS支持.apk下载的方法
查看>>
vue mounted中监听div的变化
查看>>
MySQL二进制日志功能介绍
查看>>
Domino单用户多账号多邮件地址配置
查看>>
Asp.net WebPages框架运行原理浅析
查看>>
网络爬虫-正方教务系统登录
查看>>
【LeetCode】数组-4(581)-给未排序数组中子数组排序使得整个数组排序 找到这个最小的子数组...
查看>>
FPGA网站推荐
查看>>
11.巨坑,注意了,关于显示不正常的问题,localstorage的存储问题
查看>>
《windows程序设计》滚动条Ⅲ(09)
查看>>
耿丹CS16-2班第六次作业汇总
查看>>
开发中的一些零碎知识点
查看>>
Metasploit的使用
查看>>