重要提示:Struts版本
2.3.24
中修复了以下问题。从该版本开始,无需转义任何角色。
了解详情:JIRA Issue WW-4457。
我已经配置了Struts2 FileUpload拦截器以允许内容类型的白名单。
这适用于与指定的Content-Type匹配的任何文件,但不适用于SVG
个文件,have MIME media type image/svg+xml
。
使用此配置:
@Action(value = "upload",
interceptorRefs = @InterceptorRef(
value = "defaultStack",
params = { "fileUpload.allowedTypes" , "application/pdf,"
+ "image/jpeg,"
+ "image/gif,"
+ "image/png,"
+ "image/svg+xml"
}))
并上传有效的SVG文件,我收到struts.messages.error.content.type.not.allowed
属性定义的错误消息:
不允许使用内容类型:{0}“{1}”“{2}”{3}
其中{3}
是用户尝试上传的Content-Type;
然后例如:
不允许使用内容类型:myFile“Sample.svg”“upload__123__456__78.tmp” image / svg + xml
完全与allowedTypes
白名单中定义的内容类型相同
请注意,我使用regex
模式匹配器,在struts.xml中使用以下常量启用:
<constant name="struts.patternMatcher" value="regex" />
为什么它不起作用,以及如何使其发挥作用?
答案 0 :(得分:1)
MIME中的+
符号是罪魁祸首。
它以某种方式保留,因此需要进行转义;因为使用Convention插件它在String中,转义反斜杠也需要转义。
使用image/svg\\+xml
就像魅力一样:
params = { "fileUpload.allowedTypes" , "application/pdf,"
+ "image/jpeg,"
+ "image/gif,"
+ "image/png,"
+ "image/svg\\+xml"
我不确定基于XML的标准配置是否也需要这样做。
答案 1 :(得分:1)
fileUpload
拦截器使用PatternMatcher
来检查允许的mime类型。默认情况下,S2使用WildcardHelper
模式匹配器,它将与image/svg+xml
一起使用。
通过将默认模式匹配器更改为regex
,fileUpload
拦截器开始使用正则表达式检查允许的类型。 +
是regex中的一个特殊字符,因此必须像image/svg\\+xml
一样进行转义才能正常工作。
注意:在这种情况下更改默认模式匹配器会引入意外行为,并且可能会报告为错误。