6

我有一个这样的URI:

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

我将其作为回复发送:return Response.seeOther(location).build()

但是,在上面的 URI 中,#被编码为%23/. 如何在不编码 hash 的情况下创建 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_tTovDEbD8Gd1alIXQBA-qxPBcxR9VHLsGmTIWUAbxbyrtHMzlU51nzuhb7-jXQUVIcL3OLu9Gcssr2oRq9jTHWV2YO7eRfPmHHmxzdERtgtp348

4

2 回答 2

8

使用片段构造 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 语法。

于 2016-02-25T12:59:01.683 回答
2

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

java.net.URI location = new java.net.URI("../#/Login?token=" + token);

所以上面的查询参数是附加到 URI 位置的令牌。在前端,我使用角度location.search().token来捕获查询参数。

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

于 2016-02-25T13:02:03.473 回答