前端、数据库、Django简单的练习
一、前端
1、前端頁面由哪幾層構(gòu)成,分別是什么,作用是什么?
分為:結(jié)構(gòu)層(html),表示層(css),行為層(js)。
結(jié)構(gòu)層
超文本標(biāo)記語言。由HTML或XHTML之類的標(biāo)記語言負(fù)責(zé)創(chuàng)建。標(biāo)簽,也就是那些出現(xiàn)在括號里的單詞,對網(wǎng)頁內(nèi)容的語義做出了描述,但這些標(biāo)簽不包含任何關(guān)于如何顯示有關(guān)內(nèi)容的信息。例如:p標(biāo)簽表達了這樣一種語義:“這是一個文本段。”
表示層
層疊樣式表。由css負(fù)責(zé)創(chuàng)建。css對“如何顯示有關(guān)內(nèi)容”的問題做出了回答。
行為層
客戶端腳本語言。負(fù)責(zé)回答“內(nèi)容應(yīng)該如何對事件做出反應(yīng)”這一問題。這是JavaScript語言和DOM主宰的領(lǐng)域。
2、html中總共有幾類標(biāo)簽的?分別描述一下它們的不同?
塊級標(biāo)簽、內(nèi)聯(lián)標(biāo)簽、內(nèi)聯(lián)塊狀標(biāo)簽(img、input)。
內(nèi)聯(lián)標(biāo)簽不能包含塊級標(biāo)簽,塊級標(biāo)簽?zāi)軌虬瑑?nèi)聯(lián)標(biāo)簽也能夠包含塊級標(biāo)簽(除了p元素,p元素不能相互包含,但是p元素能夠包含其他元素。)
3、display:none和visibility:hidden的區(qū)別?
a)display:none是徹底消失,不在文檔流中占位,瀏覽器不會解析該元素;visibility:hidden是視覺上消失了,在文檔流中會占位,瀏覽器會解析該元素。
b)使用visibility:hidden比display:none性能上要好,display切換顯示時頁面會產(chǎn)生回流(當(dāng)頁面中的一部分元素需要改變規(guī)模尺寸、布局、顯示隱藏等,頁面重新構(gòu)建,此時就是回流)而visibility切換顯示時則不會引起回流。
4、input標(biāo)簽都有哪些類型,input標(biāo)簽都有哪些屬性?
類型:button、checkbox、file、hidden、image、password、radio、reset、submit、text
屬性:type、required、pattern(輸入內(nèi)容必須完全匹配正則表達式)、placeholder(提示輸入)、disabled(禁用)、name、id、style。
5、闡述一下css定位有幾種?并分別描述它們的不同。
relative(相對定位):相對定位的偏移參考元素是元素本身,不會使元素脫離文檔流。元素的初始位置占據(jù)的空間會被保留。相對定位元素常常作為絕對定位元素的父元素。并且定位元素經(jīng)常與z-index屬性進行層次分級
absolute(絕對定位):絕對定位元素以父輩元素中最近的定位元素為參考坐標(biāo),如果絕對定位元素的父輩元素中沒有采用定位的,那么此絕對定位元素的參考對象是html,元素會脫離文檔流。就好像文檔流中被刪除了一樣。并且定位元素經(jīng)常與z-index屬性進行層次分級
position:fixed(固定):位移的參考坐標(biāo)是可視窗口,使用fixed的元素脫離文檔流。并且定位元素經(jīng)常與z-index屬性進行層次分級
position:static(靜態(tài)定位):默認(rèn)值,元素框正常生成的,top left bottom right這幾個偏移屬性不會影響其靜態(tài)定位的正常顯示
6、js的基礎(chǔ)數(shù)據(jù)類型有哪些?Null和Undefined的區(qū)別?
基礎(chǔ)數(shù)據(jù)類型:Undefined、Null、String、Number、Boolean。引用類型有這幾種:object、Array、RegExp、Date、Function、特殊的基本包裝類型(String、Number、Boolean)以及單體內(nèi)置對象(Global、Math)。
Null和Undefined的區(qū)別:
null表示“沒有對象”,即該處不該有值。典型用法:
(1) 作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對象。
(2) 作為對象原型鏈的終點。
undefined表示“缺少值”,就是此處應(yīng)該有一個值,但是還沒有定義。典型用法是:
(1)變量被聲明了,但沒有賦值時,就等于undefined。
(2) 調(diào)用函數(shù)時,應(yīng)該提供的參數(shù)沒有提供,該參數(shù)等于undefined。
(3)對象沒有賦值的屬性,該屬性的值為undefined。
(4)函數(shù)沒有返回值時,默認(rèn)返回undefined。
7、列出jQuery常用的選擇器
基本css選擇器:元素選擇器、類選擇器、ID選擇器。
上下文選擇器:后代選擇器、兒子選擇器、兄弟選擇器、毗鄰選擇器
8、事件委托是什么?
事件委托是利用事件的冒泡原理來實現(xiàn)的,何為事件冒泡呢?就是事件從最深的節(jié)點開始,然后逐步向上傳播事件,舉個例子:頁面上有這么一個節(jié)點樹,div>ul>li>a;比如給最里面的a加一個click點擊事件,那么這個事件就會一層一層的往外執(zhí)行,執(zhí)行順序a>li>ul>div,有這樣一個機制,那么我們給最外面的div加點擊事件,那么里面的ul,li,a做點擊事件的時候,都會冒泡到最外層的div上,所以都會觸發(fā),這就是事件委托,委托它們父級代為執(zhí)行事件。
二、數(shù)據(jù)庫
1、數(shù)據(jù)庫的字段類型有哪些?
二進制數(shù)據(jù)類型:Binary、Varbinary、Image
字符數(shù)據(jù)類型:Char,Varchar、text
Unicode數(shù)據(jù)類型:Nchar、Nvarchar、Ntext
日期和時間數(shù)據(jù)類型:數(shù)字?jǐn)?shù)據(jù)類型包括正數(shù)和負(fù)數(shù)、小數(shù)和整數(shù)
smallint、int、bigint
2、說說你所知道的MySQL數(shù)據(jù)存儲引擎,InnoDB存儲引擎和MyISM存儲引擎的區(qū)別?
MySQL中常用的幾種存儲引擎:MyISAM、InnoDB、bdb、MEMORY,
MyISAM存儲引擎:
MyISAM 這種存儲引擎不支持事務(wù),不支持行級鎖,只支持并發(fā)插入的表鎖,主要用于高負(fù)載的select。所以其寫入的并發(fā)處理能力相對較弱。
MyISAM類型的數(shù)據(jù)表(.MYD文件)支持三種不同的存儲結(jié)構(gòu):靜態(tài)型、動態(tài)型、壓縮型。
靜態(tài)型:就是定義的表列的大小是固定(即不含有:xblob、xtext、varchar等長度可變的數(shù)據(jù)類型),這樣mysql就會自動使用靜態(tài)myisam格式。
使用靜態(tài)格式的表的性能比較高,因為在維護和訪問的時候以預(yù)定格式存儲數(shù)據(jù)時需要的開銷很低。但是這高性能是有空間換來的,因為在定義的時候是固定的,所以不管列中的值有多大,都會以最大值為準(zhǔn),占據(jù)了整個空間。
innoDB存儲引擎:
同MyISAM一樣的是,InnoDB存儲引擎也有.frm文件存儲表結(jié)構(gòu)定義
innodb存儲引擎該mysql表提供了事務(wù),回滾以及系統(tǒng)崩潰修復(fù)能力和多版本并發(fā)控制的事務(wù)的安全。
InnoDB有支持事務(wù)及安全的日志文件,這個文件非常重要,InnoDB可以通過日志文件將數(shù)據(jù)庫崩潰時已經(jīng)完成但還沒來得及將內(nèi)存中已經(jīng)修改但未完全寫入磁盤的數(shù)據(jù)寫入磁盤,也可以把已部分完成并寫入磁盤的未完成事務(wù)回滾,保證數(shù)據(jù)一致性。如果錯誤刪除日志文件會導(dǎo)致數(shù)據(jù)庫崩潰且無法啟動。
innodb支持自增長列(auto_increment),自增長列的值不能為空,如果在使用的時候為空的話就會進行自動存現(xiàn)有的值開始增值,如果有但是比現(xiàn)在的還大,則就保存這個值。
innodb存儲引擎支持外鍵(foreign key) ,外鍵所在的表稱為子表而所依賴的表稱為父表。
3、索引的本質(zhì)是什么?索引有什么優(yōu)點?缺點是什么?
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
優(yōu)點:
第一,通過創(chuàng)建唯一性索引,可以保證數(shù)據(jù)庫表中每一行數(shù)據(jù)的唯一性。
第二,可以大大加快數(shù)據(jù)的檢索速度,這也是創(chuàng)建索引的最主要的原因。
第三,可以加速表和表之間的連接,特別是在實現(xiàn)數(shù)據(jù)的參考完整性方面特別有意義。
第四,在使用分組和排序子句進行數(shù)據(jù)檢索時,同樣可以顯著減少查詢中分組和排序的時間。
第五,通過使用索引,可以在查詢的過程中,使用優(yōu)化隱藏器,提高系統(tǒng)的性能。
?? 缺點:
第一,創(chuàng)建索引和維護索引要耗費時間,這種時間隨著數(shù)據(jù)量的增加而增加。
第二,索引需要占物理空間,除了數(shù)據(jù)表占數(shù)據(jù)空間之外,每一個索引還要占一定的物理空間,如果要建立聚簇索引,那么需要的空間就會更大。
第三,當(dāng)對表中的數(shù)據(jù)進行增加、刪除和修改的時候,索引也要動態(tài)的維護,這樣就降低了數(shù)據(jù)的維護速度。
4、char和varchar的區(qū)別,varchar(50)和char(50)分別代表什么意思?
char的長度是不可變的,而varchar的長度是可變的。
char的存取數(shù)度還是要比varchar要快得多,因為其長度固定,方便程序的存儲與查找;但是char也為此付出的是空間的代價,因為其長度固定,所以難免會有多余的空格占位符占據(jù)空間,可謂是以空間換取時間效率,而varchar是以空間效率為首位的。
5、簡述你對inner join、left join、right join的理解。
inner join(內(nèi)連接),在兩張表進行連接查詢時,只保留兩張表中完全匹配的結(jié)果集。
left join(左連接),在兩張表進行連接查詢時,會返回左表所有的行,即使在右表中沒有匹配的記錄。
right join(右連接),在兩張表進行連接查詢時,會返回右表所有的行,即使在左表中沒有匹配的記錄。
full join(全連接),在兩張表進行連接查詢時,返回左表和右表中所有沒有匹配的行。
三、數(shù)據(jù)庫
1、寫出你所知道的Django有關(guān)的所有命令(下載、安裝等)。
1. Django的安裝
pip install django ==1.11.11
pip install -i yuan django==1.11.11
2. 創(chuàng)建項目
django-admin startproject? 項目名
通過manage.py執(zhí)行
CD項目目錄下
3.創(chuàng)建APP
python manage.py startapp app01
4. 啟動項目
python manage.py runserver # 127.0.0.1:8000
python manage.py runserver 80 # 127.0.0.1:80
python manage.py runserver 0.0.0.0: 80 # 0.0.0.0:80
5. 數(shù)據(jù)庫相關(guān)
python manage.py makemigrations # 記錄modeles 的變化,將變更記錄到 對應(yīng)APP 下的 migrations
python manage.py migrate? # 翻譯成SQL語句,去數(shù)據(jù)庫執(zhí)行
?
-------------------------------------------------------------我是下劃線-----------------------------------------------------
?
配置settings.py
1. 數(shù)據(jù)庫相關(guān)
EGNIGE: 引擎 mysql sqllite3
NAME: 數(shù)據(jù)庫名字
HOST: IP
POST:? 端口號 3306
USER: 用戶名
PASSWORD: 密碼? ? ? ‘ ’
2. 靜態(tài)文件相關(guān)
STATIC_URL= ‘static’? # 別名
STATICFILES_DIRS = [
os.path.join(BASE_DIR,'STATIC'),
]
3. APP
INSTALLED_APPS = [
'app01.apps.App01Config',? ? #告訴 Django我自己新建了一個名叫app01的應(yīng)用
# ‘a(chǎn)pp01’
]
4. CSRF
注釋掉CSRF中間件? form表單可以提交POST請求
5. TEMPLATES
'DIRS':[os.path.join(BASE_DIR,'TEMPLATES')]
?
----------------------------------------------------------我是下劃線--------------------------------------------------------
?
ORM的對應(yīng)關(guān)系
類? -------- 數(shù)據(jù)表
對象 ? -------- 數(shù)據(jù)行
屬性 ? -------- 字段
?
-----------------------------------------------------我是下劃線------------------------------------------------------
?
Django使用mysql數(shù)據(jù)庫的步驟:
1.手動創(chuàng)建mysql數(shù)據(jù)庫
2. 在settings.py中配置:
DATABASES = {
'default':{
'ENGINE': 'django.db.background.mysql', # 連接數(shù)據(jù)庫的類型
'NAME': 'mysite' # 數(shù)據(jù)庫名
'HOST': '127.0.0.1', # 數(shù)據(jù)庫主機地址
'POST':? 3306? # 數(shù)據(jù)庫的端口
'USER': 'root',
'PASSWORD': ' ',
}
}
3. 告訴Django使用pymysql連接數(shù)據(jù)庫
在于settings.py 文件同級的目錄下的__init__.py寫代碼:
import pymysql
pymysql.install_as_MySQLdb()
4. 在models.py中寫類(繼承models.Model)
class Press(models.Model):
id = models.AutoField(primary_key=True) # id主鍵
name = models.CharField(max_length=32) # 出版社名稱
def __str__(self):
return '<這是一個出版社對象,它的名字是:{}>'.format(self.name)
#? 書
class Book(models.Model):
id = models.AutoField(primary_key=True) #自增ID主鍵
title= models.CharField(max_length=30) # 書名
price = models.IntegerField() # 價格
# Django 1.11 默認(rèn)就是級聯(lián)刪除 , Django2.0 之后必須指定on_delete
# to=關(guān)聯(lián)的表名
press =? models.ForeignKey('Press_on_delete=models.CASCADE')
# 作者
class? Author(models.Model):
id = models.AutoField(primary_key=True) # 自增ID主鍵
name = models.CharField(max_length=32) # 作者名字
books = models.ManyToManyField(to='book') # 只是ORM層面建立的一個多對多關(guān)系,不是作者表的一個字段
def __str__(self):
return self.name
5. 執(zhí)行命名
python manage.py makemigrations # 記錄models的變化,將變更記錄到 對應(yīng)APP下的migrations
python manage.py migrate #? 翻譯成SQL語句,去數(shù)據(jù)庫執(zhí)行
?
-----------------------------------------------------我是下劃線--------------------------------------------------------
?
ORM操作
1. 查:
from app01.models import User,Press,Book,Author
Press.objects.all() # 查詢所有出版社對象 ------? 對象列表 queryset
Press.objects.filter(條件) # 查詢所有滿足條件的出版社對象? ------ 對象列表 queryset
Press.objects.get(條件) ? # 查詢有且只能有一個對象 沒有或者多個都報錯 ---- 對象
屬性:
press_obj.id
press_obj.name
外鍵:
book_obj.id
book_obj.title
book_obj.press -------關(guān)聯(lián)的對象
book_obj.press_id ? -------數(shù)據(jù)庫中的關(guān)聯(lián)對象的ID
book_obj.press.id
多對多:
author——obj.books ? ------管理對象
author_obj.books.all() ------作者關(guān)聯(lián)的所有書籍對象
2. 增加:
new_obj = Press.objects.create(name='新的出版社')
Book.objects.create(title='書名',price = 15,press=press_obj)
Book.objects.create(title='書名',price=15,press_id=press_obj.id)
new_obj = Author.objects.create(name='作者名')
new_obj.books.set([1,2,3])
new_obj.books.set([book1,book2])
?
new_obj.books.add(1,2,3)
3. 刪除
book_obj.delete()? ------刪除單個對象
Press.objects,filter(條件).delete()? ?-------刪多個對象
?
4. 編輯
press_obj.name = '新的出版社名字'
press_obj.save()
book_obj.press = press_obj
# book_obj.press_id = press_obj.id
book_obj.save()
?
author_obj.name = '作者名'
author_obj.save()
author_obj.books.set([1,2,3])
2、Django的settings中,你用到的配置項有哪些?它們的作用是什么?
TEMPLATE_DIRS
模板文件存放的目錄.該值是一個元組.
STATIC_URL
映射到靜態(tài)文件的url,一般為/static/.
在模板中使用{{STATIC_URL}},得到的就是這個值.
或者在模板中先{% load staticfiles %},然后使用{% static “my_app/abc.jpg” %},該模板標(biāo)簽的值為/static/my_app/abc.jpg
最好使用nginx代理該url,訪問靜態(tài)文件時不通過django,而是直接由nginx訪問.
注意:如果用ngxin代理的話,那么每次修改static文件,都需要執(zhí)行一遍collectstatic命令
STATICFILES_FINDERS
默認(rèn)該值如下:
‘django.contrib.staticfiles.finders.FileSystemFinder’,
‘django.contrib.staticfiles.finders.AppDirectoriesFinder’
FileSystemFinder告訴django從STATICFILES_DIRS設(shè)置的所有目錄下尋找靜態(tài)文件
AppDirectoriesFinder告訴Django從INSTALLED_APPS中每一個app下的static/ 子目錄下去尋找靜態(tài)文件
STATIC_ROOT
是總的static目錄,可以使用命令自動收集static文件
使用命令python manage.py collectstatic收集靜態(tài)文件,將所有靜態(tài)文件復(fù)制到STATIC_ROOT設(shè)置的目錄下.
STATICFILES_DIRS
是個元組,每一項都是靜態(tài)文件存放的目錄.
當(dāng)執(zhí)行collectstatic命令時,會將STATICFILES_DIRS下的所有靜態(tài)文件收集到STATIC_ROOT目錄下.
3、Django使用MySQL數(shù)據(jù)庫的流程是什么?
4、分別定義一個FBV和CBV,以及它們的路由?
FBV
from django.shortcuts import render def index(req): ????if req.method == ‘POST‘: ????????print(‘method is :‘ + req.method) ????elif req.method == ‘GET‘: ????????print(‘method is :‘ + req.method) ????return render(req, ‘index.html‘) url(r‘^index/‘, views.index),CBV
from django.views import View class Index(View): ????def get(self, req): ????????print(‘method is :‘ + req.method) ????????return render(req, ‘index.html‘) ????def post(self, req): ????????print(‘method is :‘ + req.method) ????????return render(req, ‘index.html‘)url(r‘^index/‘, views.Index.as_view()),
5、寫出你知道的request對象的方法和屬性。
request對象的方法:
1.HttpRequest.get_host()——(根據(jù)從HTTP_X_FORWARDED_HOST(如果打開 USE_X_FORWARDED_HOST,默認(rèn)為False)和 HTTP_HOST ??????????????????????????????????????????????????????????????????????????????????????????????????????????????? 頭部信息返回請求的原始主機。)2.HttpRequest.get_full_path()——(返回 path,如果可以將加上查詢字符串。) 3.HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)——(返回簽名過的Cookie 對應(yīng)的值,如果簽名 ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 不再合法則返回django.core.signing.BadSignature。) 4.HttpRequest.is_secure() ——(如果請求時是安全的,則返回True;即請求通是過 HTTPS 發(fā)起的。) 5.HttpRequest.is_ajax()——(如果請求是通過XMLHttpRequest 發(fā)起的,則返回True,方法是檢查 HTTP_X_REQUESTED_WITH ?????????????????????????????????????????????? 相應(yīng)的首部是否是字符串'XMLHttpRequest'。)
request對象的屬性:
0.HttpRequest.scheme(表示請求方案的字符串)
1.HttpRequest.body(一個字符串,代表請求報文的主體)
2.HttpRequest.path(一個字符串,表示請求的路徑組件(不含域名))
3.HttpRequest.method(一個字符串,表示請求使用的HTTP 方法。必須使用大寫。)
4.HttpRequest.encoding(一個字符串,表示提交的數(shù)據(jù)的編碼方式)
5.HttpRequest.GET(一個類似于字典的對象,包含 HTTP GET 的所有參數(shù))
6.HttpRequest.POST(一個類似于字典的對象,如果請求中包含表單數(shù)據(jù),則將這些數(shù)據(jù)封裝成 QueryDict 對象。)
7.HttpRequest.COOKIES(一個標(biāo)準(zhǔn)的Python 字典,包含所有的cookie。鍵和值都為字符串。)
8.HttpRequest.FILES(一個類似于字典的對象,包含所有的上傳文件信息。)
9.HttpRequest.META(一個標(biāo)準(zhǔn)的Python 字典,包含所有的HTTP 首部)
10.HttpRequest.user(一個 AUTH_USER_MODEL 類型的對象,表示當(dāng)前登錄的用戶。)
11.HttpRequest.session(一個既可讀又可寫的類似于字典的對象,表示當(dāng)前的會話)
?
?
?
?
?
?
?
?
?
?
?
6、如何在URLconf中給url命名?在視圖和模板中如何使用url反向解析?
? urlpatterns = patterns('', (r'^mydata/(?P<id>\d+)/$', views.my_view, {'id':3}), )
在模板(可以理解為HTML文件)里面可以這樣引用:
{% url "home" %}在views函數(shù)中可以這樣引用:
from django.urls import reverseredirect(reverse("index",args=("2018", )))7、請寫出你所知道的模板語法。
一、模板語法之變量:語法為 {{ }}:
{{ d.name }}
{{ person_list.1.name }}
二、模板語法之標(biāo)簽:語法為 {% tag ?%}:
1、for標(biāo)簽(注:循環(huán)序號可以通過{{forloop}}顯示)
2、for....empty :for?標(biāo)簽帶有一個可選的{%?empty?%}?從句,以便在給出的組是空的或者沒有被找到時,可以有所操作。
?
{% for person in person_list %}<p>{{ person.name }}</p> {% empty %} <p>sorry,no person here</p> {% endfor %}?
3、if標(biāo)簽 :{%?if?%}會對一個變量求值,如果它的值是“True”(存在、不為空、且不是boolean類型的false值),對應(yīng)的內(nèi)容塊會輸出。
?
{% if i > 300 %}<p>大于{{ i }}</p> {% elif i == 200 %} <p>等于{{ i }}</p> {% else %} <p>小于{{ i }}</p> {% endif %}?
4、with:使用一個簡單地名字緩存一個復(fù)雜的變量,當(dāng)你需要使用一個“昂貴的”方法(比如訪問數(shù)據(jù)庫)很多次的時候是非常有用的
?
{% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }} {% endwith %}?
<p>{{ person_list.2.name }}</p> {% with name=person_list.2.name %} <p>{{ name }}</p> {% endwith %}?
5、csrf_token:這個標(biāo)簽用于跨站請求偽造保護
?
<h3>scrf_token</h3><form action="/tag/" method="post"> {% csrf_token %} <p><input type="text" name="haiyan"></p> <input type="submit"> </form>?
8、請寫出模板和繼承的使用方法。
1)繼承使用
步驟1:母板里寫入block,就可以被繼承,content是名稱
?
{% block title %}{% endblock%}{% block “content“ %}{% endblock%}?
步驟2:子頁面通過extends指定繼承那個模板
?
{% extends 'master.html'%} #繼承那個模板{% block “content“ %} 這個地方就是替換模板block “content“<ul>{% for i in u%}<li>{{i}}</li> {%endfor%}{% endblock%}?
2)一個頁面只能繼承一個模板,如何解決了?如何使用多個模板,或者引入其他頁面
<% include "a.html" %> 可以引用多次
9、請寫出自定義filter的步驟。
10、cookie和session是什么?為什么要使用它們?
一、為什么要用Cookie和Session?
?????? 很多時候客戶端和服務(wù)器進行交互使用了HTTP協(xié)議,但是HTTP協(xié)議是無狀態(tài)的;HTTP協(xié)議的請求過程,是基于 TCP/IP 的,當(dāng)客戶端請求服務(wù)器,服務(wù)器處理后,進行響應(yīng),該過程是無狀態(tài)的。
?????? 但是在有些時候是需要保存一些客戶端的請求信息,識別客戶端的某些狀態(tài),智能的、有針對性的去分析某些客戶端的習(xí)慣。這些時候,就需要去記錄客戶端的連接狀態(tài),識別請求的狀態(tài)等。所以為了解決類似的事情,就需要使用到了 Cookie 和?Session。
?????? 比如,使用Cookie的場景:有些網(wǎng)站有記住用戶名的功能,當(dāng)你勾這個的時候,下次進入該網(wǎng)站時,就會保存上一次登錄的用戶名;使用Seesion的場景:利用Seesion來驗證用戶是否已登錄,利用Session來保存驗證碼。
二、Cookie和Session是什么?
??? (1)Cookie:在客戶端訪問某個地址時,會將請求交到服務(wù)器進行處理,在發(fā)送請求的時候,瀏覽器會將頁面的頭部信息一并的交到服務(wù)器端進行處理。在處理的過程中,Cookie 在服務(wù)器端生成 ,在此同時,可以將一些需要保存的信息,存放到此 Cookie 中。生成 Cookie 對象時,需要確定具體的名稱及具體的值,可以設(shè)置當(dāng)前?Cookie?的過期時間,設(shè)置過期時間后,就相當(dāng)于持久化了 Cookie 中的數(shù)據(jù),此時的 Cookie 會以之前的 Cookie 名稱,保存在客戶端。
如果不設(shè)置過期時間,則當(dāng)前 Cookie 的生命期是瀏覽器會話期間,一旦關(guān)閉了該瀏覽器,當(dāng)前的Cookie 就會不存在了,此時的 Cookie 信息是保存在內(nèi)存中。在服務(wù)器端,處理完后,會將生成的 Cookie ,隨著 Http 響應(yīng),會在 Http 響應(yīng)頭中,加上Cookie 信息,瀏覽器接受到響應(yīng)后,會按照 Http 響應(yīng)頭里的 Cookie ,在客戶端建立 Cookie 。在下次客戶進行請求的時候,Http 會附帶著已經(jīng)存儲過的 Cookie,一并發(fā)送到服務(wù)器。一個域,在客戶端建立的所以 Cookie 都是可以共享的,只要 Cookie 沒有過期。
??? (2)Session:Session 是在服務(wù)器端生成的,存儲在服務(wù)器端,即存在內(nèi)存中。可以對生成的 Session 設(shè)置過期時間,如果不設(shè)置過期時間,默認(rèn)的 Session 過期時間是30 分鐘(在不同的服務(wù)器中,它的過期時間略有不同,本文是以 Tomcat 來說的)? 但是,Sesssion 的生成的同時,會生成一個與之相關(guān)聯(lián)的的?SessionID ,此 SessionID的存儲是需要 Cookie 來完成的。 SessionID 是以名稱為 JSESSIONID,其值應(yīng)該是一個既不會重復(fù),又不容易被找到規(guī)律以仿造的字符串。SessionID會隨著此次 Http 響應(yīng),一并返回到客戶端,并保存在客戶端中。到當(dāng)前請求再次發(fā)出后,該 SessionID會隨著 Http 頭部,傳到服務(wù)器中,服務(wù)器依據(jù)當(dāng)前 SessionID 得到與之對應(yīng)的 Session.
其中:通過 Cookie 的方式存儲 Session 狀態(tài),只是其中一種方式。如果客戶端禁用了 Cookie 的話,很多網(wǎng)站任然可以存儲用戶的信息。一種處理的方式是URL 重寫,將 SesseionID 直接附加在請求地址的后面。另一種處理的方式是,使用隱藏自動的方式。就是服務(wù)器自動的在表單中,添加一個隱藏字段,以便在表單提交時,將 SesseionID 一起傳到服務(wù)器,進行識別。
?
轉(zhuǎn)載于:https://www.cnblogs.com/wjs521/p/9823593.html
總結(jié)
以上是生活随笔為你收集整理的前端、数据库、Django简单的练习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习——JavaWeb05:JSP入门
- 下一篇: 响应式css