原创

Spring项目Contoller层问题及解决方案——重定向原理以及前后端重定向方式测试(提供测试完整项目demo)

1. 后端控制页面跳转的两种方式

后端控制页面跳转的方式有两种:转发和重定向。

转发
alt

转发:客户端和服务端 只进行一次交互,客户端请求虽然是请求了接口1,但是最终的结果确实接口二返回的,浏览器看不到请求url的变化。

转发过程:

1.客户浏览器发送http请求

2.web服务器接受此请求

3.调用内部的一个方法在容器内部完成请求处理和转发动作

4.将目标接口或网页模板发送给客户端浏览器



重定向
alt

重定向:

1.客户浏览器发送http请求

2.web服务器接受后发送302状态码响应及对应新的location给客户浏览器

3.客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址

4.服务器根据此请求寻找资源并发送给客户



### 2. 转发页面跳转

alt

如图代码所示,核心代码是:request.getRequestDispatcher("/route/indexFinal/indexFinal").forward(request,response); 转发必须是发生在同一个webl路径下。

浏览器访问接口indexOne,该接口代码在request中设置key属性并转发到indexFinal接口。

indexFinal接口的代码如下图:
alt

浏览器访问indexOne的结果图如下:
alt

结果是:浏览器url是 http://localhost:8080/jdk/route/indexOne/hello ,访问的是indexOne接口,但返回的是indexFinal接口的返回结果。

后台输出:
alt

测试结论:

1.转发过程,浏览器的url不变

2.转发前后的参数都能取到,数据不会丢失

3.参考我的github跳转测试项目,转发只能发生在同一个web下,不同的controller属于同一个web根目录,所以能相互转发。

### 3. 重定向页面跳转

在我的GitHub测试项目中,重定向页面的跳转测试成功了多种方式,如下:
- response.sendRedirect 跳转到同一个web目录下的其他接口
- response.sendRedirect 跳转到其他网站,url前面必须添加http和https
- redirect:url或者路径 跳转到其他网站或者同web目录下的其他接口。

重定向后,参数是不会保留的,因此数据会丢失

4. 两种页面跳转的区别

  • 转发使用的是getRequestDispatcher()方法;重定向使用的是sendRedirect();

  • 转发:浏览器URL的地址栏不变。重定向:浏览器URL的地址栏改变;

  • 转发是服务器行为,重定向是客户端行为;

  • 转发是浏览器只做了一次访问请求。重定向是浏览器做了至少两次的访问请求;

  • 转发2次跳转之间传输的信息不会丢失,重定向2次跳转之间传输的信息会丢失(request范围)

5. 两种跳转方式的使用场景

  • 重定向的速度比转发慢,因为浏览器还得发出一个新的请求,如果在使用转发和重定向都无所谓的时候建议使用转发。

  • 因为转发只能访问当前WEB的应用程序,所以不同WEB应用程序之间的访问,特别是要访问到另外一个WEB站点上的资源的情况,这个时候就只能使用重定向了。

  • 重定向跳转到其他接口或页面是无法 传递参数的,所有model中的数据都会丢失。

6. 解决转发跳转情况下数据丢失的问题

暂未测试成功。

完整的demo项目,请关注公众号“前沿科技bot“并发送"重定向"获取。

alt

正文到此结束
本文目录