Java RFC3986-哪些PCHAR需要进行百分比编码?
我需要为URI生成一个Java RFC3986-哪些PCHAR需要进行百分比编码?,java,language-agnostic,rfc,rfc3986,Java,Language Agnostic,Rfc,Rfc3986,我需要为URI生成一个href。除了需要百分比编码的保留字符(例如链接到/some/path);元素应显示为。正如我所读到的,当字符处于无保留(ALPHA/DIGIT/“-“/”/“\u”/“~”类下时,应该会发生这种情况。到现在为止,一直都还不错。但反过来呢?RFC只提到百分比(%)总是需要编码。但是其他的呢 问题:假设所有未保留的内容都可以/应该进行百分比编码是否正确?例如,开头的括号(不一定需要编码,但分号;需要编码。如果我不编码它,我会首先查找/当下面的-我尝试了编码路径(字符串,字符串
href
。除了需要百分比编码的保留字符(例如链接到/some/path);元素
应显示为。正如我所读到的,当字符处于无保留(ALPHA/DIGIT/“-“/”/“\u”/“~”
类下时,应该会发生这种情况。到现在为止,一直都还不错。但反过来呢?RFC只提到百分比(%
)总是需要编码。但是其他的呢
问题:假设所有未保留的内容都可以/应该进行百分比编码是否正确?例如,开头的括号(
不一定需要编码,但分号;
需要编码。如果我不编码它,我会首先查找/当下面的-我尝试了编码路径(字符串,字符串)
和编码路径段(字符串,字符串)
[*]/first
是当单击
编辑:我可能需要提到,这种行为是在Tomcat下观察到的,我已经检查了Tomcat 6和7的行为方式相同。对于绝对路径部分:
path-absolute = "/" [ segment-nz *( "/" segment ) ]
segment = *pchar
segment-nz = 1*pchar
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded = "%" HEXDIG HEXDIG
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
reserved = gen-delims / sub-delims
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
pchar
包含子delims,因此您不必在路径部分对这些子delims进行编码::@-.~!$&'()*+,;=
我写了一篇文章,其中包括一个用于路径的编码器——就像往常一样,注意清空
假设所有未保留的内容都可以/应该进行百分比编码,这是否正确
第RFC 3986号文件中说:
在正常情况下,URI中的八位字节进行百分比编码的唯一时间是在从其组成部分生成URI的过程中。这是在实现确定哪些保留字符将用作子组件分隔符,哪些可以安全地用作数据时
这意味着您需要根据上下文决定哪些分隔符(即
字符)需要编码。不需要编码的不应该编码
例如,如果/
出现在路径组件中,则不应对其进行百分比编码,而应在其出现在查询或片段中时对其进行百分比编码
因此,事实上,;
字符(它是
的成员)不应该自动进行百分比编码。事实上,java URL和URI类不会这样做;请参阅,特别是步骤7)了解
组件的处理方式
这一段加强了这一点:
"保留字符的目的是提供一组可与URI中的其他数据区分的定界字符。在用相应的百分比编码八位字节替换保留字符方面有所不同的URI是不等效的。百分比编码保留字符,或解码对应的百分比编码八位字节nds转换为保留字符将改变大多数应用程序对URI的解释方式。因此,保留集中的字符不受规范化的保护,因此,特定于方案和特定于生产者的算法可以安全地使用这些字符来分隔URI中的数据子组件。”
因此,这意味着包含百分比编码的;
的URL与包含原始;
的URL不同。最后一句话意味着它们不应自动进行百分比编码或解码
这就给我们留下了一个问题-为什么要对;
进行百分比编码
假设您有一个CMS,人们可以在其中创建具有任意路径的任意页面。稍后,我需要生成指向所有页面的href链接,例如,站点地图组件。因此,我需要一个算法来知道要转义哪些字符。在这种情况下,分号必须按字面处理,并且应该转义
对不起,分号不应该转义
就URL/URI规范而言,;
没有特殊意义。它可能对特定的web服务器/网站有特殊意义,但一般来说,您无法知道这一点
- 如果
;
在特定URI中确实具有特殊含义,那么如果您对其进行百分比转义,则会破坏该含义。例如,如果站点使用;
允许将会话令牌附加到路径,则百分比编码将阻止其识别会话令牌
- 如果
;
只是某个客户端提供的数据字符,那么如果对其进行百分比编码,则可能会更改URI的含义。这是否重要取决于服务器的功能,即是否作为应用程序逻辑的一部分进行解码
这意味着知道“要做的正确事情”"需要深入了解URI对最终用户和/或网站的意义。这需要先进的读心技术来实现。我的建议是让CMS在将URI路径传送到您的软件之前,通过适当地转义URI路径中的任何分隔符来解决此问题。算法是必要的ily将针对CMS和内容交付平台。它/它们将响应URL标识的文档请求,并需要知道如何解释它们
(支持使用任意路径的任意人有点疯狂。必须有一些限制。例如,即使Windows也不允许在文件名组件中使用文件分隔符。因此,您必须在某个地方有一些边界。这只是决定它们应该在哪里的问题。)Mhm,你是说;
不需要百分比编码吗?我在t中也这么认为