整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          一起學(xué)習(xí)HTML&CSS(004)-頭部標(biāo)記head


          在上一篇文章中,小編介紹了HTML文檔的基本結(jié)構(gòu),如下圖所示:

          HTML文檔結(jié)構(gòu)

          為了驗(yàn)證或者是為了更好的掌握文檔的結(jié)構(gòu),小伙伴們可以在瀏覽器中打開(kāi)任意一個(gè)網(wǎng)頁(yè)(如:百度)查看它們的源代碼,具體操作如下:

          • 打開(kāi)瀏覽器(IE、Chrome、firefox等);

          • 輸入網(wǎng)址(如:www.baidu.com);

          • 在頁(yè)面空白處單擊鼠標(biāo)右鍵,在彈出的菜單中選擇<查看源文件>選項(xiàng)打開(kāi)源文件。

          HTML頭部標(biāo)記head

          HTML語(yǔ)言的頭部元素中包括多種信息,例如標(biāo)題、樣式表定義和腳本等。HTML的頭部元素以<head>為開(kāi)始標(biāo)記,以</head>為結(jié)束標(biāo)記。

          語(yǔ)法:

          <head>······</head>

          說(shuō)明:

          頭部標(biāo)記head的作用域?yàn)檎臋n,包括的內(nèi)容通常不會(huì)在界面上直接顯示出來(lái)。

          舉例:

          <!DOCTYPE html>

          <html>

          <head>

          這是文檔頭部

          </head>

          <body>

          這是文檔內(nèi)容

          </body>

          </html>

          者:hetu666

          來(lái)源:CSDN

          概述

          HTML(HyperText Markup Language) 不是一門編程語(yǔ)言,而是一種用來(lái)告知瀏覽器如何組織頁(yè)面的標(biāo)記語(yǔ)言。

          HTML 可復(fù)雜、可簡(jiǎn)單,一切取決于開(kāi)發(fā)者。它由一系列的元素組成,這些元素可以用來(lái)包圍不同部分的內(nèi)容,使其以某種方式呈現(xiàn)或者工作。 一對(duì)標(biāo)簽可以為一段文字或者一張圖片添加超鏈接,將文字設(shè)置為斜體,改變字號(hào),等等

          一個(gè)元素

          元素的主要部分有:

          1開(kāi)始標(biāo)簽(Opening tag):包含元素的名稱(本例為 p),被左、右角括號(hào)所包圍。表示元素從這里開(kāi)始或者開(kāi)始起作用 —— 在本例中即段落由此開(kāi)始。

          2結(jié)束標(biāo)簽(Closing tag):與開(kāi)始標(biāo)簽相似,只是其在元素名之前包含了一個(gè)斜杠。這表示著元素的結(jié)尾 —— 在本例中即段落在此結(jié)束。初學(xué)者常常會(huì)犯忘記包含結(jié)束標(biāo)簽的錯(cuò)誤,這可能會(huì)產(chǎn)生一些奇怪的結(jié)果。

          3內(nèi)容(Content):元素的內(nèi)容,本例中就是所輸入的文本本身。

          4元素(Element):開(kāi)始標(biāo)簽、結(jié)束標(biāo)簽與內(nèi)容相結(jié)合,便是一個(gè)完整的元素。

          塊級(jí)元素

          塊級(jí)元素在頁(yè)面中以塊的形式展現(xiàn) —— 相對(duì)于其前面的內(nèi)容它會(huì)出現(xiàn)在新的一行,其后的內(nèi)容也會(huì)被擠到下一行展現(xiàn)。塊級(jí)元素通常用于展示頁(yè)面上結(jié)構(gòu)化的內(nèi)容,例如段落、列表、導(dǎo)航菜單、頁(yè)腳等等。一個(gè)以block形式展現(xiàn)的塊級(jí)元素不會(huì)被嵌套進(jìn)內(nèi)聯(lián)元素中,但可以嵌套在其它塊級(jí)元素中。

          <p>第四</p><p>第五</p><p>第六</p>

          效果:

          屬性

          一個(gè)屬性必須包含如下內(nèi)容:

          1,在元素和屬性之間有個(gè)空格space (如果已經(jīng)有一個(gè)或多個(gè)屬性,就與前一個(gè)屬性之間有一個(gè)空格.)

          2屬性后面緊跟著一個(gè)“=”符號(hào).

          3,有一個(gè)屬性值,由一對(duì)引號(hào)“ ”引起來(lái).

          • href: 這個(gè)屬性聲明超鏈接的web地址,當(dāng)這個(gè)鏈接被點(diǎn)擊瀏覽器會(huì)跳轉(zhuǎn)至href聲明的web地址。例如:href="***/"。
          • title: 標(biāo)題title屬性為超鏈接聲明額外的信息,比如你將鏈接至那個(gè)頁(yè)面。例如:title="***"。當(dāng)鼠標(biāo)懸浮時(shí),將出現(xiàn)一個(gè)工具提示。
          • target: 目標(biāo)target屬性用于指定鏈接如何呈現(xiàn)出來(lái)。例如,target="_blank"將在新標(biāo)簽頁(yè)中顯示鏈接。如果你希望在目前標(biāo)簽頁(yè)顯示鏈接,只需忽略這個(gè)屬性。

          布爾

          有時(shí)你會(huì)看到?jīng)]有值的屬性,它是合法的。這些屬性被稱為布爾屬性,他們只能有跟它的屬性名一樣的屬性值。

          <!-- 使用disabled屬性來(lái)防止終端用戶輸入文本到輸入框中 -->
          <input type="text" disabled>
           
          <!-- 下面這個(gè)輸入框沒(méi)有disabled屬性,所以用戶可以向其中輸入 -->
          <input type="text">
          

          單引號(hào)或者雙引號(hào)?

          在目前為止,本章內(nèi)容所有的屬性都是由雙引號(hào)來(lái)包裹。也許在一些HTML中,你以前也見(jiàn)過(guò)單引號(hào)。這只是風(fēng)格的問(wèn)題,你可以從中選擇一個(gè)你喜歡的。以下兩種情況都可以:

          <a >示例站點(diǎn)鏈接</a>
           
          <a >示例站點(diǎn)鏈接</a>
          

          但你應(yīng)該注意單引號(hào)和雙引號(hào)不能在一個(gè)屬性值里面混用。下面的語(yǔ)法是錯(cuò)誤的:

          <a >示例站點(diǎn)鏈接</a>
          

          HTML結(jié)構(gòu)

          <!DOCTYPE html>
          <html>
           <head>
           <meta charset="utf-8">
           <title>我的測(cè)試站點(diǎn)</title>
           </head>
           <body>
           <p>這是我的頁(yè)面</p>
           </body>
          </html>
           
          

          1,<!DOCTYPE html>: 聲明文檔類型. 很久以前,早期的HTML(大約1991年2月),文檔類型聲明類似于鏈接,規(guī)定了HTML頁(yè)面必須遵從的良好規(guī)則,能自動(dòng)檢測(cè)錯(cuò)誤和其他有用的東西。使用如下:

          <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
          

          然而現(xiàn)在沒(méi)有人再這樣寫,需要保證每一個(gè)東西都正常工作已成為歷史。你只需要知道<!DOCTYPE html>是最短的有效的文檔聲明。

          2,<html></html>: <html>元素。這個(gè)元素包裹了整個(gè)完整的頁(yè)面,是一個(gè)根元素。

          3,<head></head>: <head>元素. 這個(gè)元素是一個(gè)容器,它包含了所有你想包含在HTML頁(yè)面中但不想在HTML頁(yè)面中顯示的內(nèi)容。這些內(nèi)容包括你想在搜索結(jié)果中出現(xiàn)的關(guān)鍵字和頁(yè)面描述,CSS樣式,字符集聲明等等。以后的章節(jié)能學(xué)到更多關(guān)于<head>元素的內(nèi)容。

          4.<meta charset="utf-8">: 這個(gè)元素設(shè)置文檔使用utf-8字符集編碼,utf-8字符集包含了人類大部分的文字。基本上他能識(shí)別你放上去的所有文本內(nèi)容。毫無(wú)疑問(wèn)要使用它,并且它能在以后避免很多其他問(wèn)題。

          5.<title></title>: 設(shè)置頁(yè)面標(biāo)題,出現(xiàn)在瀏覽器標(biāo)簽上,當(dāng)你標(biāo)記/收藏頁(yè)面時(shí)它可用來(lái)描述頁(yè)面。

          6.<body></body>: <body>元素。 包含了你訪問(wèn)頁(yè)面時(shí)所有顯示在頁(yè)面上的內(nèi)容,文本,圖片,音頻,游戲等等。

          空白

          代碼中包含的空格是沒(méi)有必要的;下面的兩個(gè)代碼片段是等價(jià)的:

          <p>狗 狗 很 呆 萌。</p>
           
          <p>狗 狗 很
           呆 萌。</p>
          

          渲染這些代碼的時(shí)候,HTML解釋器會(huì)將連續(xù)出現(xiàn)的空白字符減少為一個(gè)單獨(dú)的空格符。

          那么為什么我們會(huì)使用那么多的空白呢? 可讀性 —— 如果你的代碼被很好地進(jìn)行格式化,那么就很容易理解你的代碼。

          特殊字符

          注釋

          為了將一段HTML中的內(nèi)容置為注釋,你需要將其用特殊的記號(hào)<!--和-->包括起來(lái), 比如:

          <p>我在注釋外!</p>
           
          <!-- <p>我在注釋內(nèi)!</p> -->
          

          頭部

          HTML 頭部是包含在<head> 元素里面的內(nèi)容。不像 <body>元素的內(nèi)容會(huì)顯示在瀏覽器中,head 里面的內(nèi)容不會(huì)在瀏覽器中顯示,它的作用是包含一些頁(yè)面的元數(shù)據(jù)。

          元數(shù)據(jù)

          元數(shù)據(jù)就是描述數(shù)據(jù)的數(shù)據(jù),而HTML有一個(gè)“官方的”方式來(lái)為一個(gè)文檔添加元數(shù)據(jù)—— <meta> 。有很多不同種類的 <meta> 可以被包含進(jìn)你的頁(yè)面的<head>元素,比如。

          指定字符的編碼

          <meta charset="utf-8">
          

          這個(gè)元素簡(jiǎn)單的指定了文檔的字符編碼 —— 在這個(gè)文檔中被允許使用的字符集。 utf-8 是一個(gè)通用的字符集,它包含了任何人類語(yǔ)言中的大部分的字符。

          添加作者和描述

          • name 指定了meta 元素的類型; 說(shuō)明該元素包含了什么類型的信息。
          • content 指定了實(shí)際的元數(shù)據(jù)內(nèi)容。
          CSS和JavaScript
          

          如今,幾乎你使用的所有網(wǎng)站都會(huì)使用css讓網(wǎng)頁(yè)更加炫酷,使用js讓網(wǎng)頁(yè)有交互功能,比如視頻播放器,地圖,游戲以及更多功能。這些應(yīng)用在網(wǎng)頁(yè)中很常見(jiàn),它們分別使用<link>元素以及 <script> 元素。

          <link>元素經(jīng)常位于文檔的頭部。這個(gè)link元素有2個(gè)屬性,rel="stylesheet"表明這是文檔的樣式表,而 href包含了樣式表文件的路徑:

          <link rel="stylesheet" href="my-css-file.css">
          

          <script>部分沒(méi)必要非要放在文檔頭部;實(shí)際上,把它放在文檔的尾部(在 </body>標(biāo)簽之前)是一個(gè)更好的選擇,這樣可以確保在加載腳本之前瀏覽器已經(jīng)解析了HTML內(nèi)容(如果腳本加載某個(gè)不存在的元素,瀏覽器會(huì)報(bào)錯(cuò))。

          <script src="my-js-file.js"></script>
          

          標(biāo)題和段落

          在HTML中,每個(gè)段落是通過(guò)<p>元素標(biāo)簽進(jìn)行定義的, 比如下面這樣:

          <p>我是一個(gè)段落,千真萬(wàn)確。</p>
          

          每個(gè)標(biāo)題(Heading)是通過(guò)“標(biāo)題標(biāo)簽”進(jìn)行定義的:

          <h1>我是文章的標(biāo)題</h1>
          

          這里有六個(gè)標(biāo)題元素標(biāo)簽 —— <h1>、<h2>、<h3>、<h4>、<h5>、<h6>。每個(gè)元素代表文檔中不同級(jí)別的內(nèi)容; <h1> 表示主標(biāo)題(the main heading),<h2> 表示二級(jí)子標(biāo)題(subheadings),<h3> 表示三級(jí)子標(biāo)題(sub-subheadings),等等。

          列表

          <ol>
           <li>先用蛋白一個(gè)、鹽半茶匙及淀粉兩大匙攪拌均勻,調(diào)成“腌料”,雞胸肉切成約一厘米見(jiàn)方的碎丁并用“腌料”攪拌均勻,腌漬半小時(shí)。</li>
           <li>用醬油一大匙、淀粉水一大匙、糖半茶匙、鹽四分之一茶匙、白醋一茶匙、蒜末半茶匙調(diào)拌均勻,調(diào)成“綜合調(diào)味料”。</li>
           <li>雞丁腌好以后,色拉油下鍋燒熱,先將雞丁倒入鍋內(nèi),用大火快炸半分鐘,炸到變色之后,撈出來(lái)瀝干油汁備用。</li>
           <li>在鍋里留下約兩大匙油,燒熱后將切好的干辣椒下鍋,用小火炒香后,再放入花椒粒和蔥段一起爆香。隨后雞丁重新下鍋,用大火快炒片刻后,再倒入“綜合調(diào)味料”繼續(xù)快炒。
           <ul>
           <li>如果你采用正宗川菜做法,最后只需加入花生米,炒拌幾下就可以起鍋了。</li>
           <li>如果你在北方,可加入黃瓜丁、胡蘿卜丁和花生米,翻炒后起鍋。</li>
           </ul>
           </li>
          </ol>
          

          標(biāo)記

          <i> 被用來(lái)傳達(dá)傳統(tǒng)上用斜體表達(dá)的意義:外國(guó)文字,分類名稱,技術(shù)術(shù)語(yǔ),一種思想……

          <b> 被用來(lái)傳達(dá)傳統(tǒng)上用粗體表達(dá)的意義:關(guān)鍵字,產(chǎn)品名稱,引導(dǎo)句……

          <u> 被用來(lái)傳達(dá)傳統(tǒng)上用下劃線表達(dá)的意義:專有名詞,拼寫錯(cuò)誤……

          <strong>強(qiáng)調(diào)重要的詞

          超鏈接

          通過(guò)將文本轉(zhuǎn)換為<a>元素內(nèi)的鏈接來(lái)創(chuàng)建基本鏈接, 給它一個(gè)href屬性(也稱為目標(biāo)),它將包含您希望鏈接指向的網(wǎng)址。

          <p>I'm creating a link to
          <a href="https://www.***.com/">***</a>.
          </p>
          

          使用title屬性添加支持信息

          <p>I'm creating a link to
          <a 
           title="這是百度">百度</a>.
          </p>
          

          I'm creating a link to 百度.

          塊級(jí)鏈接

          可以將一些內(nèi)容轉(zhuǎn)換為鏈接,甚至是塊級(jí)元素。例如你想要將一個(gè)圖像轉(zhuǎn)換為鏈接,你只需把圖像元素放到<a></a>標(biāo)簽中間。

          文檔片段

          超鏈接除了可以鏈接到文檔外,也可以鏈接到HTML文檔的特定部分(被稱為文檔片段)。要做到這一點(diǎn),你必須首先給要鏈接到的元素分配一個(gè)id屬性。例如,如果你想鏈接到一個(gè)特定的標(biāo)題,可以這樣做:

          <h2 id="Mailing_address">Mailing address</h2>
          

          然后鏈接到那個(gè)特定的id,可以在URL的結(jié)尾使用一個(gè)哈希符號(hào)(#)指向它,例如:

          <p>Want to write us a letter? Use our <a href="contacts.html#Mailing_address">mailing address</a>.</p>
          

          你甚至可以在同一份文檔下,通過(guò)鏈接文檔片段,來(lái)鏈接到同一份文檔的另一部分:

          <p>The <a href="#Mailing_address">company mailing address</a> can be found at the bottom of this page.</p>
          

          表單

          <!DOCTYPE html>
          <html lang="en">
          <head>
           <meta charset="UTF-8">
           <title>增加學(xué)生</title>
          </head>
          <body>
           
           <form method="post" action="/community/alpha/student">
           
           <p>
           姓名:<input type="text" name="name">
           
           </p>
           <p>
           年齡:<input type="text" name="age">
           
           </p>
           <p>
           <input type="submit" value="保存">
           </p>
           </form>
          </body>
          </html>
          

          后臺(tái):

           //post
           @RequestMapping(path = "/student",method = RequestMethod.POST)
           @ResponseBody
           public String saveStudent(String name,int age){
           System.out.println(name);
           System.out.println(age);
           return "success";
           }
          

          大部分用來(lái)定義表單小部件的元素都有一些他們自己的屬性。然而,在所有表單元素中都有一組通用屬性,它們可以對(duì)這些小部件進(jìn)行控制。下面是這些通用屬性的列表:

          密碼框

          通過(guò)設(shè)置type屬性值為password來(lái)設(shè)置該類型框:

          <input type="password" id="pwd" name="pwd">
          

          搜索框

          通過(guò)設(shè)置 type屬性值為 search 來(lái)設(shè)置該類型框:

          <input type="search" id="search" name="search">
          

          電話號(hào)碼欄:

          通過(guò) type屬性的 tel 值設(shè)置該類型框:

          <input type="tel" id="tel" name="tel">
          

          URL 欄

          通過(guò)type屬性的url 值設(shè)置該類型框:

          <input type="url" id="url" name="url">
          

          多行文本框

          多行文本框?qū)V甘褂?lt;textarea>元素,而不是使用<input>元素。

          <textarea cols="30" rows="10"></textarea>
          

          按鈕

          在HTML表單中,有三種按鈕:

          Submit

          將表單數(shù)據(jù)發(fā)送到服務(wù)器。對(duì)于<button>元素, 省略 type 屬性 (或是一個(gè)無(wú)效的 type 值) 的結(jié)果就是一個(gè)提交按鈕.

          Reset

          將所有表單小部件重新設(shè)置為它們的默認(rèn)值。

          Anonymous

          沒(méi)有自動(dòng)生效的按鈕,但是可以使用JavaScript代碼進(jìn)行定制。

          每次向服務(wù)器發(fā)送數(shù)據(jù)時(shí),都需要考慮安全性。到目前為止,HTML表單是最常見(jiàn)的攻擊路徑(可能發(fā)生攻擊的地方)。這些問(wèn)題從來(lái)都不是來(lái)自HTML表單本身,它們來(lái)自于服務(wù)器如何處理數(shù)據(jù)。

          根據(jù)你所做的事情,你會(huì)遇到一些非常有名的安全問(wèn)題:

          XSS 和 CSRF

          跨站腳本(XSS)和跨站點(diǎn)請(qǐng)求偽造(CSRF)是常見(jiàn)的攻擊類型,它們發(fā)生在當(dāng)您將用戶發(fā)送的數(shù)據(jù)顯示給這個(gè)用戶或另一個(gè)用戶時(shí)。

          XSS允許攻擊者將客戶端腳本注入到其他用戶查看的Web頁(yè)面中。攻擊者可以使用跨站點(diǎn)腳本攻擊的漏洞來(lái)繞過(guò)諸如同源策略之類的訪問(wèn)控制。這些攻擊的影響可能從一個(gè)小麻煩到一個(gè)重大的安全風(fēng)險(xiǎn)。

          CSRF攻擊類似于XSS攻擊,因?yàn)樗鼈円韵嗤姆绞介_(kāi)始攻擊——向Web頁(yè)面中注入客戶端腳本——但它們的目標(biāo)是不同的。CSRF攻擊者試圖將權(quán)限升級(jí)到特權(quán)用戶(比如站點(diǎn)管理員)的級(jí)別,以執(zhí)行他們不應(yīng)該執(zhí)行的操作(例如,將數(shù)據(jù)發(fā)送給一個(gè)不受信任的用戶)。

          XSS攻擊利用用戶對(duì)web站點(diǎn)的信任,而CSRF攻擊則利用網(wǎng)站對(duì)其用戶的信任。

          為了防止這些攻擊,您應(yīng)該始終檢查用戶發(fā)送給服務(wù)器的數(shù)據(jù)(如果需要顯示),盡量不要顯示用戶提供的HTML內(nèi)容。相反,您應(yīng)該對(duì)用戶提供的數(shù)據(jù)進(jìn)行處理,這樣您就不會(huì)逐字地顯示它。當(dāng)今市場(chǎng)上幾乎所有的框架都實(shí)現(xiàn)了一個(gè)最小的過(guò)濾器,它可以從任何用戶發(fā)送的數(shù)據(jù)中刪除HTML<script>、<iframe> 和<object>元素。這有助于降低風(fēng)險(xiǎn),但并不一定會(huì)消除風(fēng)險(xiǎn)。

          SQL注入

          SQL 注入是一種試圖在目標(biāo)web站點(diǎn)使用的數(shù)據(jù)庫(kù)上執(zhí)行操作的攻擊類型。這通常包括發(fā)送一個(gè)SQL請(qǐng)求,希望服務(wù)器能夠執(zhí)行它(通常發(fā)生在應(yīng)用服務(wù)器試圖存儲(chǔ)由用戶發(fā)送的數(shù)據(jù)時(shí))。這實(shí)際上是攻擊網(wǎng)站的主要途徑之一。

          其后果可能是可怕的,從數(shù)據(jù)丟失到通過(guò)使用特權(quán)升級(jí)控制整個(gè)網(wǎng)站基礎(chǔ)設(shè)施的攻擊。這是一個(gè)非常嚴(yán)重的威脅,您永遠(yuǎn)不應(yīng)該存儲(chǔ)用戶發(fā)送的數(shù)據(jù),而不執(zhí)行一些清理工作(例如,在php/mysql基礎(chǔ)設(shè)施上使用mysql_real_escape_string()

          HTTP數(shù)據(jù)頭注入和電子郵件注入

          這種類型的攻擊出現(xiàn)在當(dāng)您的應(yīng)用程序基于表單上用戶的數(shù)據(jù)輸入構(gòu)建HTTP頭部或電子郵件時(shí)。這些不會(huì)直接損害您的服務(wù)器或影響您的用戶,但它們會(huì)引發(fā)一個(gè)更深入的問(wèn)題,例如會(huì)話劫持或網(wǎng)絡(luò)釣魚(yú)攻擊。

          這些攻擊大多是無(wú)聲的,并且可以將您的服務(wù)器變成僵尸。

          偏執(zhí):永遠(yuǎn)不要相信你的用戶

          那么,你如何應(yīng)對(duì)這些威脅呢?這是一個(gè)遠(yuǎn)遠(yuǎn)超出本指南的主題,不過(guò)有一些規(guī)則需要牢記。最重要的原則是:永遠(yuǎn)不要相信你的用戶,包括你自己;即使是一個(gè)值得信賴的用戶也可能被劫持。

          所有到達(dá)服務(wù)器的數(shù)據(jù)都必須經(jīng)過(guò)檢查和消毒。總是這樣。沒(méi)有例外。

          遠(yuǎn)離有潛在危險(xiǎn)的字符轉(zhuǎn)義。應(yīng)該如何謹(jǐn)慎使用的特定字符取決于所使用的數(shù)據(jù)的上下文和所使用的服務(wù)器平臺(tái),但是所有的服務(wù)器端語(yǔ)言都有相應(yīng)的功能。

          限制輸入的數(shù)據(jù)量,只允許有必要的數(shù)據(jù)。

          沙箱上傳文件(將它們存儲(chǔ)在不同的服務(wù)器上,只允許通過(guò)不同的子域訪問(wèn)文件,或者通過(guò)完全不同的域名訪問(wèn)文件更好)。

          最后,我自己是一名從事了多年開(kāi)發(fā)的JAVA老程序員,辭職目前在做自己的java私人定制課程,今年年初我花了一個(gè)月整理了一份最適合2019年學(xué)習(xí)的java學(xué)習(xí)干貨,可以送給每一位喜歡java的小伙伴,想要獲取的可以關(guān)注我的頭條號(hào)并在后臺(tái)私信我:交流,即可免費(fèi)獲取。

          上流行的解決方案是將assetsPublicPath: '/'改成'./',下面說(shuō)一下這個(gè)解決方案的弊端:

          通常頁(yè)面空白的問(wèn)題出現(xiàn)大多數(shù)是由于Spring Boot端配置了server.servlet.context-path,上下文改變了css, js等文件的訪問(wèn)路徑,文件無(wú)法加載導(dǎo)致index.html顯示空白。'/'改成'./'是將絕對(duì)路徑變?yōu)橄鄬?duì)路徑,可以動(dòng)態(tài)適應(yīng)Spring Boot端上下文的改變,這是為什么這個(gè)解決方案起作用的原因。

          Vue項(xiàng)目部署在Spring Boot出現(xiàn)的另一個(gè)常見(jiàn)問(wèn)題是當(dāng)刷新瀏覽器的時(shí)候出現(xiàn)white label, 也就是404錯(cuò)誤,解決的方案基本是把error page配置成為Vue的index.html。

          這兩個(gè)解決方案有沖突的地方,當(dāng)router出現(xiàn)子路徑的時(shí)候刷新瀏覽器,error page會(huì)指向Vue的index.html頁(yè)面,此時(shí)頁(yè)面中訪問(wèn)css,js文件的路徑是相對(duì)路徑,也就是上下文路徑+router子路徑,這將導(dǎo)致css,js再次無(wú)法正常加載,這就是相對(duì)路徑的弊端。

          由于router會(huì)出現(xiàn)子路徑,因此必須保證assetsPublicPath為絕對(duì)路徑,下面講一下保持絕對(duì)路徑的解決方案:

          1 假設(shè)Spring Boot端配置server.servlet.context-path: api, 對(duì)應(yīng)Vue的/config/index.js中assetsPublicPath: '/'改成 '/api/'

          2 router/index.js中配置base: '/api/', 這是保證瀏覽器刷新時(shí)上下文參數(shù)和router跳轉(zhuǎn)路徑一致。

          3 對(duì)于Ajax請(qǐng)求需要配置baseURL, 如果使用Axios, 可以采用如下方法在main.js中配置

          // http request 攔截器
          Axios.interceptors.request.use(
          config => {
          if (localStorage.getItem('id_token')) {
          config.headers.Authorization = localStorage.getItem('id_token')
          }
          config.baseURL = '/api'
          return config
          },
          err => {
          return Promise.reject(err)
          })
          

          4 另外需要注意的一點(diǎn),按照Spring Boot默認(rèn)配置, 在Vue端/config/index.js中assetsSubDirectory: 'static'要改變?yōu)槠渌址热纾?content', 'vue', 'api'等等。

          5 試過(guò)將assetsSubDirectory配置為空,它和另一個(gè)css圖片加載的方案有沖突,圖片加載解決方案是在/build/util.js中加一行配置

          // Extract CSS when that option is specified

          // (which is the case during production build)

          if (options.extract) {

          return ExtractTextPlugin.extract({

          use: loaders,

          fallback: 'vue-style-loader',

          publicPath: '../../'

          })

          結(jié)尾附上Spring Boot端將error page指向Vue的index.html代碼:

          import org.slf4j.Logger;
           import org.slf4j.LoggerFactory;
           import org.springframework.boot.web.server.ConfigurableWebServerFactory;
           import org.springframework.boot.web.server.ErrorPage;
           import org.springframework.boot.web.server.WebServerFactoryCustomizer;
           import org.springframework.context.annotation.Bean;
           import org.springframework.context.annotation.Configuration;
           import org.springframework.http.HttpStatus;
           @Configuration
           public class ServletConfig {
           private static final Logger logger = LoggerFactory.getLogger(ServletConfig.class);
           @Bean
           public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
           logger.info("come to 404 error page");
           return factory -> {
           ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
           factory.addErrorPages(error404Page);
           };
           }
           }
          

          對(duì)前端全棧工程師感興趣的同學(xué)關(guān)注我的頭條號(hào),并在后臺(tái)私信發(fā)送關(guān)鍵字:“前端”即可獲取免費(fèi)的前端全棧工程師學(xué)習(xí)資料

          知識(shí)體系已整理好,歡迎免費(fèi)領(lǐng)取。還有面試視頻分享可以免費(fèi)獲取。關(guān)注我,可以獲得沒(méi)有的架構(gòu)經(jīng)驗(yàn)哦!!


          主站蜘蛛池模板: 国产一区二区精品久久岳√| 亚洲福利一区二区| 搜日本一区二区三区免费高清视频| 国精产品一区一区三区MBA下载| 色偷偷一区二区无码视频| 亚洲一区二区三区在线网站| 亚洲av乱码中文一区二区三区| 日本福利一区二区| 国产一区三区三区| 久久国产精品一区二区| 亚洲欧洲一区二区| 亚洲AV无码一区二区三区网址| 视频在线一区二区三区| 久久一本一区二区三区| 久久久无码精品人妻一区| 色系一区二区三区四区五区| 国产在线不卡一区二区三区| 亚洲精品一区二区三区四区乱码| 国产精品熟女视频一区二区| 久久久久人妻一区精品果冻| 精品国产伦一区二区三区在线观看| 成人一区专区在线观看 | 日本不卡免费新一区二区三区| 精品欧洲AV无码一区二区男男| 无码精品蜜桃一区二区三区WW | 中文字幕一区二区三匹| 一区国严二区亚洲三区| 99无码人妻一区二区三区免费| 日本一区二区三区在线视频| 国产高清视频一区三区| 福利电影一区二区| 国产一区二区女内射| 亚洲一区在线视频| 亚洲色大成网站www永久一区| 亚洲av无一区二区三区| 国产日韩视频一区| 亚洲bt加勒比一区二区| 国产成人高清亚洲一区久久| 3d动漫精品成人一区二区三| 韩国福利一区二区三区高清视频| 97精品一区二区视频在线观看|