【问题标题】:Ajax : Not able to redirect to a content page inside AEM SLING servletAjax:无法重定向到 AEM SLING servlet 内的内容页面
【发布时间】:2019-09-27 22:10:44
【问题描述】:

对 servletA 的 ajax 调用。 servletA 需要重定向或转发到另一个内容页面。可能吗。? 我在 Ajax 完成功能中看到了对重定向的响应,而不是转到重定向的内容页面。可能是我错过了一些重要但不知道的东西。我试图重定向到 aem servlet 中的另一个内容页面。它在网络选项卡中返回 200 OK 响应,但从不转到指定的重定向页面。

我的同事说 Ajax 调用重定向是不可能的,因为它是单独的线程请求,是吗?如果我说回应,我是在假设。发送重定向();将发出一个新请求并在浏览器窗口中加载响应。

@Component(
    immediate = true,
    service = Servlet.class,
    property = {
        "sling.servlet.paths=/bin/test/redirect"
    })
public class TestRedirectServlet extends SlingAllMethodsServlet {

    private static final long serialVersionUID = 3591693830449607948L;

    @Override
    protected void doGet(SlingHttpServletRequest request,
                         SlingHttpServletResponse response)  {

        PrintWriter writer = null;

        try {
            writer = response.getWriter();

            //       final RequestDispatcherOptions options = new RequestDispatcherOptions();
            //       final SlingHttpServletRequest syntheticRequest = new SyntheticSlingHttpServletGetRequest(request);
            //       request.getRequestDispatcher("/content/<project-name>/en_US.html", options).forward(syntheticRequest, response);
            //       return;

            response.sendRedirect("/content/test-site/sample.html");
        } catch(Exception e) {

        } finally {
            if (writer != null) {
                writer.print("done");
                writer.flush();
                writer.close();
            }
        }
    }
}

【问题讨论】:

  • 添加您看到的 500 错误的堆栈跟踪会很有帮助。
  • 首先我会删除所有writer 代码。我认为你不应该close()作者。这可能会引起麻烦。一般来说:你创建它,你关闭它。但是您没有创建writer。你从response 得到它。所以你永远不应该close()它。
  • response.sendRedirect 是客户端的事情,如果是 AJAX,你的朋友是正确的。您可以使用window.location 发送一些 JSON 响应并处理重定向。在forward 的情况下,您是否收到任何错误或您在 AJAX 回调中获得内容 html?

标签: java servlets aem sling


【解决方案1】:

通过使用response.sendRedirect("/content/test-site/sample.html");,您实际上是在向您的 AJAX 请求发回 HTTP 301 或 302 重定向。如果这个请求是通过浏览器导航发起的,窗口会重定向,但是由于重定向是由 AJAX 发起的,响应将根本不包含成功的 HTTP 200 状态码,AJAX 会认为这是失败的这可能会触发您的 error 函数回调。

更多关于HTTP Status Codes

如前所述,您可以使用 servlet 的打印编写器返回 JSON 响应而不是重定向,并使用 JavaScript 客户端执行重定向。像 JSON 一样:

{
    "redirect": true,
    "location": "/content/test-site/sample.html"
}

您可以使用这样的 AJAX 调用:

$.ajax({
      url: "/bin/test/redirect",
      success: function(result){
          if(result.redirect){
              window.location = result.location;
          }
      },
      error: function(result){
          alert("Redirection Failure");
      }
  });

更多关于jQuery AJAX

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多