【问题标题】:302 Response for session management from ajax request来自 ajax 请求的会话管理的 302 响应
【发布时间】:2015-05-31 14:59:26
【问题描述】:

我正在尝试通过反复向 java 代码发出 ajax 请求来管理用户会话

function sendSessionKeepAliveRequest() {
  $.get('${URL}/sessionKeepAlive?nd=' + new Date().getTime());
}

和处理这个请求的java代码(使用spring框架):

   

 @RequestMapping("/sessionKeepAlive")
    public String dummySessionKeepAlive(HttpServletResponse response,
      HttpServletRequest request) {
      PrintWriter writer = null;
      try {
        writer = response.getWriter();
      } catch (IOException e) {
        logger.error(e.getMessage());
      }

      if (writer != null) {
        response.setContentType("application/json");

        // Sending an empty JSON response.
        Gson gson = new Gson();
        writer.write(gson.toJson(""));
      }
      return null;

    }

现在的问题是有时会得到 302 Found 而不是 200 OK 这使得 jsessionid 发生变化并且会话超时。我已经在 IE 和 FF 上进行了测试,并且两个浏览器的行为相同。

代码部署在 IBM websphere v7.0

请提供帮助或任何指导。如果需要更多输入或我需要修改我的问题,请随时提出。

亲切的问候

【问题讨论】:

  • 使用GSON有什么需要??
  • 它只是一个谷歌库,用于将 java 代码转换为 json 和其他方式。在 json 中发送空响应。
  • 你也可以只传递字符串而不是空的json

标签: java javascript ajax session websphere-7


【解决方案1】:

您遇到了所谓的重定向:您请求的资源的 url 已更改。新的 url 在 http 标头“Location”中提供。

您可以读出此位置并使用此 url 发出另一个请求,或者您可以设置您的响应处理代码以自动跟随重定向。

示例代码:

function sendSessionKeepAliveRequest() {
    $.ajax(
          url:          '${URL}/sessionKeepAlive?nd=' + new Date().getTime()
        , statusCode:   {
                            302: function ( jqXHR, textStatus, errorThrown ) {
                                    var url_trg = jqXHR.getResponseHeader('Location');
                                    $.get(url_trg);
                                 }
                        }
    });

更新

jquery ajax 请求应该自动处理 302 状态码,所以可能还有其他问题。会不会是跨域问题?

【讨论】:

  • 感谢您的回复,collapsar。是的,我了解 302 是重定向,但有什么方法可以避免这种重定向,因为这不会发生在我的本地环境中,并且仅在 UAT 中发生。服务器端是否存在导致此问题的特定设置?
  • 这有时会在一个小时内发生,有时会在 10-15 分钟内发生。所以这不是一个好的用户体验。上面的代码只是通过重复请求服务器来保持会话活跃。
  • http 状态码用于标记“暂时移动”的资源,因此预计只会偶尔发生。常见的用户代理静默执行重定向,而不向用户反馈,我建议您让代码模拟这种行为。
【解决方案2】:

如果目的只是激活会话,则无需使用 GSON,您可以传递空字符串并添加一个注释

@ResposeBody

这将帮助您获得 ajax 响应。

【讨论】:

  • 好的,但我不认为这是导致问题的原因。是吗?
  • 在没有任何数据或复杂数据结构的情况下使用 GSON 时我几乎没有问题。所以你可以试试这个。
猜你喜欢
  • 2013-04-16
  • 2012-04-24
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2012-03-02
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多