spring mvc开发中浏览器兼容的奇怪问题

spring 2013-08-26

最近个人开发一个小的OA项目,属于复习阶段.使用的技术主要是springmvc作为前端框架,mybatis作为数据库持久化技术.前台使用jquery和一些jquery的插件.

在开发到中间阶段时候发现自己好像忽略了一个小问题,整个项目一直在firefox下测试,没有在IE下测试,不确定是否会出现兼容问题.由于jquery的天生兼容性良好,我就没有过多的关注.在项目接近收尾阶段,我开启了IE测试,不过这次发现确实存在了兼容性问题,而且问题非常严重.

    由于为了简便,我在提交表单的操作上采用jquery.form.js,这个组件.它提供了ajaxSubmit这个方法,能够进行异步表单提交,并在提交成功后,执行success函数.我的系统在一个表单页面既有普通的内容,也有file标签,进行文件上传的控制.springmvc的controller中需要写一段这样的代码:
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
这是为了将普通的httprequest转换为spring的request,进而获取文件流等信息.在ajaxSubmit这种提交请求下,firefox下面测试完全正常,能够顺利上传,执行回调函数;但是如果在IE浏览器下面操作,这个位置会进行ClassCast类转换异常,同样也不会执行回调函数.而且,一些表单如果设置为
enctype="multipart/form-data"
这个属性,success回调函数也同样不能执行,而且在spring mvc的controller中,会将会穿页面的json字符串解析为要跳转的页面,不回传给ajax请求.也就说明ajax请求,在IE浏览器下,是不能进行文件上传操作的.

参数传递过程中,在IE浏览器下也会发生乱码,而且火狐下还是正常.根据debug日志分析,是IE下的请求头和firefox下的请求头发生了重大的区别.firefox是application/json,IE的比较长,application/x-Microsoft-....这就导致了,一系列的问题发生.

看来还是浏览器的不兼容导致,而且短时间内也没什么好办法去重构这个问题,只能采用分而治之的情况了,如果不需要上传的页面,还可以继续使用,但是enctype="multipart/form-data"这个属性必须去掉,不然会出现乱码和ajax回调函数不执行的情况.如果确定需要上传的页面,最好还是普通的表单提交,否则不兼容的话,实在没办法.

除了要喷微软对于浏览器的兼容性没有计划之外,这个问题也给我们敲响了一个警钟,测试要尽早做,不要最后做,否则风险很大,而且出现问题无法规避.

相关推荐

itjavashuai / 0评论 2020-07-27