ModelAndView不会重定向,但会给出正确的响应

时间:2017-04-14 21:47:06

标签: javascript java spring redirect modelandview

我有以下函数发出请求:

function postIngredient(action, options) {
    var xhr = new XMLHttpRequest();
    xhr.open(options.method, action, true);
    xhr.setRequestHeader('Content-Type', 'application/json; charset=UTF-8');
    xhr.setRequestHeader(options.security.header, options.security.token);

    // send the collected data as JSON
    xhr.send(JSON.stringify(options.params));

    xhr.onloadend = function () {
        // done
    };
}

该函数在服务器上触发一个基本上返回ModelAndView对象的方法:

...   
ModelAndView mav = new ModelAndView("redirect:/recipies/edit?id=1");  
....  
return mav;  

成功完成发布请求后,将完成以下GET请求: enter image description here

因此,在请求的“预览”选项卡中,我有正确的页面,它应该重定向,但浏览器中没有重定向。初始调用postIngredient()函数的页面保持不变。然后如何进行重定向?

1 个答案:

答案 0 :(得分:1)

您正在通过Javascript中的XMLHttpRequest对象发出ajax请求。此请求通过重定向来回答,XMLHttpRequest对象跟在重定向之后,调用编辑,然后将结果(编辑页面的完整页面内容)发送到xhr.onloadend()方法。浏览器窗口本身不参与其中,并且不知道内部发送了重定向。

如果您希望将帖子保留为xhr请求并且不切换到标准表单帖子,则可能会将后期处理方法更改为仅返回字符串:

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ResponseBody;

@ResponseBody
public ResponseEntity<String> myPostProcessingIngredientsMethod(..put args here...) {
  ... do something ...
  return new ResponseEntity<>("/recipies/edit?id=1", HttpStatus.OK));
}

然后在您执行xhr请求的Javascript代码中,从resultdata获取结果字符串并使用类似

的内容重定向浏览器
window.location.href = dataFromResult;

@ResponseBody注释阻止Spring将返回的String解释为视图名称,并将字符串包装在ResponseEntity中,这样就可以在出现错误时返回错误代码。