1. 程式人生 > 實用技巧 >JavaWeb - Cookie/Session&Filter/Listener&MVC

JavaWeb - Cookie/Session&Filter/Listener&MVC

JavaWeb - Cookie/Session&Filter/Listener&MVC

目錄

1 Cookie&Session

1.1 會話技術

建立會話:

  • B/S架構中,瀏覽器給伺服器傳送第一次請求

斷開會話:

  • 瀏覽器或伺服器有一方斷開

一次會話包含多次請求響應

http協議是無狀態協議,同一會話中多個請求是獨立的,資料無法共享

1.1.1 會話技術的目的

儲存瀏覽器與伺服器之間多次請求之間的資料

客戶端會話技術:cookie

伺服器端會話技術:session

1.2.1 作用概述:
  • 在一次會話中的多次請求之間共享資料
  • 將資料儲存到瀏覽器端
1.2.2 Cookie使用相關API
//建立cookie物件,value裡面只能存字串
Cookie cookie = new Cookie(String name, String value);
//通過response物件響應cookie
reponse.addCookie(cookie)

//從cookie中獲取資料
//通過request物件接收cookie陣列
Cookie[] cookies = request.getCookies();
//獲取cookie的名稱和值
cookie.getName() & cookie.getValue()
1.2.3 Cookie的工作原理

瀏覽器具有儲存cookie能力和在傳送的請求中攜帶cookie的能力

基於HTTP協議:請求頭cookie和響應頭set-cookie

1.2.4 Cookie使用細節
  • 伺服器可以傳送多個cookie 通過response.addcookie(cookie)儲存到瀏覽器

  • Cookie在瀏覽器儲存時間

    • 預設情況下:瀏覽器關閉(會話結束),cookie銷燬
    • 手動設定cookie存活時間 cookie.setMaxAge(int second) - 單位是秒
  • Cookie中是否可以存中文

    • tomcat8之前版本不支援中文
    • tomcat8之後版本支援中文但不允許使用分號,空格等一些特殊符號
    • 使用URLEncoder和URLDecoder來進行編解碼支援所有版本
  • cookie.setMaxAge(int second)引數設定

    • 正數:指定存活時間,持久化瀏覽器的磁碟中,到期後自動銷燬
    • 負數:預設瀏覽器關閉,cookie銷燬
    • 零:立即銷燬
  • URLEncoder.encode(傳入內容, 編碼方式)

  • URLDecoder.decode(value, 編碼方式)

1.2.5 Cookie的特點
  • cookie儲存資料都在客戶端(瀏覽器)
  • cookie的儲存資料只能是字串
  • cookie單個大小不能超過4kb
  • cookie儲存的資料不太安全

1.3 Session

1.3.1 Session概述

使用cookie的問題:

最多儲存4k字串

儲存資料不安全

session的作用

在一次會話的多次請求之間共享資料,將資料儲存到伺服器端

1.3.2 Session的使用
  • 將資料存到session中
//1.通過request物件獲取session物件
HttpSession session = request.getSession();
//2.操作session的API,儲存資料
session.setAttribute("name",hvalue) 
  • 從session中獲取資料
//1.通過request物件獲取session物件
HttpSession session = request.getSession();
//2.操作session的API獲取資料
session.getAttribute("name");
1.3.3 HttpSession 物件
  • 是一個域物件

  • API

//1.儲存資料
void setAttribute(String name, Objetc value)

//2.獲取資料
object getAttribute(String name)

//3.刪除資料
void removeAttribute(String name)
1.3.4 session的工作原理

基於cookie實現:設定session後響應頭通過set-cookie: JSESSIONID 唯一標識來區別不同的session空間

下一次請求傳送時request物件會攜帶JSESSIONID

1.3.5 session的生命週期

何時建立:

使用者第一次呼叫request.getSession()方法時建立

何時銷燬

  • 伺服器非正常關閉

  • 非活躍狀態30分鐘後

    • tomcat進行配置 /tomcat安裝目錄/conf/web.xml
  • session.invalidate() 立馬銷燬

作用範圍

一次會話中多次請求間

每個瀏覽器跟伺服器都是獨立的會話

1.4 三大域物件總結

  • HttpServletRequest
  • ServletContext
  • HttpSession

API 基本API三大域物件相同

  • 設定資料 void setAttribute(String name, Object value)
  • 獲取資料 Object getAtrribute(String name)
  • 刪除資料 void removeAtrribute(String name)

生命週期

何時建立:

  • ServletContext在伺服器正常啟動,專案載入時建立
  • HttpSession 在使用者第一次呼叫getSession()方法時建立
  • HttpServletRequest 在使用者傳送請求時建立

何時銷燬:

  • ServletContext在伺服器關閉或專案解除安裝時銷燬
  • HttpSession在伺服器非正常關閉/未活躍狀態30分鐘/自殺時銷燬
  • HttpServletRequest在伺服器做出響應後銷燬

作用範圍:

  • ServletContext整個web專案(共享資料)
  • HttpSession一次會話中,多次請求間(共享資料)
  • HttpServletRequest在一次請求中,多次轉發間(共享資料)
1.4.1 小結
  • 能用小的不用大的:HttpServletRequest < HttpSession < ServletContext
  • 常用場景:
    • request:一次查詢的結果(servlet轉發jsp)
    • session:存放當前會話的私有資料
      • 使用者登陸狀態
      • 驗證碼
      • 購物車
    • servletcontext:若需要所有的servlet都能訪問到才使用這個物件

2 Filter&Listener

2.1 Filter

2.1.1 概念

作用:當用戶訪問伺服器資源時,過濾器將請求攔截下來。完成一些通用的操作

應用場景:登陸驗證,統一編碼處理,敏感字元處理

2.1.2 Filter快速使用
  • 實現Filter介面,重寫init(), doFilter(), destory()方法

  • doFilter(servletRequest, servletResponse, filterChain)進行業務邏輯處理和放行處理

    • servletRequest 請求物件
    • servletResponse 響應物件
    • filterChain 過濾器鏈(是否放行)
  • 放行操作呼叫filterChain.doFilter(servletRequest, servletResponse)

  • web.xml 中配置 過濾器類全路徑,並配置 url-pattern配置過濾器的攔截路徑

2.1.3 Filter生命週期

建立:

伺服器啟動專案載入,建立filter物件,執行init方法(僅1次)

攔截生效:

當用戶訪問被攔截目標時,執行doFilter方法

銷燬:

伺服器關閉專案時,銷燬filter物件,執行destory物件(僅一次)

2.1.4 Filter攔截路徑設定

在web.xml中的中配置url-pattern

  • 精確匹配 訪問指定目標資源
  • 目錄匹配 訪問指定目錄下 /a/*
  • 字尾匹配 訪問指定字尾名 (*.html)
  • 匹配所有 訪問所有資源 /*
2.1.5 Filter過濾器鏈

一次請求中匹配到多個filter

過濾器鏈執行順序:

  • filterA攔截,放行
  • filterB攔截,放行
  • 訪問目標資源
  • filterB響應增強
  • filterA響應增強

順序決定過濾器鏈的攔截順序

2.2 Listner

2.2.1 概念

能夠監聽三大域物件

應用場景:

歷史訪問次數,統計線上人數,系統啟動時初始化配置資訊

2.2.2 ServletContextListener介面

API

void contextInitialized(ServletContextEvent sce) 監聽servletcontext建立

void contextDestoryed(ServletContextEvent sce) 監聽servletcontext銷燬

實現步驟:

  • 實現ServletContextListener介面
  • 實現ServletContextListener介面中的contextInitialized和contextDestoryed方法
  • web.xml中進行配置 -

3 MVC模式及三層架構

3.1 MVC模式

概念:

MVC是軟體工程中的一種軟體架構模式,是一種分離業務邏輯與顯示頁面的設計方法

model-view-controller:

  • model - JavaBean - 處理業務邏輯,封裝實體
  • view - Jsp展示資料
  • controller - servlet - 接受請求&呼叫模型&轉發檢視

目的:高內聚,低耦合

優缺點:

優點:降低耦合性,方便維護和拓展,利於分工協作

缺點:使得專案架構變得複雜

3.2 三層架構

概念

三層架構就是將整個業務應用劃分為表現層,業務邏輯層,資料訪問層

  • 表現層:web層,與瀏覽器進行資料互動(controller和view)
  • 業務邏輯層:service層,處理業務邏輯
  • 資料訪問層(持久層):dao層,與資料庫進行互動(記錄與JavaBean實體對應)