前言
昨天下午的時候同學問我了個問題,是關于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的寫法
- 在pom檔案中添加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(新的地址)
- 獲得物件的方式
//獲得轉發物件getRequestDispatcher()
HttpServletRequest(httpServletRequest).getRequestDispatcher();
ServletContext.getRequestDispatcher();
//獲得重定向物件sendRedirect()
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嵌套的

碼字不易,感謝三連

寫在最后
本人是即將大三的廢物蒟蒻一個,若有問題歡迎指正與討論,感謝三連

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/291852.html
標籤:java
