【问题标题】:Send redirect from a JAX-RS service从 JAX-RS 服务发送重定向
【发布时间】:2012-03-15 04:20:59
【问题描述】:

是否可以让 JAX-RS Web 服务重定向到另一个网页?

就像使用 Servlet response.sendRedirect("http://test/test.html") 一样。

JAX-RS Web 服务本身应该重定向。如果相关,我正在使用 RESTEasy。

【问题讨论】:

  • 问题不清楚,你的意思是rest响应应该自己重定向,还是应该返回一个调用者可以用作目标url的url?
  • 你能详细说明你的问题吗?不清楚……
  • @BenParsons - REST Web 服务本身应该重定向。
  • 这是一个完整的例子:stackoverflow.com/a/13265693/712526

标签: java redirect jax-rs


【解决方案1】:

对于像我这样正在寻找属于此答案的 302 的人。

通过查看代码

Response.temporaryRedirect(URI)

您可以像这样自定义响应代码:

Response.status(int).location(URI).build()

注意状态码是在枚举中定义的

Response.Status

例如 302 是Response.Status.FOUND

【讨论】:

    【解决方案2】:

    扩展上面的 smcg@ 答案,

    您可以通过使用ContainerRequestContext.setRequestUri(URI) 更改ContainerRequestFilter 中的请求上下文来实现此目的。如果您看到 JAX-RS 规范(第 6.2 节)here,就会提到 @PreMatching 请求过滤器。根据文档;

    使用 @PreMatching 注释的 ContainerRequestFilter 被执行 在匹配资源方法之前接收客户端请求。因此,这种类型的过滤器具有能力 修改匹配算法的输入(参见第 3.7.2 节),从而改变其结果。

    一个非常幼稚的过滤器可以是这样的;

    @PreMatching
    class RedirectFilter: ContainerRequestFilter {
        override fun filter(requestContext: ContainerRequestContext?) {
    
          requestContext!!.setRequestUri(URI.create("<redirect_uri>"))
        }
    }
    

    【讨论】:

      【解决方案3】:

      是的,如果您的返回类型是 Response(或 HttpServletResponse),您可以在 Jersey 或任何 JAX-RS 实现(包括 RestEasy)中执行此操作 https://eclipse-ee4j.github.io/jersey.github.io/apidocs/1.19.1/jersey/javax/ws/rs/core/Response.html

      您可以使用以下任一方法:

      Response.temporaryRedirect(URI)
      

      Response.seeOther(URI)
      

      “临时重定向”返回 307 状态码,而“查看其他”返回 303。

      【讨论】:

      • 那么它的完成方式相同,因为它们都使用 javax.ws.rs.core.Response。
      • 此链接已损坏
      • 如果我想返回一个永久重定向 (301) 怎么办?我应该使用temporaryRedirect 还是seeOther 或其他方法?
      • 那么 302 呢?
      猜你喜欢
      • 2011-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多