当前的项目中存在下面一种场景:web应用的某个功能中,jsp中加载的某个插件需要将数据提交给web服务端。插件中通过ObjectOutputStream向web端传输数据,但springmvc的拦截器会提前读取该流对象,那么配置指定的Action就无法再读取到该Stream的内容,会导致如下异常:
java.io.EOFException at java.io.ObjectInputStream$BlockDataInputStream.peekByte(Unknown Source) at java.io.ObjectInputStream.readObject0(Unknown Source) at java.io.ObjectInputStream.readObject(Unknown Source)
由于整个项目的controler层用的springmvc框架,所以目前的解决办法是编写一个独立的servlet来单独针对该数据的接收。
因为采用注解的方式将配置service并交给spring管理,而需要编写的servlet需要注入这些service,所以这边采用代理的方式实现:
第一步:编写代理类HttpServletProxy
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jxl.common.Logger; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.WebApplicationContextUtils; /** * @description * @author minux * @date 2013-9-2 下午2:16:22 */ public class HttpServletProxy extends HttpServlet { private static final long serialVersionUID = -2934353313384038254L; public static Logger logger = Logger.getLogger(HttpServletProxy.class); private String targetServlet; private HttpServlet proxy; public void init() throws ServletException { this.targetServlet = getInitParameter("targetServlet"); getServletBean(); proxy.init(getServletConfig()); logger.info(targetServlet + " was inited by HttpServletProxy successfully......"); } private void getServletBean() { WebApplicationContext wac = WebApplicationContextUtils .getRequiredWebApplicationContext(getServletContext()); this.proxy = (HttpServlet) wac.getBean(targetServlet); } public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, RuntimeException { proxy.service(request, response); } }
第二步:在web.xml中配置改代理servlet
<servlet> <servlet-name>ComplexWebLoadTestServletProxy</servlet-name> <servlet-class>cn.hxcomm.web.controller.HttpServletProxy</servlet-class> <init-param> <param-name>targetServlet</param-name> <param-value>complexWebLoadTestServlet</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>ComplexWebLoadTestServletProxy</servlet-name> <url-pattern>/complexWebLoadTestServlet.do</url-pattern> </servlet-mapping>
第三步:编写真正实现功能的ComplexWebLoadTestServlet并注解注入
import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.sql.Timestamp; import java.util.Calendar; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import jxl.common.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import cn.hxcomm.common.domain.ComplexWebLoadTestDetail; import cn.hxcomm.web.service.ComplexWebLoadTestService; /** * @description * @author minux * @date 2013-8-30 下午3:44:02 */ @Service("complexWebLoadTestServlet") public class ComplexWebLoadTestServlet extends HttpServlet { private static final long serialVersionUID = -371252886055302137L; public static Logger logger = Logger .getLogger(ComplexWebLoadTestServlet.class); @Autowired private ComplexWebLoadTestService complexWebLoadTestService; public ComplexWebLoadTestServlet() { super(); } public void init() throws ServletException { super.init(); } public void service(HttpServletRequest requeset, HttpServletResponse response) throws ServletException, IOException, RuntimeException { this.doWork(requeset, response); } private void doWork(HttpServletRequest request, HttpServletResponse response) { } }
这样基本就可以实现绕开拦截器提前读取stream的情况。
当然servlet注入service的也有其他的实现方式,比如可以直接不需要代理servlet,直接编写servlet读取需要的配置文件,然后取出需要的service的bean对象。
但是个人感觉代理的方式更方便扩展和管理。
相关推荐
### SpringMVC拦截器 #### 一、拦截器概述 拦截器(Interceptor)是一种轻量级、低侵入式的AOP实现方式,在SpringMVC框架中有着广泛的应用。它主要用于处理那些与业务逻辑无关但又频繁出现的功能需求,如日志记录...
在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,它允许开发者在请求处理的生命周期中插入自定义的行为。Spring MVC的拦截器不同于Spring AOP的切面,它专注于处理HTTP请求和响应,主要应用于...
拦截器对于实现全局的功能,如权限验证、日志记录、性能统计等非常有用。接下来,我们将深入探讨Spring MVC拦截器的工作原理、使用方式以及常见应用场景。 ### 1. 拦截器工作原理 Spring MVC中的拦截器是基于AOP...
本教程将详细介绍如何使用Spring MVC的拦截器来实现这一功能。 首先,了解拦截器(Interceptor)在Spring MVC中的角色。拦截器是Spring MVC提供的一种AOP(面向切面编程)特性,允许我们在请求处理之前、之后或者在...
在本章中,我们将深入探讨"处理器拦截器"在SpringMVC框架中的应用与实现,这是SpringMVC中一个至关重要的组件,它允许我们在请求处理前后执行自定义逻辑。通过学习这一主题,我们可以更好地理解SpringMVC的工作流程...
虽然在这个特定的例子中,`application.properties`可能没有直接与拦截器相关,但我们可以在这里配置一些全局属性,比如日志级别,这对于调试和监控拦截器的行为非常有用。例如: ```properties logging.level.org....
同时,SpringMVC还支持在配置文件中对控制器进行更复杂的配置,比如URL映射、拦截器(Interceptor)等。拦截器可以用于执行一些全局性的操作,如登录检查、权限控制等,在请求到达目标控制器之前或离开之后执行。 ...
1. 性能上:Struts1 > SpringMVC > Struts2,因为Struts2的拦截器链相比SpringMVC更复杂。 2. 开发效率:SpringMVC和Struts2相似,比Struts1更快。 【核心入口类】 SpringMVC的核心入口类是DispatchServlet;Struts...
5. **拦截器(Interceptor)**:SpringMVC中的拦截器可以对请求和响应进行拦截,实现通用的功能,如登录验证、日志记录、性能监控等。它们是AOP(面向切面编程)的一种体现,可以避免在每个控制器方法中重复代码。 ...
拦截器是SpringMVC中的另一个强大特性,它可以增强应用的功能,如权限验证、日志记录、性能统计等。我们在源码中会发现自定义Interceptor的实现,它们通过HandlerInterceptor接口进行预处理和后处理。 国际化(i18n...
3. **控制器方法**:在SpringMVC的控制器类中,定义一个方法接收`MultipartFile`对象,这个对象可以用来处理上传的文件。 4. **保存文件**:在控制器方法内部,将`MultipartFile`内容保存到服务器的指定位置。 接...
- 异步请求:Spring MVC的拦截器不适用于异步请求,对于异步场景,可以考虑使用Filter或者自定义解决方案。 综上所述,“HelloSpringMVC.zip”提供的示例是一个很好的起点,它帮助开发者掌握Spring MVC拦截器的...
《mina_spring模仿springmvc控制器》 在当前的IT行业中,网络通信技术和框架的应用日益广泛。Spring框架作为Java领域中的核心框架,以其强大的依赖注入和面向切面编程能力深受开发者喜爱。而Mina则是一个高性能的...
1. **配置 Spring MVC**:在 `web.xml` 文件中配置 `DispatcherServlet`,并创建一个 `servlet-context.xml` 配置文件,用于定义 Spring MVC 的组件如视图解析器、拦截器等。 2. **创建 Controller**:编写一个 `...
这可以通过Spring Security实现,配置拦截器检查请求中的登录信息。你可以在WebSocket端点的URL路径上添加安全约束,或者自定义WebSocket消息处理器,对每个消息进行安全检查。 5. **客户端集成**:在HTML页面中,...
这些配置文件定义了DispatcherServlet的初始化参数、HandlerMapping和HandlerAdapter的设置、视图解析器以及其它自定义的拦截器和监听器。 在"springmvc demo"项目中,我们可以期待找到以下内容: - `web.xml`:...
- 配置Web.xml:在Web应用的配置文件中,我们需要配置CAS过滤器链,包括`CasAuthenticationFilter`、`TicketValidationFilter`和`CasHttpServletRequestWrapperFilter`,这些过滤器负责拦截请求、验证票据并创建...
这些配置文件会定义服务端口、协议、处理器链、服务bean以及Spring MVC的相关映射和拦截器。 6. **示例代码展示**:博客可能给出了如何创建Mina的SocketAcceptor,如何定义Spring MVC的Controller,以及如何在它们...
6. **拦截器(Interceptor)**:SpringMVC的拦截器机制允许我们在请求处理前后执行自定义逻辑,例如进行权限验证、日志记录等。通过实现HandlerInterceptor接口并配置在SpringMVC配置中,可以实现全局的接口拦截处理...
4. **配置SpringMVC**:配置SpringMVC的servlet-context.xml,定义视图解析器、拦截器、处理器映射器等。 5. **配置MyBatis**:创建MyBatis的配置文件(`mybatis-config.xml`),并编写Mapper接口和对应的XML映射...