Java 如何在不编码哈希的情况下使用URIbuilder构建URI

Java 如何在不编码哈希的情况下使用URIbuilder构建URI,java,rest,jax-rs,uribuilder,Java,Rest,Jax Rs,Uribuilder,我有这样一个URI: java.net.URI location=UriBuilder.fromPath(“../#/Login”).queryParam(“token”,token.build() 我将其作为响应发送:返回响应。请参见其他(位置)。build() 但是,在上面的URI中,#被编码为%23/。如何创建URI而不对哈希进行编码#。根据,必须使用fragment()方法来保持未编码状态 URI模板在URI的大多数组件中都是允许的,但它们的值 仅限于特定组件。例如 UriBuilder

我有这样一个URI:

java.net.URI location=UriBuilder.fromPath(“../#/Login”).queryParam(“token”,token.build()

我将其作为响应发送:
返回响应。请参见其他(位置)。build()

但是,在上面的URI中,
#
被编码为
%23/
。如何创建URI而不对哈希进行编码
#
。根据,必须使用
fragment()
方法来保持未编码状态

URI模板在URI的大多数组件中都是允许的,但它们的值 仅限于特定组件。例如

UriBuilder.fromPath(“{arg1}”).build(“foo#bar”);会导致 对“#”进行编码,使生成的URI为“foo%23bar”。到 创建URI“foo#bar”使用 UriBuilder.fromPath(“{arg1}”).fragment(“{arg2}”).build(“foo”,“bar”)代替

看看文档中的示例,我不确定如何将其应用到我的案例中

最终URI应如下所示:


http://localhost:7070/RTH_Sample14/#Login?token=eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJodHRwczpcL1wvcnRoLmNvbSIsInN1YiI6IlJUSCIsInJvbGUiOiJVU0VSIiwiZXhwIjoxNDU2Mzk4MTk1LCJlbWFpbCI6Imtpcml0aS5rOTk5QGdtYWlsLmNvbSJ9.H3d-8sy1N-VwP5VvFl1q3nhltA-htPI4ilKXuuLhprxMfIx2AmZZqfVRUPR\u tTovDEbD8Gd1alIXQBA-QXPBCXR9VHLSGMTIWUABYRTHZLU51NZUHB7-jXQUVIcL3OLu9GcSSR2ORQ9JTHWV2YO7ERFPMHMXZDERTGTP348

使用片段构建URI

UriBuilder.fromPath("http://localhost:7070/RTH_Sample14/").fragment("Login").build()
这将导致URI字符串

http://localhost:7070/RTH_Sample14/#Login

但是如果您还添加了查询参数

UriBuilder.fromPath("http://localhost:7070/RTH_Sample14/").fragment("Login")
          .queryParam("token", "t").build()
然后,
UriBuilder
总是在片段之前插入查询参数:

http://localhost:7070/RTH_Sample14/?token=t#Login

它只是符合URL语法。

而不是在不编码哈希值的情况下重定向的所有麻烦。我将代码更改为以下内容:

java.net.URI location = new java.net.URI("../#/Login?token=" + token);
因此,上面的查询参数是附加到URI位置的标记。在前端,我使用angular的
location.search().token
获取查询参数


这对我有用。不过我在寻找更好的答案。谢谢

为什么要在片段后添加查询参数?这并不意味着sense@wero嗯,听起来不错,但是如何发送查询参数呢?@wero将最后的URI添加到了Question中,我用另一种方式修复了它。你认为什么是最好的方法?检查下面我的答案,感谢您花时间回答我的问题,我们如何在查询参数之前获取片段?greperor-HTTP规范声明服务器将忽略#字符后面的任何内容,因此如果在#之后添加参数,它们将仅在客户端可见(即在浏览器/javascript/etc中)。浏览器甚至可以选择在#之后不发送部件。UriBuilder有助于编码和添加路径参数。如果您不需要这种方法(如您的示例中所示,因为您知道令牌不需要编码),那么这种方法很好。虽然从严格意义上讲,它并没有回答你最初的问题,但我认为它确实回答了。我相信您有一个Angular应用程序,它的末尾有一个/#/URL,您希望它获取json web令牌的查询参数。我也有类似的问题。这很有效。@kiran.gilvaz很高兴它能帮助我了解我将如何为安卓系统做到这一点?