在Eclipse里建了一个web project:SpringMVCCase,发布到 tomcat 里以后,所有的URL都长这样:
http://localhost:8080/SpringMVCCase/xxxx/....
当前用 POST 请求
http://localhost:8080/SpringMVCCase/spitter/register
执行以下控制器方法,执行完业务逻辑后,把URL 重定向:
@RequestMapping("/spitter")
public class SpitterHandler {
@RequestMapping(value="/register", method=POST)
public String processRegistration(Spitter spitter) {
spitterRepository.save(spitter);
return "redirect:spitter/" + spitter.getUserName();
}
这样,重定向之后,浏览器中当前 URL 变成了:
http://localhost:8080/SpringMVCCase/spitter/George
这是正确的。
但是最开始的时候,我无意中在"redirect:" 后面多打了一个空格:
return "redirect: spitter/" + spitter.getUserName();
结果当前URL变成了:
http://localhost:8080/spitter/George
这简直是潜规则啊,有空格就从当前URL的hostname后起构造 URL,没有空格就从当前 URL 的相对路径开始构造。
然后我又试了试这样:
return "redirect: spitter/" + spitter.getUserName();
这次被重定向到这个 URL:
这个有点奇怪,不是把"spitter/George" 接在原来的 URL (
http://
localhost:8080/SpringMVCCase/spitter/register )之后,而是接到整个控制器的根 URL 后(不包括最后的 register)。
@RequestMapping("/spitter")
去掉空格,效果完全一样。
return "redirect:spitter/" + spitter.getUserName();
猫腻太多,坑太多。