SpringMVC的请求转发与重定向

前言

今天在复习SpringMVC的时候,写下了这段代码:

    @RequestMapping("/redirect")
    public String redi(){
        return "redirect:/test.jsp";
    }

我的目的是想让它重定向到test.jsp,可是却发生了404错误。后来发现test.jsp在WEB-INF目录下,把test.jsp拖到webapp下就可以访问到了。后来仔细想想,自己居然忽视了请求转发和重定向的流程,所以特意写这个文章来从浅到深地剖析一下请求转发与重定向。

请求转发

请求转发是浏览器向服务器发送请求时,服务器内部跳转到新的URL获取到资源并在原来的页面展示给浏览器的一个过程,在这个过程中,始终使用的是同一个request。
请求转发在客户浏览器路径栏显示的是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
我们来看一下请求转发的执行流程图:
请求转发执行流程
①客户在浏览器上操作,客户端向浏览器发送了请求。
②服务器接收到了请求并在定位到了ServletA。然后执行ServletA的service方法,执行过程中service向web容器发出forward命令,表示要跳转到ServletB。
③web容器清空写入到响应体的内容,并调整请求头中的信息。web容器根据forward命令调用ServletB对象(如果是初次访问的话,会加载创建ServletB对象)。web容器调用ServletB的service方法,并将请求对象和响应对象传递给该方法。要注意的是,这里传递的请求对象和响应对象都是调用ServletA是所用的。
④执行完毕后,服务器从响应对象中读取响应信息。
⑤服务器将响应信息发送给浏览器处理和显示。
至此,一次请求转发的响应过程结束,请求对象与响应对象也就变成了垃圾,等待着垃圾回收机器的回收。

重定向

重定向是让浏览器在location中指定的URL提出请求,使得浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它 转换成一个绝对的URL。
我们来看一下重定向的执行流程图:
重定向执行流程图
①客户在浏览器上操作,客户端向浏览器发送了请求。
②服务器接收到了请求并在定位到了ServletA。然后执行ServletA的service方法,将包含了重定向信息的响应信息写入到响应对象中。
③service方法执行完毕后,服务器从响应对象中读取响应信息
④web容器把包含重定向的响应信息发送给浏览器。本次请求的请求对象与响应对象已经成为垃圾,等待着垃圾回收器的回收。
⑤浏览器根据上次返回的重定向URL发出新的HTTP请求,这个请求甚至可以指向另外一个站点,web浏览器又开始一次全新的请求响应过程。
⑥服务器接收到了请求并在定位到了ServletB。然后执行ServletB的service方法。
⑦执行完毕后,服务器从响应对象中读取响应信息。
⑧服务器将响应信息发送给浏览器处理和显示。本次请求的请求对象与响应对象已经成为垃圾,等待着垃圾回收器的回收。

对于文首的问题

看完了请求转发和重定向的执行流程,对于文首描述的问题,我相信有的人已经开始明白原因。那么我来详细解释一下:

WEB-INF是Java的WEB应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。而重定向行为是浏览器做了两次请求,相当于客户端去访问这个地址,当然会被安全机制所限制。那么同理,请求转发是服务器内部做的转发,所以请求转发操作可以访问到WEB-INF目录下的jsp文件。

SpringMVC的请求转发与重定向

没有配置视图解析器

@Controller
public class OneController {
    @RequestMapping("/forward1")
    public String forw1(){
    	//转发1
        return "/index.jsp";
    }
	@RequestMapping("/forward2")
    public String forw2(){
    	//转发2
        return "forward:/index.jsp";
    }

    @RequestMapping("/redirect")
    public String redi(){
    	//重定向
        return "redirect:/index.jsp";
    }
}

配置了视图解析器

@Controller
public class OneController {
    @RequestMapping("/forward")
    public String forw(){
    	//转发
        return "test";
    }

    @RequestMapping("/redirect")
    public String redi(){
    	//重定向
        return "redirect:/index.jsp";
    }
}

总结
可以看出,配置视图解析器给我们带来了很大的便利,我们只需要配置好,然后SpringMVC就会通过字符拼接的方式帮助我们生成完整的路径。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

九天漩女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值