加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – RFC3986 – 哪些pchars需要百分比编码?

发布时间:2020-12-14 16:24:06 所属栏目:Java 来源:网络整理
导读:我需要生成一个href到一个URI.当涉及到需要百分比编码的保留字符时链接到/ some / path;元素应该显示为 a href =“/ some / path; element” (我知道该路径;元素代表单个实体). 最初我正在寻找一个这样做的Java库,但我最终自己写了一些东西(看下面的Java是什
我需要生成一个href到一个URI.当涉及到需要百分比编码的保留字符时链接到/ some / path;元素应该显示为< a href =“/ some / path; element”> (我知道该路径;元素代表单个实体).

最初我正在寻找一个这样做的Java库,但我最终自己写了一些东西(看下面的Java是什么失败,因为这个问题不是Java特定的).

所以RFC 3986 does suggest when NOT to encode.这个应该是在我读的时候发生的,当字符处于未保留(ALPHA / DIGIT /“ – ”/“”/“_”/“?”)类的时候.到现在为止还挺好.但是相反的情况呢? RFC仅提到百分比(%)总是需要编码.但其他人呢?

问题:假设一切不是未保留的,可以/应该是百分比编码是正确的吗?例如,打开括号(不一定需要编码但分号;如果我不编码,我最后在之后找到/第一个* ;一个href =“/ first(second”>我总是最终寻找/第一个(第二个,如预期的那样),令我困惑的是,两者(和;在RFC相同的sub-delims类中)我想象,编码所有非未保留的是一个安全的赌注,但SEOability,用户友好性在涉及本地化的URI?

现在,Java库失败了.我试过这样做
new java.net.URI(“http”,“site”,“/ pa; th”,null).toASCIISTring()
但这给了http:// site / pa; th这是不好的.观察到的结果类似:

> javax.ws.rs.core.UriBuilder
> Spring’s UriUtils – 我已经尝试过encodePath(String,String)和encodePathSegment(String,String)

[*] / first是当点击< a href =“/ first; second”>时,在服务器端调用HttpServletRequest.getServletPath()的结果.

编辑:我可能需要提到这个行为是在Tomcat下观察到的,我已经检查过Tomcat 6和7的行为方式相同.

解决方法

Is it correct to assume that everything that is not unreserved,can/should be percent-encoded?

RFC 3986说:

“Under normal circumstances,the only time when octets within a URI are percent-encoded is during the process of producing the URI from its component parts. This is when an implementation determines which of the reserved characters are to be used as subcomponent delimiters and which can be safely used as data. “

这意味着您决定根据上下文需要编码哪个分隔符(即< delimiter>)字符.不需要编码的那些不应该被编码.

例如,如果出现在路径组件中,则不应该对/ a进行百分号编码,但是当它出现在查询或片段中时,您应该对它进行百分比编码.

所以,其实一个;字符(它是< reserved>的成员)不应该被自动百分比编码,实际上,java URL和URI类不会这样做;请参阅URI(…) javadoc,具体是第7步),了解< path>组件被处理.

这一点得到加强:

“The purpose of reserved characters is to provide a set of delimiting characters that are distinguishable from other data within a URI. URIs that differ in the replacement of a reserved character with its corresponding percent-encoded octet are not equivalent. Percent- encoding a reserved character,or decoding a percent-encoded octet that corresponds to a reserved character,will change how the URI is interpreted by most applications. Thus,characters in the reserved set are protected from normalization and are therefore safe to be used by scheme-specific and producer-specific algorithms for delimiting data subcomponents within a URI.”

所以这说明一个包含百分比编码的URL;与包含raw的URL不同.最后一句话意味着它们不应该被自动编码或解码百分之百.

这让我们有这个问题 – 你为什么要被编码百分比

Let’s say you have a CMS where people can create arbitrary pages having arbitrary paths. Later on,I need to generate href links to all pages in,for example,site map component. Therefore I need an algorithm to know which characters to escape. Semicolon has to be treated literally in this case and should be escaped.

对不起,但不符合分号应该被转义.

就URL / URI规范而言,没有什么特别的意义.它可能对特定的Web服务器/网站有特殊的含义,但一般来说(即没有网站的具体知识),您无法知道这一点.

>如果在一个特定的URI中有特殊的含义,那么如果你的百分之百逃脱它,那么你会破坏这个含义.例如,如果网站使用;以允许将会话令牌附加到路径,然后百分比编码将阻止它识别会话令牌…
>如果只是一些客户端提供的数据字符,那么如果你对它进行了编码,你可能会改变URI的含义.这是否重要取决于服务器的功能?即是否解码,作为应用逻辑的一部分.

这意味着知道“正确的事情”需要深入了解URI对最终用户和/或站点的意义.这将需要高级思维阅读技术来实施.我的建议是通过在将URI路径传递给您的软件之前适当地转义URI路径的任何分隔符来获取CMS来解决它.该算法必然是针对CMS和内容传送平台的.它/他们将响应由URL识别的文档的请求,并且需要知道如何解释它们.

(支持任意使用任意路径的人有点疯狂,必须有一些限制,例如Windows甚至不允许在文件名组件中使用文件分隔符,所以你必须在某处有一些边界.只是一个决定他们应该在哪里的问题.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读