Struts2如何处理XML文件上传 FileUploadInterceptor拦截器

发布时间 - 2026-02-01 00:00:00    点击率:
能用,但必须明确配置——FileUploadInterceptor不区分文件类型,只解析multipart/form-data并注入File对象;XML上传失败主因是拦截器未生效、maximumSize过小、enctype未设为multipart/form-data或属性名不匹配。

Struts2上传XML文件时,FileUploadInterceptor默认能用吗?

能用,但必须明确配置——FileUploadInterceptor本身不区分文件类型,它只负责解析multipart/form-data请求体、提取File对象并注入到Action属性中。XML只是普通二进制文件,只要HTTP请求格式正确、服务端允许该MIME类型(如text/xmlapplication/xml),它就能上传成功。

为什么上传XML后Action里File属性为null

常见原因不是文件类型限制,而是拦截器未生效或配置错位。Struts2的文件上传依赖完整拦截器链,缺一不可:

  • fileUpload拦截器必须显式加入拦截器栈(不能只靠defaultStack默认启用——它虽含fileUpload,但可能被后续配置覆盖)
  • maximumSize参数太小(XML虽文本,但带DTD或大量命名空间时体积可能超默认10MB)
  • 表单enctype没设成multipart/form-data,或提交方式不是POST
  • Action中文件属性名、ContentType属性名、FileName属性名三者必须严格匹配(如字段叫uploadFile,则必须有uploadFileuploadFileContentTypeuploadFileFileName三个属性)

如何安全

接收并解析上传的XML文件?

拦截器只负责“传进来”,解析XML是Action自己的事。关键点在于避免XXE攻击(尤其当XML含外部实体引用时):

  • 禁用外部实体:用DocumentBuilderFactory时必须显式关闭setExpandEntityReferences(false)setFeature("http://apache.org/xml/features/disallow-doctype-decl", true)
  • 不要用new SAXBuilder().build(file)这类默认宽松解析器(JDOM 1.x默认开启XXE)
  • 推荐用javax.xml.parsers.DocumentBuilder配合白名单特征配置,或直接用XmlInputFactory(StAX)流式解析
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
dbf.setFeature("http://xml.org/sax/features/external-general-entities", false);
dbf.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(uploadFile); // uploadFile是FileUploadInterceptor注入的File对象

上传大XML文件时性能与内存怎么控?

FileUploadInterceptor会把整个文件先写入临时磁盘(javax.servlet.context.tempdir),再交给Action。但如果你在Action里用DocumentBuilder.parse(File),DOM会全量加载进内存——100MB XML可能吃掉1GB堆空间。

  • 改用SAX或StAX逐事件解析,不构建完整树结构
  • 检查struts.multipart.maxSize是否远大于实际需要(比如设为50MB却只传2MB XML,浪费磁盘空间)
  • 临时文件不会自动清理,需在Action执行完后手动uploadFile.delete()(注意判空和异常)
  • 若需校验XML Schema,用SAXParserSchemaFactory,别用DocumentBuilder加载后再校验

真正容易被忽略的是:FileUploadInterceptor对XML无特殊逻辑,但开发者常误以为它会自动校验格式或编码——它不会。XML语法错误、编码不匹配(如声明UTF-8但实际是GBK)、BOM头残留,都会导致后续解析失败,而这些错误在拦截器阶段完全不报。


# java  # apache  # 编码  # app  #   # win  # 为什么  # struts  # servlet  # NULL  # 命名空间  # xml  #   # delete  # 对象  # 事件  # dom  # bom  # http  # 拦截器  # 上传  # 设为  # 自己的  # 的是  # 不匹配  # 加载  # 就能  # 你在  # 这类 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 昵图网官方站入口 昵图网素材图库官网入口  iOS验证手机号的正则表达式  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Python制作简易注册登录系统  微信小程序 canvas开发实例及注意事项  奇安信“盘古石”团队突破 iOS 26.1 提权  南京网站制作费用,南京远驱官方网站?  如何正确选择百度移动适配建站域名?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何在Tomcat中配置并部署网站项目?  jQuery 常见小例汇总  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  大学网站设计制作软件有哪些,如何将网站制作成自己app?  JS中对数组元素进行增删改移的方法总结  Python文件异常处理策略_健壮性说明【指导】  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  开心动漫网站制作软件下载,十分开心动画为何停播?  佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】  如何在IIS服务器上快速部署高效网站?  手机软键盘弹出时影响布局的解决方法  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤  Laravel怎么发送邮件_Laravel Mail类SMTP配置教程  网站制作壁纸教程视频,电脑壁纸网站?  如何在服务器上配置二级域名建站?  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何生成腾讯云建站专用兑换码?  Laravel如何升级到最新版本?(升级指南和步骤)  再谈Python中的字符串与字符编码(推荐)  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  如何快速搭建个人网站并优化SEO?  JS弹性运动实现方法分析  如何在IIS管理器中快速创建并配置网站?  活动邀请函制作网站有哪些,活动邀请函文案?  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程  Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  JavaScript如何实现倒计时_时间函数如何精确控制  Internet Explorer官网直接进入 IE浏览器在线体验版网址  javascript中数组(Array)对象和字符串(String)对象的常用方法总结  如何用PHP工具快速搭建高效网站?  如何在阿里云服务器自主搭建网站?  如何在建站宝盒中设置产品搜索功能?  Laravel怎么实现验证码(Captcha)功能  Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道  Java垃圾回收器的方法和原理总结