前言
昨天下午的时候同学问我了个问题,是关于spring boot里面页面跳转的问题,整理了一下有关的内容,写个博客记录一下。 涉及到的问题,我一共整理了三个方面
一、SpringBoot跳转页面+thymeleaf
关于SpringBoot的页面跳转问题,跳转页面一般分为静态页面和动态页面
1. 静态页面 静态页面是可以直接访问的,在static目录下新建一个hello.html就可以在浏览器直接访问http://localhost:8080/hello.html,也可以通过controller层跳转访问。
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() { return "hello.html"; }
}
然后正常访问http://localhost:8080/hello成功访问
2. 动态页面 动态页面的访问需要先请求服务器,访问后台的应用程序,然后再转向访问页面。 spring boot默认使用thymeleaf做动态页面,建议不要使用jsp,下面是spring boot整合thymeleaf的写法
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
- 在tempates目录下新建hello.html文件,此时若直接访问http://localhost:8080/hello.html访问的是静态文件夹(static目录)下的hello.html,再通过controller层跳转访问static会报500错误,这是因为:
- 静态页面的return默认是跳转到static目录下的
- 当引入thymeleaf之后,动态跳转会覆盖默认的静态跳转
- 动态跳转默认跳转到templates目录下
- 两者return代码区别:动态跳转有无.html后缀都可
使用thymeleaf之后的controller层
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() { return "hello"; }
}
若在使用动态页面时还想跳转到/static/index.html,使用重定向return “redirect:/index.html”
转发和重定向的区别及应用场景
上节提到了重定向,就去回头看了看JavaWeb,总结一下页面跳转的两种方式即转发和重定向的区别及其应用场景
1. 区别
- 概念
- 什么是转发:由服务器端进行的页面跳转
- 什么是重定向:由浏览器端进行的页面跳转
- 特点
- 转发
- 地址栏:显示的是上一个页面的地址
- 请求次数:1次请求
- 请求域中数据不会丢失
- 重定向
- 地址栏:显示新的地址
- 请求次数:2次请求
- 请求域中的数据会丢失,因为是2次请求
- 方法
- 转发:request.getRequestDispatcher().forward()方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为
- 重定向:HttpServletResponse.sendRedirect()方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器重新发出对另外一个URL的访问请求
- 过程理解
- 转发的过程可以理解为有个叫浏览器的人发微信给A借钱,A的钱不够,于是A就去找B借钱,然后一并转账给浏览器,所以浏览器是一次请求,浏览器也不知道有一些钱是出自B
- 重定向的过程可以理解为有个叫浏览器的人发微信给A借钱,A回复说没有钱,让浏览器去找B借,并把B的微信号给了浏览器,于是浏览器就加微信找到了B借钱,B收到后就转账给了浏览器,所以浏览器是两次请求,浏览器也知道转账的是B(新的地址)
- 获得对象的方式
HttpServletRequest(httpServletRequest).getRequestDispatcher();
ServletContext.getRequestDispatcher();
HttpServletResponse(httpServletResponse).sendRedirect();
2. 应用场景
转发与重定向如何选择:
- 重定向的速度比转发慢,若在使用转发和重定向都一样的情况下建议使用转发
- 转发只能访问当前web的应用程序,不同web应用程序之间的访问,特别是要访问到另外一个web站点上的资源的情况下,就只能使用重定向
重定向还有一个应用场景就是避免在用户重新加载页面时两次调用相同的动作,选择哪种跳转方式还是要具体考虑需求。
三、不同域名通过iframe嵌套显示提示拒绝连接
这篇博客的最后一个问题,昨天看同学项目的时候他遇到个问题,问我为什么我用thymeleaf跳转了,也用sendRedirect()方法重定向了,url怎么还是跳不过去呢? 查了一遍代码发现,跳转的页面使用了iframe嵌套 响应头配置:X-Frame-Options
The X-Frame-Options HTTP 响应头是用来给浏览器 指示允许一个页面 可否在 , , 或者 中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从而避免 clickjacking 攻击。
X-Frame-Options有三个值:
- deny:表示该页面不允许在 frame 中展示,即便是在相同域名的页面中嵌套也不允许
- sameorigin:表示该页面可以在相同域名页面的 frame 中展示
- allow-from url:表示该页面可以在指定来源的 frame 中展示
昨天测试跳转的url是www.baidu.com,是禁止用iframe嵌套的 码字不易,感谢三连
写在最后
本人是即将大三的废物蒟蒻一个,若有问题欢迎指正与讨论,感谢三连
|