【问题标题】:Redirect from an AJAX Post从 AJAX 帖子重定向
【发布时间】:2019-04-30 20:05:56
【问题描述】:

我在我的 Spring 控制器中对我的端点进行了 AJAX 调用。在验证来自 POST 的信息后,我的控制器做出重定向决定,是将请求转发到下一个位置,还是将它们发送回登录页面。对帖子的响应是正确的,它是一个 302,其中 Location 标头设置正确。但是,当页面进行重定向调用时,它会对 URL 进行 OPTIONS 调用,然后是 GET 调用,它只返回 HTML。太好了,我有 HTML,但页面保留在我的 JSP 页面上,并且永远不会转到外部 URL。我该如何管理?

示例 Java 代码:

@RequestMapping(value = "/token/{token_code}", method = {RequestMethod.GET})
public void validateToken(HttpServletRequest servletRequest, HttpServletResponse servletResponse, @PathVariable String token_code) {
  //set some servlet request attributes from incoming packet info
  if(isTokenValid(token_code)) {
       servletRequest.getRequestDispatcher(MyConstants.JSP_DEVICE_INFO).forward(servletRequest, servletResponse);
   }
  else {
     servletRequest.getRequestDispatcher(MyConstants.FAILURE_URL).forward(servletRequest, servletResponse);
  }
}

@RequestMapping(value = "/token/tokenRedirect", method = {RequestMethod.POST},headers = "content-type=application/json",consumes = {MediaType.APPLICATION_JSON_VALUE})
public ModelAndView getSession(HttpServletRequest servletRequest,
                                   HttpServletResponse servletResponse,
                                   @RequestBody TokenValidateRequest request)
{
  boolean isValid = verifyCollectedInfo(request);
  if(isValid) {
      servletResponse.setHeader("Location", request.url());
      servletResponse.setStatus(302);

  }
  else {
      servletResponse.setHeader("Location", MyConstants.FAILURE_URL);
      servletResponse.setStatus(302);
  }
}

JSP Ajax 调用:

   $.ajax({
         headers: {
             'accept': 'application/json',
             'content-type': 'application/json'
         },
         type: "POST",
         url: "tokenRedirect",
         context:document.body,
         contentType:"application/json",
         data:JSON.stringify(TokenValidateObject)

     });

所以当我检查我的网络流量时,我看到为响应设置了 302 状态,并且 Location 标头具有我想要的 URL,但它只是获取重定向 URL 的 HTML,它实际上并没有切换视图

【问题讨论】:

  • 你的代码是什么样的?
  • @Rust 我会从上一个问题中发布它,给我一秒钟

标签: ajax redirect


【解决方案1】:

您应该尝试使用前端而不是后端来重定向。 Ajax 旨在发出异步请求,然后可以在前端使用。

所以,不要在后端重定向,只需告诉它print 重定向位置并使用前端返回的数据进行重定向。

$.ajax({
     headers: {
         'accept': 'application/json',
         'content-type': 'application/json'
     },
     type: "POST",
     url: "tokenRedirect",
     context:document.body,
     contentType:"application/json",
     data:JSON.stringify(TokenValidateObject)
     success: function(locationToRedirect){
         window.location = locationToRedirect
     } 
});

【讨论】:

  • 那么在我的控制器上,我是否会将返回值更改为字符串并在那里读取它?我还在重定向域中设置 cookie,这些会保留在此重定向操作中吗?
  • @user3334871 不,包含 ajax。您可以将 cookie 和位置打印为 JSON 对象字符串,然后使用 Javascript 设置 cookie 并执行重定向
  • 所以只是为了确保我理解正确,在我的 Spring 控制器中,我在 servletResponse 中设置了 cookie,但这不会延续 AJAX 重定向调用,我必须返回它在 JSON 对象中,例如我的重定向 URL 并将其设置在回调函数中?
  • @user3334871 是的,你明白了
【解决方案2】:

因为您使用的是 XHR,所以客户端代码需要读取 HTTP 响应并使用 JavaScript 处理重定向。浏览器只会执行 PAGE 重定向,而不是 XHR 调用。

见:Redirecting after Ajax post

How to manage a redirect request after a jQuery Ajax call

Redirect on Ajax Jquery Call

【讨论】:

  • 让我试试
  • response.redirect 是否包含位置 URL?当 302 响应进来时,它是从该标头设置的吗?
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
相关资源
最近更新 更多