gpt4 book ai didi

javascript - 调用客户端重定向后 session 属性丢失

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:31 25 4
gpt4 key购买 nike

以前,servlet 使用 response.sendRedirect("pages/my_page.jsp?foo=bar");没有问题。可以在重定向到的后续页面中检索 session 属性。

目前,我正在改变发送请求的方式。最初,Javascript 使用 myForm.submit(); , 但我现在将其更改为 jQuery.ajax("my_page.jsp?foo=bar", {...}); .然后,servlet 在 JSON 响应中包含一个 URL,而不是 response.sendRedirect() ,并在 success函数,我使用 window.location.replace(url);导航到新页面。但是,保存的 session 属性无法在后续页面中获取。

我通过插入 <%= session.getId() %> 比较了 session ID在我的 JSP 页面中。他们是一样的。这里的问题是 session.getAttribute("myAttribute_1")返回 null在重定向到的页面中。

我不确定这是否重要,但实际上我正在使用超过 1 个 JSP 页面执行此任务:

A.jsp --- (redirect) ---> B.jsp --- (redirect) ---> C.jsp

在这种情况下,如何获取 C.jsp 中保存的 session 属性? ?


编辑

下面是我用来保存 session 属性的代码片段。

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(true);

response.setContentType("application/json");

CustomObject customObject = new CustomObject();
// ...
session.setAttribute("myAttribute_1", customObject);

PrintWriter writer = response.getWriter();
JsonObject json = new JsonObject();
Gson gson = new GsonBuilder().setPrettyPrinting().create();

json.addProperty("url", "next_page.jsp?foo=bar");
writer.println(gson.toJson(json));
writer.close();
}

下面是重定向的代码片段。

function redirectHandler(data, currentUrl) {
if (data && data.hasOwnProperty('url')) {
var redirectUrl = data.url;
jQuery.get(redirectUrl).done(function(response) {
redirectHandler(response, redirectUrl);
});
} else {
window.location.replace(currentUrl);
}
}

function sendFormData(method, url, form) {
jQuery.ajax(url, {
'method': method,
'data': parseData(jQuery(form).serializeArray()),
'success': function(data) {
redirectHandler(data, window.location.href);
}
});
}

结果

我已经恢复使用 response.sendRedirect("pages/my_page.jsp?foo=bar")在我的 servlet 中。

在客户端,jQuery.ajax()被删除,函数 sendFormData()现更新如下。

function sendFormData(form) {
var data = parseData(jQuery(form).serializeArray());
var f = document.createElement('form');

for (var key in data) {
jQuery('<input>').attr({
'type': 'hidden',
'name': key,
'value': data[key]
}).appendTo(f);
}

f.setAttribute('method', form.getAttribute('method'));
f.setAttribute('action', form.getAttribute('action'));
f.submit();
}

每当我想提交表单时,click附加了事件处理程序。它会调用 sendFormData(myOriginalForm);而不是 myOriginalForm.submit();因为我需要自定义要发送的数据。

只有应用这些简单的更改,一切才能恢复正常。

不过,我仍在寻找对这种奇怪行为的解释。

最佳答案

您是否尝试过不同形式的 Javascript 重定向?

推荐的方法是:

window.location.href=currentUrl;

根据这个article , 使用 window.location.replace 将替换当前 session 。

关于javascript - 调用客户端重定向后 session 属性丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33075956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com