Struts 2拦截器的研究与应用
2019-06-20甘文丽
甘文丽
【摘 要】介绍了Struts 2框架拦截器的设计思想和工作原理,并以软件系统常见的权限控制功能为例,详细说明了拦截器在基于Java EE 平台的Web应用系统中的设计及配置。拦截器在Web开发中的应用,提高了系统代码的可复用性、可扩展性及灵活性。
【关键词】拦截器;过滤器;Java EE;权限控制
中图分类号: TP311 文献标识码: A 文章编号: 2095-2457(2019)11-0031-002
【Abstract】Introduces the design idea and working principle of the Struts 2 framework interceptor,and take the software system as an example,A detailed description of the interceptor in the design and configuration of Web application system based on Java EE platform,the application of the interceptor in Web development,improve code reusability, scalability and flexibility.
【Key words】Interceptor;Filter;Java EE;Permission control
0 前言
目前,在Web應用软件开发中,经常要用到一些公共服务如用户认证、权限检查、日志管理、安全检测、统计应用的访问量、实现数据压缩等,如果能将这些服务和软件的主要业务逻辑模块恰当地组合在一起,将提高代码的可复用性、可扩展性及灵活性[1-3]。AOP(Aspect-Oriented Programming)面向切面的编程利用横切技术将与业务无关的公共模块同逻辑模块分离,拦截器是AOP的一种实现策略,以动态的“可插拔”的方式解决了上述问题。文章详细分析了拦截器的设计思想和工作原理,并以权限控制为例,详细说明了拦截器的设计及配置,为Web开发人员灵活运用拦截器技术提供了借鉴。
1 拦截器
1.1 概述
Struts 2是一个基于MVC设计模式的开源框架,它的很多核心功能都借助于拦截器实现,如封装请求参数、数据校验、类型转换、文件上传、防止表单的重复提交等。在实际项目开发中,利用Struts 2的内置拦截器就可以完成很多操作,当内置拦截器不能满足要求时,开发人员可以自定义拦截器进行扩展。
在访问Struts 2控制器Action的方法之前或之后,拦截器可以进行拦截,加入某些操作,完成特定的功能[4]。拦截器同时也提供了一种可以提取Action中可重复执行部分的方式,通过把重复的代码提取到拦截器类中,从而实现更好的代码复用性。拦截器实现了AOP技术,并且是可插拔的,当需要为Action添加功能的时候就配置该拦截器,当为Action减少功能的时候就取消配置拦截器,具有很好的可扩展性。
1.2 工作原理
Struts 2中将各个功能对应的拦截器分开定义,每个拦截器完成单个功能,如果需要对Action运用某个功能就引用对应的拦截器。在实际开发中,经常需要在Action执行前同时执行多个拦截动作,如:用户登录检查、登录日志记录以及权限检查等,这时,可以把多个拦截器组成一个拦截器栈。所谓的拦截器栈是指对应各个功能的拦截器按照一定的顺序排列形成的链,在使用时,可以将栈内的多个拦截器当成一个整体来引用。当拦截器栈被附加到一个Action上时,在执行Action之前必须先执行拦截器栈中的每一个拦截器。通常情况下,拦截器都是以代理方式调用的。
Struts 2拦截器在Action执行前后进行拦截,围绕着Action的执行而执行,比如实现日志管理拦截器和安全功能的拦截器,在系统的Action关联了拦截器,添加到Action执行过程中以后,系统的整个执行流程就变为:记录日志、执行安全检测、执行Action、执行安全检测、记录日志,在执行的过程中,每一个拦截器类的拦截方法决定是传递请求,还是终止请求。
2 权限控制拦截器的设计与实现
在实际的Web应用软件项目中,与项目的业务逻辑相关的通用功能需要开发人员自定义拦截器实现。比如Web应用软件都要涉及到权限控制这部分,当用户访问系统的受保护资源时,需要先检查用户是否已经登录,以及是否有权限访问,可以由拦截器截获用户请求,判断用户是否已经登录。
2.1 自定义拦截器
如果需要自定义拦截器类,该类就需要实现Interceptor接口。这个接口提供了拦截器的生命周期方法:(1)init()方法在拦截器被创建后调用,对系统相关资源进行必要的初始化工作。(2)destroy()方法在拦截器对象被销毁之前调用,用来释放和拦截器相关的资源。(3)intercept(ActionInvocation invocation)方法是拦截器的核心方法,用来实现具体的拦截操作,可以通过ActionInvocation参数的invoke()方法,将控制权转给下一个拦截器或者控制器Action。如果需要自定义拦截器类,只需要实现Interceptor接口的三个方法即可。然而在实际开发过程中,更常用的一种方式是继承抽象拦截器类AbstractIntercepter,它实现了Interceptor接口,因此可以直接继承该抽象类,简化代码的编写。
2.2 实现权限控制拦截器
判断用户是否登录,可以跟踪用户的会话对象session来完成,利用ActionContext对象就可以可访问到session中的属性,拦截器执行拦截的intercepte方法的invocation参数可以得到ActionContext对象,通过ActionInvocation参数取得用户的session实例的引用,从而判断是否需要转入登录页面。权限控制拦截器类intercepte方法的关键代码如下:
如果用户登录了,就把登录时输入的用户名保存在session对象的username属性中,通过ActionContext对象获得session,然后检查session中是否存在username属性,这样就可以判断用户登录与否。如果用户已经登录,程序就通过invocation.invoke()去执行下一拦截器或者控制器。如果检查到用户未登录,那么就会返回登录界面的逻辑视图。
2.3 配置权限控制拦截器
如果要使用权限控制拦截器,还要在项目的配置文件struts.xml中定义该拦截器。由于Struts2中很多核心功能都是由系統默认的defaultStack中的拦截器实现的,所以开发人员自定义的拦截器需要引用系统默认的defaultStack,这样Web应用才可以使用Struts 2框架提供的众多功能。接下来可以在系统的控制器Action中引用拦截器,控制器封装了用户发出的增删改查请求的方法,用户发出的请求都首先被拦截器栈中的拦截器拦截,检查用户是否登录,以及是否有足够的权限来执行该操作,如果没有登录,则向用户显示登录页面,如果用户已经登录,则把请求传递给控制器相应的处理请求的方法,最后给用户返回响应。
3 结束语
拦截器是Struts 2的核心组成部分,它提供了一种可以提取Action中可重复执行部分的方式,本文介绍了拦截器的设计思想和工作原理,并以软件系统常见的权限控制为例,详细说明了自定义拦截器的设计及配置, Web开发人员灵活运用拦截器技术可以显著提高系统代码的可重用性、可扩展性和灵活性。
【参考文献】
[1]赵春亮,张建国,孟晨,等.基于Struts2拦截器的日志记录的设计与实现[J].计算机与现代化,2011,2:150-153.
[2]赵秀霞,付秀丽.基于组件和拦截器的Web系统权限设计与实现[J].现代电子技术,2014,8:105-107.
[3]杨树林,胡洁萍.使用Annotation和拦截器实现访问控制[J].北京印刷学院学报,2010,2:52-54.
[4]郑阿奇.Java EE实用教程[M].北京:电子工业出版社,2015.102-103.作者简介:甘文丽(1979—),女,河北邢台人,副教授,研究方向为软件工程、数据挖掘。