从AJAX帖子重定向
我在Spring控制器中有一个对端点的AJAX调用。验证帖子中的信息后,我的控制器做出重定向决定,是将请求转发到下一个位置,还是将它们发送回登录页面。对post的响应是正确的,它是一个302,位置标题设置正确。但是,当页面进行重定向调用时,它会对URL进行选项调用,然后是GET调用,该调用只返回HTML。很好,我有HTML,但是页面停留在我的JSP页面上,从不转到外部URL。我如何管理这个 示例Java代码:从AJAX帖子重定向,ajax,redirect,Ajax,Redirect,我在Spring控制器中有一个对端点的AJAX调用。验证帖子中的信息后,我的控制器做出重定向决定,是将请求转发到下一个位置,还是将它们发送回登录页面。对post的响应是正确的,它是一个302,位置标题设置正确。但是,当页面进行重定向调用时,它会对URL进行选项调用,然后是GET调用,该调用只返回HTML。很好,我有HTML,但是页面停留在我的JSP页面上,从不转到外部URL。我如何管理这个 示例Java代码: @RequestMapping(value = "/token/{token_code
@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状态,位置头有我想要的URL,但它只是获取重定向URL的HTML,实际上它不会切换视图,因为您使用的是XHR,客户端代码需要读取HTTP响应并使用JavaScript处理重定向。浏览器将只对页面执行重定向,而不是XHR调用 见:
您应该尝试使用前端来重定向,而不是后端。Ajax旨在发出一个异步请求,然后可以在前端使用该请求
$.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
}
});
因此,与其在后端重定向,不如告诉它打印重定向位置,并使用前端返回的数据重定向
$.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
}
});
你的代码是什么样子的?@Rust我将从上一个问题中发布它,给我一秒钟让我试试。重定向是否包含位置URL?当302响应传入时,它是从该头设置的吗?那么在我的控制器上,我是否会将返回更改为字符串并在那里读取它?我还在重定向域中设置cookie,这些cookie会保留在这个重定向操作中吗?@user3334871否,包含ajax。您可以将cookie和位置打印为JSON对象字符串,然后使用Javascript设置cookie并执行重定向。因此,为了确保我正确理解它,在Spring控制器中,我在servletResponse中设置了cookie,但这不会在AJAX重定向调用中继续进行,我必须像重定向URL一样在JSON对象中返回它,并在回调函数中设置它?@user3334871是的,你明白了吗