response.setStatus的原理问题

新手上路,请多包涵

springMvc 处理HttpRepsonse时 同时设置response.setStatus(301)response.sendRedirect("/hello");时,HTTP response Headers status is 302

调换两个的位置也是如此,所以想理解下具体的原理

相关代码

  //input
  response.sendRedirect("/hello");
  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
// output
Request URL: http://localhost:9999/account/list
Request Method: GET
Status Code: 302 
Remote Address: [::1]:9999
Referrer Policy: no-referrer-when-downgrade
HTTP/1.1 302
Location: http://localhost:9999/hello
Content-Length: 0
Date: Sun, 29 Jul 2018 17:38:31 GMT
阅读 7.1k
3 个回答

没用过springMVC ,估计这个302是sendRedirect 里面发送的吗,去看一下这个函数的源码,就知道了

你观察一下名字 sendRedirectsetStatus. send是发送, sendRedirect会直接将响应发送给用户, 所以你后续在设置响应的状态码已经没用了, 响应已经发回给客户端了.

根据问题描述,sendRedirect中的实现应该是这样的

function sendRedirect(url) {
    this.statusCode = 302;
    this.setHeader('Location', url);
}

而setStatus的实现是这样的

function setStatus(code) {
    if(!this.statusCode) {
        this.statusCode = code;
    }
}
推荐问题