`

Struts2 Interceptor 的一个诡异问题

阅读更多

之前开发了一个web应用程序,开始的架构是用JSP+Servlet+JavaBean这种最原始的三层机构。但是随着后来业务的发展和对系统本身的要求,我把它迁移到了SSH2框架上。在集成Struts2的时候发生了一个诡异的问题。

我之前写了一个Filter(暂称其为loginFilter),作用是可以帮助用户自动登录(如果用户把用户信息保存在cookies里面,则自动登录).通过参考Struts2的文档,我打算用Interceptor来替代原先的这个Filter,不过这样做的结果出现了诡异的问题。

虽然Interceptor可以执行完成并且User对象已经创建并且放入Session中,跳转回main.jsp的时候还是显示不了有USER的界面。但是再刷新一下main.jsp就可以显示出USER对应的界面了,真是怪事,百思不得其解。

   看了一下Struts2的文档,里面有这么一段:

The intercept method is where the interceptor code is written. Just like an action method, intercept returns a result used by Struts to forward the request to another web resource. Calling invoke on the parameter of type ActionInvocation will execute the action (if this is the last interceptor on the stack) or another interceptor.

Keep in mind that invoke will return after the result has been called (eg. after you JSP has been rendered), making it perfect for things like open-session-in-view patterns. If you want to do something before the result gets called, you should implement a PreResultListener.

看了下我的Interceptor,最后的返回语句我写的是invocation.invoke();

按照上述文档的说明,invoke方法在返回结果之后才执行。我希望先返回到main.jsp,所以也许我应该实现PreResultListener接口并且实现它的方法beforeResult(),于是这样做了,并且在beforeResult方法里Return了一个新的Result "resultA",在Struts.xml找到action并且配置这个result,使其跳转回main.jsp.

main.jsp的user部分对应的界面可以正常显示了,不过其它部分页面加载出现了问题。经过排查,后面这个问题是由于前端在加载页面的时候才用了AJAX这样异步的操作方式。后面这个问题如果想用Interceptor来完美解决,可能需要在前端进行一部分的修改,所以我最终放弃了Intercepter的做法,这个自动登录的功能最后还是才用的Filter来做的,Filter不光过滤Action的请求,也可以过滤任何URL下的请求,所以当main.jsp请求完成的时候filter不用担心是不是异步加载的,因为加载后filter也会调用,这样才用Interceptor产生的第二个问题也解决掉了。

 

以后有机会我会再排查一下这个问题是否和异步加载数据有关,不过红字的部分对于Interceptor的使用是很有帮助的。

 

 

分享到:
评论

相关推荐

    struts2 Interceptor详解

    当一个HTTP请求到达Struts2框架时,会按照配置的顺序依次执行一系列拦截器,最后再调用Action。每个拦截器都有两个主要方法:`intercept()`和`destroy()`。`intercept()`方法会在Action执行前后被调用,`destroy()`...

    Struts2拦截器(Interceptor)

    Struts2拦截器(Interceptor) Struts2拦截器(Interceptor)

    struts2 Interceptor拦截器

    2. **如何实现**:Struts2提供了一个灵活的Interceptor框架,开发者可以通过实现Interceptor接口来自定义拦截器,也可以通过继承已有的拦截器实现来进行扩展。 3. **配置方式**:Interceptor的配置通过Struts2的配置...

    Struts2_interceptor_和_filter区别

    - **Interceptor** 的实现则需创建一个实现`org.apache.struts2.interceptor.Interceptor`接口的类,主要关注点在于`intercept()`方法的实现。配置方面,Interceptor的定义和绑定在Struts2的配置文件`struts.xml`中...

    Struts2 拦截器 Interceptor

    ### Struts2 拦截器 Interceptor #### 一、概述 在Struts2框架中,拦截器(Interceptor)是一种非常重要的机制,它能够帮助开发者实现诸如权限控制、事务管理、日志记录等跨切关注点的功能。通过定义不同的拦截器...

    STRUTS2:拦截器Interceptor

    STRUTS2:拦截器Interceptor

    saif(struts1 interceptor)

    Struts1是一个经典的Java Web框架,它为开发者提供了一种结构化的MVC(Model-View-Controller)设计模式实现方式。...对于仍在使用Struts1的项目来说,"saif(struts1 interceptor)"无疑是一个有价值的补充工具。

    struts2 interceptor annotation plugin

    Struts2是一个强大的Java web应用程序框架,它基于MVC(Model-View-Controller)设计模式,为开发者提供了构建可维护性、可扩展性良好的Web应用的工具。在Struts2中,拦截器(Interceptor)是核心组件之一,它们在...

    struts2 拦截器写法

    Struts2拦截器是在访问某个Action或Action的某个方法,字段之前或之后实施拦截,并且Struts2拦截器是可插拔的,拦截器是AOP的一种实现.

    Struts2.x_Interceptor

    4. **默认拦截器**:Struts2框架提供了一些内置的Interceptor,如`params`(处理请求参数),`exception`(处理异常),`i18n`(国际化支持),`chain`(继续调用下一个Interceptor或Action)等。这些拦截器通常被...

    struts2项目开发

    Struts2 是一个基于 Java Web 的框架,广泛应用于 Web 应用程序的开发。下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目需求分析 在 Struts2 ...

    struts2jar包

    Struts2是一个强大的Java EE应用程序框架,主要用于构建企业级的Web应用。它的核心是MVC(Model-View-Controller)设计模式,可以帮助开发者组织代码,提高开发效率,并且提供了丰富的特性来支持表单验证、国际化、...

    留言板留言板struts2留言板struts2

    Struts2是一个强大的Java web应用程序框架,用于构建和部署企业级的MVC(Model-View-Controller)架构的Web应用。这个"留言板留言板struts2"项目,显然是一个基于Struts2实现的简单留言板系统,旨在展示Struts2的...

    struts2小程序 struts2代码

    Struts2是一个强大的Java web应用程序框架,用于构建和管理MVC(模型-视图-控制器)架构的应用。这个“struts2小程序”很可能是开发者利用Struts2框架开发的一个小型项目,可能包含了基本的CRUD操作或其他特定功能。...

    struts2jar.zip

    3. **Interceptor**:拦截器是Struts2的一个强大特性,它们在Action调用前后执行,可以实现如日志记录、权限验证等功能。 4. **配置文件**:struts.xml是Struts2的主要配置文件,定义了Action、Result和Interceptor...

    struts2常用的7个jar包,struts2常用的7个jar包

    Struts2是一个强大的Java Web应用程序框架,用于构建和部署可维护、高性能的MVC(Model-View-Controller)架构的应用程序。它简化了开发过程,提供了丰富的插件和功能,使得开发者可以更专注于业务逻辑而不是底层...

    Struts2接口文档

    Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,旨在简化创建用户交互式、数据驱动的web应用的过程。这个“Struts2接口文档”是开发者的重要参考资料,提供了关于...

    struts2 拦截器的使用(继承抽象拦截器)

    Struts2是一个非常流行的Java Web框架,它提供了一种优雅的方式来组织和控制应用程序的行为。拦截器是Struts2的核心组件之一,它们在Action调用前后执行,提供了诸如日志、事务管理、性能监控等附加功能。这篇博客...

Global site tag (gtag.js) - Google Analytics