【问题标题】:URL not changing on page redirection in Jersey and MongoDB泽西岛和 MongoDB 中的页面重定向 URL 不变
【发布时间】:2015-04-16 12:53:49
【问题描述】:

我的场景是这样的: 我正在建立一个网站,在该网站上发布有关某个主题的广告。因此,在广告的表单填充之后,请求转到一个 REST 服务类:

http://localhost:8080/cloudproject/postadvaction?title=tution&tag=tution&description=tution+%401000+%2F+month&category=TUTOR&location=indore

这里,广告的详细信息进入数据库MongoDB。完成所有这些后,我将使用球衣的Viewable model重定向到用户的个人资料页面,在那里他可以看到他发布的所有广告。它是这样完成的: return new Viewable("/profile.jsp"); 在此之后,响应被重定向到用户的个人资料页面。

但问题是,在将响应重定向到简单的 profile.jsp 时,地址栏中的 URL 并没有更改为http://localhost:8080/profile.jsp,而是和上面提到的一样.因此,当用户刷新页面时,会触发相同广告帖子的请求,并再次跟踪整个过程。由于数据库是 MongoDB,相同的广告在其中存储了两次,并且在用户的个人资料页面上显示了相同的 2 个相同的广告。

那么,如何在地址栏中没有servlet地址的情况下重定向到个人资料页面?

更新:该问题与 PRG 技术和重复表单提交有关,而不仅仅是重定向。

【问题讨论】:

标签: java jsp redirect jersey


【解决方案1】:

Post/Redirect/Get

当通过 HTTP POST 请求将 Web 表单提交到服务器时,尝试在某些用户代理中刷新服务器响应的 Web 用户可能会导致重新提交原始 HTTP POST 请求的内容,从而可能导致不希望的结果,例如重复的网络购买。

为避免此问题,许多 Web 开发人员使用 PRG 模式 [1] — POST 操作不是直接返回网页,而是返回重定向命令。 HTTP 1.1 规范引入了 HTTP 303(“查看其他”)响应代码,以确保在这种情况下,Web 用户的浏览器可以安全地刷新服务器响应,而不会导致重新提交初始 HTTP POST 请求。但是,当今使用的大多数常见商业应用程序(新旧都一样)在这些情况下仍会继续发出 HTTP 302(“找到”)响应。

有了 Jersey 你可以使用

  • Response.seeOther(URI) - 为重定向创建一个新的 ResponseBuilder。在 POST 后重定向(又名 POST/redirect/GET)模式中使用。

您只需更改方法签名以返回Response 并返回构建的Response

return Response.seeOther(URI.create(...)).build();

还说明了URI参数

重定向 URI。如果提供了相对 URI,它将通过相对于应用程序的基本 URI 解析它转换为绝对 URI(请参阅UriInfo.getBaseUri())。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    • 2015-07-09
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 2011-08-02
    相关资源
    最近更新 更多