调用客户端重定向后,会话属性丢失
以前,servlet使用response.sendRedirect("pages/my_page.jsp?foo=bar");
没有问题。会话属性可以在随后重定向到的页面中检索。
目前,我正在更改发送请求的方式。最初,JavaScript使用myForm.submit();
,但现在我将其更改为jQuery.ajax("my_page.jsp?foo=bar",
{...});。然后,该servlet在JSON响应中包含一个URL而不是response.sendRedirect()
,并且在success
函数中,我用于window.location.replace(url);
导航到新页面。但是,无法在后续页面中获取已保存的会话属性。
我已经通过<%= session.getId() %>
在JSP页面中插入来比较了会话ID
。他们是一样的。这里的问题是重定向到页面中的session.getAttribute("myAttribute_1")
返回null
。
我不确定这是否重要,但实际上我正在使用1个以上的JSP页面来完成此任务:
A.jsp --- (redirect) ---> B.jsp --- (redirect) ---> C.jsp
在这种情况下,如何获取保存的会话属性C.jsp
?
回答:
以下是我用于保存会话属性的代码段。
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();
我需要自定义要发送的数据。
仅通过应用这些简单的更改,一切便会再次起作用。
不过,我仍在寻找这种奇怪行为的解释。
回答:
在服务器端
HTTP请求是无状态的,会话通过不同的方式位于HTTP之上
- (例如,服务器开始新的会话并将其ID返回给客户端,然后客户端将会话ID附加到所有后续请求中
http://host:port/path;session_id=12345
) - (例如,在创建会话时,服务器以cookie编码的会话ID进行响应,并且在服务器端,您希望该cookie将每个请求与现有会话相关联)。
客户有责任通过服务器期望的方式确保他们参与会话。使用Java Servlet API实现服务器时,它是
cookie或URL后面带有相同名称的查询参数,用于标识会话ID。
如果客户端不支持cookie,则必须使用Java Servlet API重定向到所创建的URL
HttpServletResponse.encodeRedirectURL(String url)
。
为了从servlet重定向,请使用HttpServletResponse.sendRedirect(String url);
。
使用标准的HTTP重定向响应服务器将简化您的设计。
确实实现了这些标准,因此将遵循此处说明的来自服务器的 和 响应,因此客户端上不需要重定向逻辑。
回答:
您的客户端是 ,当后续对同一域发出请求时,其ajax实现将尊重并重播为任何给定域设置的cookie。
如果您要重定向到其他域,则要让 与 会话一起使用,请添加xhrFields
到您的请求中:
$.ajax({ url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
以上是 调用客户端重定向后,会话属性丢失 的全部内容, 来源链接: utcz.com/qa/415914.html