Struts2拦截器运作

Struts2拦截器运作

拦截器是AOP思想的一种实现,可以将大问题分解成多个小问题。自己做的一个小项目用到struts2的拦截器,那么此处就回顾一下Struts2的拦截器知识。

拦截器(Interceptor)

拦截器是Struts2的核心组件,数据校验(validate,validateX)、国际化、文件上载下载等,这些都靠拦截器。Struts2定义的拦截器是按功能分开的,若要使用某个功能,就在某个控制器(Action)上,或在整个包(struts.xml里的package)里的Action上,加入拦截器。那么与Filter过滤器比起来,这就像插件了。

Filter作用的范围广,针对url过滤。Interceptor则围绕Action和Result。为什么这么说呢?这得看Struts2的工作流程,看图:

Struts2的工作流程

如图,一个来自浏览器的request,请求Action时,首先会经过多重拦截器,Action执行完,返回Result,Result会原路经过拦截器。

  1. Request发送给StrutsPrepareAndExecuteFilter
  2. StrutsPrepareAndExecuteFilter调用Action映射器ActionMapper,ActionMapper根据请求的URL来查找是否有对应的action可调用。

    若是,返回一个描述了这个action的ActionMapper给StrutsPrepareAndExecuteFilter;

    否,返回null。

  3. 有可用的action,那么StrutsPrepareAndExecuteFilter把请求交给ActionProxy,是开发人员编写的Action的代理类。

  4. ActionProxy创建一个ActionInvocation实例,并进行初始化。
  5. 执行Action前,一系列拦截器就被调用了。

    ActionInvocation持有拦截器、Action实例、结果映射、ActionContext

  6. Action调用结束之后,会根据struts.xml文件中action的result配置对象,得到对应的返回结果。调用execute方法之后,对返回结果进行渲染。
  7. 再次执行拦截器,逆序的。
  8. 结果response返回到浏览器。

使用拦截器

使用拦截器,需要在struts.xml配置,并编写XXXInterceptor类

1.配置拦截器

可以定义一个拦截器:

<interceptor name="permission" class="com.interceptor.AuthorizationInterceptor"/>

若定义时,需要传入参数:

    <interceptor name="permission" class="com.interceptor.AuthorizationInterceptor">
        <param name="param">param</param>
    </interceptor>

定义多个拦截器,则使用拦截器栈,使用拦截器时指定参数的话,会覆盖默认参数:

    <package name="default" extends="rest-default,json-default">
        <interceptors>
            <interceptor name="permission" class="com.interceptor.AuthorizationInterceptor"/>

            <interceptor-stack name="myStack">
                <interceptor-ref name="permission">
                    //使用拦截器时,该包下的action,不拦截以下方法,多个方法,逗号隔开
                    <param name="excludeMethods">valid,logout,index</param>
                </interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        //对整个包下的action执行该拦截,这句别忘了,否则根本就不拦截了 
        <default-interceptor-ref name="myStack" />

        <global-results>
            <result name="error">/WEB-INF/content/error.jsp</result>
        </global-results>
    </package>

2.编写XXXInterceptor类

有三种方式

  • 实现xwork2的Interceptor接口,init(),destory(),intercept()方法
  • 继承AbstractInterceptor类,提供了init(),destory()的空实现,需重写intercept()方法
  • 继承MethodFilterInterceptor类,该类本身也继承了AbstractInterceptor类。不同的是,用该方法编写的拦截器,在struts.xml配置时,可以有excludeMethods,includeMethods两个参数,表示不拦截的方法,和需要拦截的方法。

第二,第三种用得多,以第三种为例,需重写doIntercept()方法

import java.util.Map;

import org.springframework.stereotype.Component;

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

public class AuthorizationInterceptor extends MethodFilterInterceptor {

    private static final long serialVersionUID = 1L;

    @Override
    protected String doIntercept(ActionInvocation invocation) throws Exception {
        ActionContext context = ActionContext.getContext();
        Map<String,Object> session = context.getSession();
        Object user = session.get("user");
        if(user==null) {
            return "login";
        }
        return invocation.invoke();
    }

}

小结

从这次的项目看,当需要自定义拦截器拦截范围时,可以考虑一下分开不同的package,尤其是用struts2的rest plugin时。

拦截器和过滤器很类似,Interceptor在struts.xml配置,拦截action请求,Filter在web.xml配置,拦截一切对象,范围广,更强大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资源
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面可以对界面显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值