`
xm_koma
  • 浏览: 384768 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

springmvc拦截器对于流对象传输的拦截

    博客分类:
  • Java
阅读更多

      当前的项目中存在下面一种场景: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拦截器

    ### SpringMVC拦截器 #### 一、拦截器概述 拦截器(Interceptor)是一种轻量级、低侵入式的AOP实现方式,在SpringMVC框架中有着广泛的应用。它主要用于处理那些与业务逻辑无关但又频繁出现的功能需求,如日志记录...

    SpringMVC 拦截器实现分析.docx

    在Spring MVC框架中,拦截器(Interceptor)是一个强大的工具,它允许开发者在请求处理的生命周期中插入自定义的行为。Spring MVC的拦截器不同于Spring AOP的切面,它专注于处理HTTP请求和响应,主要应用于...

    springmvc拦截器

    拦截器对于实现全局的功能,如权限验证、日志记录、性能统计等非常有用。接下来,我们将深入探讨Spring MVC拦截器的工作原理、使用方式以及常见应用场景。 ### 1. 拦截器工作原理 Spring MVC中的拦截器是基于AOP...

    spring mvc拦截器过滤json中的null值

    本教程将详细介绍如何使用Spring MVC的拦截器来实现这一功能。 首先,了解拦截器(Interceptor)在Spring MVC中的角色。拦截器是Spring MVC提供的一种AOP(面向切面编程)特性,允许我们在请求处理之前、之后或者在...

    源代码下载 第五章 处理器拦截器详解——跟着开涛学SpringMVC

    在本章中,我们将深入探讨"处理器拦截器"在SpringMVC框架中的应用与实现,这是SpringMVC中一个至关重要的组件,它允许我们在请求处理前后执行自定义逻辑。通过学习这一主题,我们可以更好地理解SpringMVC的工作流程...

    springboot spring aop 拦截器注解方式实现脱敏

    虽然在这个特定的例子中,`application.properties`可能没有直接与拦截器相关,但我们可以在这里配置一些全局属性,比如日志级别,这对于调试和监控拦截器的行为非常有用。例如: ```properties logging.level.org....

    SpringMVC+ExtJS完美集成(数据传输方式为JSON和model)

    同时,SpringMVC还支持在配置文件中对控制器进行更复杂的配置,比如URL映射、拦截器(Interceptor)等。拦截器可以用于执行一些全局性的操作,如登录检查、权限控制等,在请求到达目标控制器之前或离开之后执行。 ...

    springmvc+mybatis面试题

    1. 性能上:Struts1 &gt; SpringMVC &gt; Struts2,因为Struts2的拦截器链相比SpringMVC更复杂。 2. 开发效率:SpringMVC和Struts2相似,比Struts1更快。 【核心入口类】 SpringMVC的核心入口类是DispatchServlet;Struts...

    springMVC项目开发框架

    5. **拦截器(Interceptor)**:SpringMVC中的拦截器可以对请求和响应进行拦截,实现通用的功能,如登录验证、日志记录、性能监控等。它们是AOP(面向切面编程)的一种体现,可以避免在每个控制器方法中重复代码。 ...

    SpringMVC demo 完整源码实例下载.zip

    拦截器是SpringMVC中的另一个强大特性,它可以增强应用的功能,如权限验证、日志记录、性能统计等。我们在源码中会发现自定义Interceptor的实现,它们通过HandlerInterceptor接口进行预处理和后处理。 国际化(i18n...

    SpringMVC上传文件 SSH上传文件

    3. **控制器方法**:在SpringMVC的控制器类中,定义一个方法接收`MultipartFile`对象,这个对象可以用来处理上传的文件。 4. **保存文件**:在控制器方法内部,将`MultipartFile`内容保存到服务器的指定位置。 接...

    HelloSpringMVC.zip(拦截器)

    - 异步请求:Spring MVC的拦截器不适用于异步请求,对于异步场景,可以考虑使用Filter或者自定义解决方案。 综上所述,“HelloSpringMVC.zip”提供的示例是一个很好的起点,它帮助开发者掌握Spring MVC拦截器的...

    mina_spring模仿springmvc控制器

    《mina_spring模仿springmvc控制器》 在当前的IT行业中,网络通信技术和框架的应用日益广泛。Spring框架作为Java领域中的核心框架,以其强大的依赖注入和面向切面编程能力深受开发者喜爱。而Mina则是一个高性能的...

    springmvc简单的登陆

    1. **配置 Spring MVC**:在 `web.xml` 文件中配置 `DispatcherServlet`,并创建一个 `servlet-context.xml` 配置文件,用于定义 Spring MVC 的组件如视图解析器、拦截器等。 2. **创建 Controller**:编写一个 `...

    基于springmvc的websocket及时聊天

    这可以通过Spring Security实现,配置拦截器检查请求中的登录信息。你可以在WebSocket端点的URL路径上添加安全约束,或者自定义WebSocket消息处理器,对每个消息进行安全检查。 5. **客户端集成**:在HTML页面中,...

    springmvc demo

    这些配置文件定义了DispatcherServlet的初始化参数、HandlerMapping和HandlerAdapter的设置、视图解析器以及其它自定义的拦截器和监听器。 在"springmvc demo"项目中,我们可以期待找到以下内容: - `web.xml`:...

    cas client springmvc(springmvc cas maven sso 详解 )

    - 配置Web.xml:在Web应用的配置文件中,我们需要配置CAS过滤器链,包括`CasAuthenticationFilter`、`TicketValidationFilter`和`CasHttpServletRequestWrapperFilter`,这些过滤器负责拦截请求、验证票据并创建...

    mina+springmvc demo

    这些配置文件会定义服务端口、协议、处理器链、服务bean以及Spring MVC的相关映射和拦截器。 6. **示例代码展示**:博客可能给出了如何创建Mina的SocketAcceptor,如何定义Spring MVC的Controller,以及如何在它们...

    springMVC接口化实践

    6. **拦截器(Interceptor)**:SpringMVC的拦截器机制允许我们在请求处理前后执行自定义逻辑,例如进行权限验证、日志记录等。通过实现HandlerInterceptor接口并配置在SpringMVC配置中,可以实现全局的接口拦截处理...

    spring+springMVC+mybatis+bootstrap实现单表操作

    4. **配置SpringMVC**:配置SpringMVC的servlet-context.xml,定义视图解析器、拦截器、处理器映射器等。 5. **配置MyBatis**:创建MyBatis的配置文件(`mybatis-config.xml`),并编写Mapper接口和对应的XML映射...

Global site tag (gtag.js) - Google Analytics