【发布时间】:2016-01-09 15:03:03
【问题描述】:
以前,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); 导航到新页面。但是,保存的会话属性无法在后续页面中获取。
我通过在我的 JSP 页面中插入 <%= session.getId() %> 来比较会话 ID。他们是一样的。这里的问题是session.getAttribute("myAttribute_1") 在重定向到的页面中返回null。
我不确定这是否重要,但实际上我正在使用超过 1 个 JSP 页面执行此任务:
A.jsp --- (redirect) ---> B.jsp --- (redirect) ---> C.jsp
在这种情况下,如何获取C.jsp中保存的会话属性?
编辑
下面是我用来保存会话属性的代码sn-p。
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();
}
下面是重定向的代码sn-p。
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);
}
});
}
结果
我已恢复在我的 servlet 中使用 response.sendRedirect("pages/my_page.jsp?foo=bar")。
在客户端,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();,因为我需要自定义要发送的数据。
只有应用这些简单的更改,一切才能再次运行。
不过,我仍在寻找有关这种奇怪行为的解释。
【问题讨论】:
-
您能否将您实际保存属性的代码发布到会话中,属性名为 - “myAttribute_1”?
-
@Mr.VishalJGajera 你来了。
-
如果可能的话,然后将整个代码从哪里发布到你打电话的地方?我认为您犯了一些小错误,但不确定是否需要代码。
-
@Mr.VishalJGajera 代码已更新。
-
好的,代码看起来不错。还有另一个疑问,你能告诉我从哪里到哪里进入 1 线。比如,a.jsp ---> Servlet.java ---> newjsp.jsp,也可以根据你的想法检查流程是否完美,还可以根据你的意愿调试代码以检查流程。
标签: javascript java jquery jsp session