1.狀態管理
由於HTTP協議是無狀態協議,但不少時候須要將客戶端和服務端的屢次請求當作一個來對待.將屢次交互中設計的數據進行保存.
狀態:數據
管理:對數據的維護web
2.Cookie
客戶端向服務器發送一個請求後,服務器會將一段文本信息以set-cookie消息頭的方式發回給客戶端,瀏覽器會存儲這一段信息,
當客戶端再次向服務器發出請求時,瀏覽器會默認給服務器發送這段信息.
建立Cookie:
Cookie c = new Cookie(String name,String value);
response.addCookie(c);
查詢Cookie:
Cookie[] cookies = request.getCookies();
能夠返回null.
cookie.getName();
cookie.getValue();瀏覽器
修改cookie:
若是set-cookie消息頭髮揮文本的名字在瀏覽器中已經存在,name會覆蓋原有的舊的文本.tomcat
3.Cookie的原理:
1.發送請求;
2.執行response.addCookie語句後,就會有set-cookie消息頭髮送一段文本到瀏覽器;
3.瀏覽器保存信息到硬盤或者內存中;
4.當再次發送請求時,會以cookie消息頭的形式自動將保存的文本發送到服務器.
5.服務器端可使用request.getCookie獲取cookie的值.安全
4.Cookie的生命週期
默認狀況下,cookie存儲組內存中,因此關閉瀏覽器時,cookie消失.
設置生命週期:
cookie.setMaxAge(); 單位是秒 >0 指在硬盤上保存的時間 =0 當即銷燬 <0 等同於默認狀況,保存在內存中服務器
5.設置中文
URLEncoder.encode("中文","UTF-8");
URLDncoder.encode("中文","UTF-8");
6.Cookie的路徑問題
只有當瀏覽器訪問Cookie的路徑或者子路徑時,纔會將這個Cookie進行上傳.
默認狀況下,Cookie的路徑是建立Cookie的路徑.cookie
cookie.setPath("/")網絡
7.Cookie的限制
只能光存儲字符串,大小不能超過4kb,各個廠商對保存cookie的個數限制.佔用過多的網絡資源.並且cookie自己存在瀏覽器,若是是明文存儲是不安全的.session
8.Session(會話):
Session也是實現狀態管理的一種手段,保存屢次交互數據時存在服務器端的,在客戶端與服務器端之間傳遞的也只是session的編號.dom
9.Session的原理:
客戶端第一次訪問server-->server爲不一樣的客戶端建立一個session對象-->在提供響應時間session對象的惟一編號以set-cookie消息頭的方式返回客戶端
-->客戶端將這個id存在內存中-->再次發送請求時,內存中的id會自動發送給服務器端-->服務器端根據id查找對應的對象字體
10.Session的使用
a.建立session對象: 實現登陸操做
HttpSession s = request.getSession(bool);
bool = true:根據id查詢session,有則使用,沒有則建立.若是bool=false沒有id則返回null.
b.使用Session綁定數據 能夠實現登陸操做
session.setAttribute(String name,Object value);
session.getAttribute(name)
c.刪除session
session.inValidate(); 能夠實現退出登陸操做
11.Session驗證
一些資源只有用戶登陸後才能進行訪問.
12.Session的超時問題
容器回將一些閒置的好久的session進行回收.閒置時間就是session的生命週期.
默認的超時時間是:30min.
a)能夠修改tomcat/conf/web.xml中進行更改 全局
b)可使用session.setMaxInactiveInterval(秒) 個例
13.禁用Cookie的後果
基於Cookie來存儲的sid會失效,session沒法使用.若是還須要繼續使用的話,可使用URL重寫的方式.
URL重寫:改變地址欄的地址內容,以新的形式訪問服務器而且能攜帶一個sid
response.encodeURL(); //超連接的時候
response.encodeRedirectURL(); //重定向時將地址進處理
14.驗證碼 1.防止惡意攻擊,不停的註冊,不停的登陸來佔用服務器資源; 2.只有發送請求時,纔將隨機昌盛的字符組合會知道圖片上,返回. 3.生成圖片: 繪製一張從白紙到內容生成圖片的過程 //建立畫布 BufferedImage image = new BufferedImage(100, 30, BufferedImage.TYPE_INT_RGB); //獲取畫筆 Graphics g = image.getGraphics(); //設置畫筆顏色 Random random = new Random(); g.setColor(new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255))); //設置字體 g.setFont(new Font(null, Font.BOLD, 24)); //繪製背景 g.fillRect(0, 0, 100, 30); //更改畫筆顏色 g.setColor(new Color(255,255,255)); //繪製字符串 String temp = "" + random.nextInt(20) + random.nextInt(20) + random.nextInt(20); g.drawString(temp, 10, 25); //保存網絡至網絡流(設置響應流的圖片) response.setContentType("image/jpeg"); //獲取輸出流 OutputStream outputStream = response.getOutputStream(); //保存圖片到輸出流 ImageIO.write(image, "jpeg", outputStream); outputStream.close();