最近个人开发一个小的OA项目,属于复习阶段.使用的技术主要是spring mvc作为前端框架,mybatis作为数据库持久化技术.前台使用jquery和一些jquery的插件.
在开发到中间阶段时候发现自己好像忽略了一个小问题,整个项目一直在firefox下测试,没有在IE下测试,不确定是否会出现兼容问题.由于jquery的天生兼容性良好,我就没有过多的关注.在项目接近收尾阶段,我开启了IE测试,不过这次发现确实存在了兼容性问题,而且问题非常严重.
由于为了简便,我在提交表单的操作上采用jquery.form.js,这个组件.它提供了ajaxSubmit这个方法,能够进行异步表单提交,并在提交成功后,执行success函数.我的系统在一个表单页面既有普通的内容,也有file标签,进行文件上传的控制.springmvc的controller中需要写一段这样的代码:[code="java"]MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;[/code]这是为了将普通的httprequest转换为spring的request,进而获取文件流等信息.在ajaxSubmit这种提交请求下,firefox下面测试完全正常,能够顺利上传,执行回调函数;但是如果在IE浏览器下面操作,这个位置会进行ClassCast类转换异常,同样也不会执行回调函数.而且,一些表单如果设置为[code="java"]enctype="multipart/form-data"[/code]这个属性,success回调函数也同样不能执行,而且在spring mvc的controller中,会将会穿页面的json字符串解析为要跳转的页面,不回传给ajax请求.也就说明ajax请求,在IE浏览器下,是不能进行文件上传操作的. 参数传递过程中,在IE浏览器下也会发生乱码,而且火狐下还是正常.
根据debug日志分析,是IE下的请求头和firefox下的请求头发生了重大的区别.firefox是application/json,IE的比较长,application/x-Microsoft-....这就导致了,一系列的问题发生. 看来还是浏览器的不兼容导致,而且短时间内也没什么好办法去重构这个问题,只能采用分而治之的情况了,如果不需要上传的页面,还可以继续使用,但是enctype="multipart/form-data"这个属性必须去掉,不然会出现乱码和ajax回调函数不执行的情况.如果确定需要上传的页面,最好还是普通的表单提交,否则不兼容的话,实在没办法.
除了要喷微软对于浏览器的兼容性没有计划之外,这个问题也给我们敲响了一个警钟,测试要尽早做,不要最后做,否则风险很大,而且出现问题无法规避.
来源:oschina
链接:https://my.oschina.net/u/585275/blog/156837