ajax - 从 AJAX 帖子重定向
问题描述
我在我的 Spring 控制器中有一个对我的端点的 AJAX 调用。在验证来自 POST 的信息后,我的控制器做出重定向决定,是将请求转发到下一个位置,还是将它们发送回登录页面。对帖子的响应是正确的,它是一个 302,Location
标题设置正确。但是,当页面进行重定向调用时,它会对 URL 进行 OPTIONS 调用,然后是 GET 调用,它只返回 HTML。太好了,我有 HTML,但是该页面保留在我的 JSP 页面上,并且永远不会转到外部 URL。我该如何管理?
示例 Java 代码:
@RequestMapping(value = "/token/{token_code}", method = {RequestMethod.GET})
public void validateToken(HttpServletRequest servletRequest, HttpServletResponse servletResponse, @PathVariable String token_code) {
//set some servlet request attributes from incoming packet info
if(isTokenValid(token_code)) {
servletRequest.getRequestDispatcher(MyConstants.JSP_DEVICE_INFO).forward(servletRequest, servletResponse);
}
else {
servletRequest.getRequestDispatcher(MyConstants.FAILURE_URL).forward(servletRequest, servletResponse);
}
}
@RequestMapping(value = "/token/tokenRedirect", method = {RequestMethod.POST},headers = "content-type=application/json",consumes = {MediaType.APPLICATION_JSON_VALUE})
public ModelAndView getSession(HttpServletRequest servletRequest,
HttpServletResponse servletResponse,
@RequestBody TokenValidateRequest request)
{
boolean isValid = verifyCollectedInfo(request);
if(isValid) {
servletResponse.setHeader("Location", request.url());
servletResponse.setStatus(302);
}
else {
servletResponse.setHeader("Location", MyConstants.FAILURE_URL);
servletResponse.setStatus(302);
}
}
JSP Ajax 调用:
$.ajax({
headers: {
'accept': 'application/json',
'content-type': 'application/json'
},
type: "POST",
url: "tokenRedirect",
context:document.body,
contentType:"application/json",
data:JSON.stringify(TokenValidateObject)
});
因此,当我检查我的网络流量时,我看到为响应设置了 302 状态,并且 Location 标头具有我想要的 URL,但它只是获取重定向 URL 的 HTML,它实际上并没有切换视图
解决方案
您应该尝试使用前端而不是后端来重定向。Ajax 旨在发出异步请求,然后可以在前端使用。
因此,与其在后端重定向,不如告诉它print
重定向位置并使用前端返回的数据进行重定向。
$.ajax({
headers: {
'accept': 'application/json',
'content-type': 'application/json'
},
type: "POST",
url: "tokenRedirect",
context:document.body,
contentType:"application/json",
data:JSON.stringify(TokenValidateObject)
success: function(locationToRedirect){
window.location = locationToRedirect
}
});
推荐阅读
- r - R条形图重命名x轴刻度
- python-3.x - Psycopg2 无法将 numpy nans 写入 postgresql 表:双精度类型的输入语法无效:“”
- javascript - 当 ref 随 vue 组合 api 发生变化时,如何触发 graphql 查询?
- scikit-learn - plot_precision_recall_curve() 函数绘制的平均精度是多少?
- java - SSL 握手失败 - 无法找到请求目标的有效证书路径
- c# - 从 asp.net 中的存储库访问异步任务时没有任何反应?
- android - 如果没有 maxSDKVersion,我的应用会在 Playstore 控制台中显示 API 级别 17-19
- python - 将数字文本文件读入不带单引号 Python 的列表
- javascript - 将点击事件附加到ckeditor中的元素
- python - / __init__() 处的 TypeError 采用 1 个位置参数,但给出了 2 个