Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RFC3986-哪些PCHAR需要进行百分比编码?_Java_Language Agnostic_Rfc_Rfc3986 - Fatal编程技术网

Java RFC3986-哪些PCHAR需要进行百分比编码?

Java RFC3986-哪些PCHAR需要进行百分比编码?,java,language-agnostic,rfc,rfc3986,Java,Language Agnostic,Rfc,Rfc3986,我需要为URI生成一个href。除了需要百分比编码的保留字符(例如链接到/some/path);元素应显示为。正如我所读到的,当字符处于无保留(ALPHA/DIGIT/“-“/”/“\u”/“~”类下时,应该会发生这种情况。到现在为止,一直都还不错。但反过来呢?RFC只提到百分比(%)总是需要编码。但是其他的呢 问题:假设所有未保留的内容都可以/应该进行百分比编码是否正确?例如,开头的括号(不一定需要编码,但分号;需要编码。如果我不编码它,我会首先查找/当下面的-我尝试了编码路径(字符串,字符串

我需要为URI生成一个
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中也这么认为