关于Spring MVC 文件大小超过限制后浏览器无响应解决方案

最近在做一个ssm小项目,项目中有上传功能,本来是一个激情平常的功能。但当我配置好上传文件的大小后,一测试发现问题了。即使我项目中捕获到了MaxUploadSizeExceededException这个异常,但是浏览器确无响应了。测试几次之后仍然是这种问题,于是网上查了各种资料。最终发现是Tomcat的问题,因为tomcat遇到这个异常后出现了死循环。到Apache官网发现了这个bug的介绍,截图如下:



不过这个问题对于tomcat-7.0.39好像没有影响。如果项目用的是这个版本,应该不会出现这种问题。

如果不想用下面方法,文章后面提供免费tomcat-7.0.39的链接供下载

现在我们来看看如何解决这个问题:

我的做法是:

第一步:先把配置文件中maxUploadSize的值调大些,使之不会抛出异常。

第二步:然后加入一个拦截器控制上传文件的大小,抛出相同的异常。

第三步:最后再在配置文件中配置拦截器上传文件的大小即可。

第一步代码片段:

<bean id="multipartResolver"  
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
		<!-- 上传文件大小上限,单位为字节 -->
        <property name="maxUploadSize">  
            <value>104857600</value>  
        </property>  
        <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
        <property name="defaultEncoding">
        	<value>UTF-8</value>
        </property>
        <!--resolveLazily属性启用是为了推迟文件解析,以便在UploadController 中捕获文件大小异常-->  
        <property name="resolveLazily" value="true"/> 
    </bean>
第二步代码片段:

public class FileUploadInterceptor implements HandlerInterceptor {
    private long maxSize;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(request!=null && ServletFileUpload.isMultipartContent(request)) {
            ServletRequestContext ctx = new ServletRequestContext(request);
            long requestSize = ctx.contentLength();
            if (requestSize > maxSize) {
                throw new MaxUploadSizeExceededException(maxSize);
            }
        }
        return true;
    }


    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }

    public void setMaxSize(long maxSize) {
        this.maxSize = maxSize;
    }
}
第三步代码片段:

<!-- 上传文件大小拦截器 -->
    	<mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.benett.SIMS.interceptor.FileUploadInterceptor">
                <property name="maxSize" value="4194304"/>
            </bean>
        </mvc:interceptor>
这样,你再去拦截异常时MaxUploadSizeExceededException,这个异常就可以任你处置了,不会再出现浏览器无响应的情况了。
附上一张抓住这个异常处理后的页面:

tomcat下载链接:点击打开链接 http://download.youkuaiyun.com/detail/sky_100/9798087

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值