JavaWeb-Cookie和Session

CS: customer server  如微信

BS:Browser server  瀏覽器端  如 Chrom

啓動 tomcat:bin/startup.sh

關閉:bin/shutdown.sh

JSP 中寫java 代碼: Jsp: 就是在html 中嵌套Java 代碼

<body>
    hello jsp222...

    <% // 這裏面方java 代碼 
        out.print("hello jsp..."); 
    %>
</body>

配置虛擬路徑

將web項目配置到webapp 以外的路徑

/Users/x/MyFile/Java/JavaWeb/tomcat-8.5.38/conf/server.xml 配置文件中包含Host 的虛擬路徑配置:

原配置

<Host name="localhost" appBase="webapps"
    unpackWARs="true" autoDeploy="true">
    <Valve className="org.apache.catalina.valves.AccessLogValve" 
            directory="logs"
            prefix="localhost_access_log" suffix=".txt"
            pattern="%h %l %u %t "%r" %s %b" 
    />
</Host>

目前配置的就是 appBase="webapps 所以可以識別這個目錄下的東西

在Host 標籤中添加:

<Context docBase="" path=""/>
docBase: 實際路徑
Path 虛擬路徑(絕對或者相對路徑(相對於webapps的路徑))

<Context docBase="/Users/x/MyFile/Java/JavaWeb/jpsProject" 
         path="/jpsProject" 
/>

當url 訪問 http://localhost:8080/jpsProject/ 就會跳到"/Users/x/MyFile/Java/JavaWeb/jpsProject" 去找工程

上面那種方式,總是需要重啓

方式2

新建:

/Users/x/MyFile/Java/JavaWeb/tomcat-8.5.38/conf/Catalina/localhost/jpsProject.xml, 新建文件的名字就是你的那個新建項目名稱

寫配置:

<Context  docBase="/Users/x/MyFile/Java/JavaWeb/jpsProject"  path="/jpsProject" />

可以直接獎文件命名爲 ROOT, 那麼默認就會使用配置作爲默認頁面

虛擬主機

還是在server.xml 新加配置

<Host  appBase="Users/xuxliu/MyFile/Java/JavaWeb/jpsProject"  name="www.test.com">

      <Context  docBase="Users/xuxliu/MyFile/Java/JavaWeb/jpsProject"  path="/" />

</Host>

新添加:<Engine name="Catalina" defaultHost="www.test.com">

創建的web 項目,瀏覽器中直接可以訪問index.jsp 文件但是WEB-INF 中的文件,無法直接通過瀏覽器訪問,只能通過請求轉發訪問

Jsp 的頁面可以寫的東西:

  1. Scriptlet 腳本

定義局部變量、

<%
  String name = "xxxxx";
  System.out.println(name);
%>

定義全局變量及方法

<%!
  String name = "xxxxx";
  out.println(name);
%>

<%= 輸出表達式%>

還可以有:

指令(Page 指令)

<%@ page contentType="text/html;charset=UTF-8" language="java"
   import="java.util.Date"
%>

Jsp 內置的那些方法,不需要new, 可以直接使用,如:out.println(name);

還有的內置對象:Out:向客戶端輸出

pageContext:
request、請求對象,存儲客戶端向服務端發送的請求技術,常見方法
String getParamater(String name) 根據key 返回 value input 標籤的內部屬性
String[] getParamaterValues(String name)
setCharacterEncoding(“編碼格式utf-8”) 設置請求編碼
getRequestDispatcher().forward(request, response) 請求轉發  A -> B
serveletContext getServerContext() 獲取當前serveletContext 對象
<form action="show.jsp">
  <%--
      將表單提交到 show.jsp, getParamater 會根據 name 取到 value
   --%>
  用戶名: <input type="text" name="uname" value="張三"><br>
  密碼: <input type="password" name="upwd" value="zhangsan"><br>
  年齡: <input type="text" name="uage" value="12"><br>
  愛好: <br>
    <input type="checkbox" name="hobbies" value="足球"> 足球
    <input type="checkbox" name="hobbies" value="籃球"> 籃球
    <input type="checkbox" name="hobbies" value="兵乓球"> 兵乓球
    <input type="submit" value="註冊"><br>
</form>

提交後的url變化,默認會使用get 提交方式(超鏈接<a href=xxx>)

http://localhost:8080/show.jsp?uname=zhangsanm&upwd=zhangsan&uage=12&hobbies=%E7%AF%AE%E7%90%83&hobbies=%E5%85%B5%E4%B9%93%E7%90%83

Response:相應對象

提供的方法
Void addCookie(Cookie cookie) 服務端詳客戶端增加cookie 對象
Void sendRedirect(String location) 頁面跳轉的方式,
response.sendRedirect("success.jsp"); 重定向
Void setContentType(String type) 設置服務端響應的編碼(設置服務端的 ContentType 類型)

請求轉發:
 request.getRequestDispatcher("success.jsp").forward(request, response);

重定向與請求轉發:

response.sendRedirect("success.jsp");
頁面跳轉 重定向會到時數據丟失
請求轉發,可以獲取到數據,並且地址欄沒有改變,任然轉發、
            
轉發時候的request 第一次請求是的數據
而且請求轉發 頁面地址不會改變,而重定向 則會發送改變
            
請求次數,請求轉發 的請求次數只有一次,(頁面會在服務器跳到正確頁面,然後返回)
而重定向會出現2次,(頁面在服務器中,給客戶端說你找錯頁面了,然後返回正確的頁面客戶端在去請求正確的頁面)            
重定向 的發出請求地方是 客戶端
請求轉發 轉發除地方是 服務器

Session和Cookie分別是在服務端和客戶端通過記錄信息確定用戶 。cookie和session只是爲了解決http協議無狀態的這種缺陷,爲了記錄用戶信息,記錄瀏覽器和服務器之間的狀態和衍生出來的。

cookie是一種在客戶端記錄用戶信息的技術,因爲http協議是無狀態的,爲了解決這個問題而產生了cookie。記錄用戶名等一些應用

session是一種在服務端記錄用戶信息的技術,一般session用來在服務器端共享數據,

一個簡單的例子說明二者得聯繫與區別

Cookie和Session之間的區別和聯繫
假如一個咖啡店有喝5杯咖啡免費贈一杯咖啡的優惠,然而一次性消費5杯咖啡的機會微乎其微,這時就需要某種方式來紀錄某位顧客的消費數量。想象一下其實也無外乎下面的幾種方案:
    1、該店的店員很厲害,能記住每位顧客的消費數量,只要顧客一走進咖啡店,店員就知道該怎麼對待了。這種做法就是協議本身支持狀態。但是http協議本身是無狀態的
    2、發給顧客一張卡片,上面記錄着消費的數量,一般還有個有效期限。每次消費時,如果顧客出示這張卡片,則此次消費就會與以前或以後的消費相聯繫起來。這種做法就是在客戶端保持狀態。也就是cookie。 顧客就相當於瀏覽器,cookie如何工作,下面會詳細講解
    3、發給顧客一張會員卡,除了卡號之外什麼信息也不紀錄,每次消費時,如果顧客出示該卡片,則店員在店裏的紀錄本上找到這個卡號對應的紀錄添加一些消費信息。這種做法就是在服務器端保持狀態。
    由於HTTP協議是無狀態的,而出於種種考慮也不希望使之成爲有狀態的,因此,後面兩種方案就成爲現實的選擇。具體來說cookie機制採用的是在客戶端保持狀態的方案,而session機制採用的是在服務器端保持狀態的方案。同時我們也看到,由於採用服務器端保持狀態的方案在客戶端也需要保存一個標識,所以session機制可能需要藉助於cookie機制來達到保存標識的目的,但實際上它還有其他選擇

Cookie 就是本地緩存(客戶端),是由服務器創建併發到客戶端後保存下來,當你第二次訪問的 時候就直接在本地緩存中訪問,而不需要在去服務器請求了。提高訪問服務器的效率,但是安全性較差。 key=value  採用的是key value 保存方式。

這個對象是javax.servelet.http.Cookie 構造方法,及擁有的方法

方法:
Public Cookie(String key, String value)
getName、setName、getVlaue、setName
setMaxAge(int expiry): 設置最大有效期,單位 秒
application、config、page、exception

服務端發送給客戶端:Response.addCookie(Cookie cookie) 

客戶端獲取 cookie:Request.getCookie()

Cookie 得使用:

記住用戶名
    登錄時,在服務器端獲取到用戶名,然後創建一個cookie,將用戶名存入cookie中,發送回瀏覽器端,然後瀏覽器下次在訪問登錄頁面時,先拿到cookie,將cookie中的信息拿出來,看是否保存了該用戶名,如果保存了,那麼直接用他,如果沒有,則自己手寫用戶名。

歷史記錄
    比如購物網站,都會有我們的瀏覽記錄的,實現原理其實也是用cookie技術,每瀏覽一個商品,就將其存入cookie中,到需要顯示瀏覽記錄時,只需要將cookie拿出來遍歷即可。  

Session: 會話

如瀏覽網站,從開始到網頁瀏覽器關閉纔是一次會話 電子郵件,從瀏覽、寫、發、退出,是一次會話

Session機制

客戶端第一次請求服務端的時候,服務端會產生一個session對象,用於保存該對象的用戶信息,並且每個session對象有一個唯一的sessionID 用於區分其他session,服務端會產生一個cookie,並且該cookie的name=JESSIONID,JESSIONID 的value=服務端sessionID的值,然後服務端會在響應客戶端的同時,講該cookie發送給客戶端,至此客戶端會有了一個cookie(JESSIONID),因此客戶端的cookie就可以和服務端的session一一對應起來(JESSIONID - sessionID),保證每個用戶有一個session,

第n次(n>1)次請求的時候,根據客戶端的JESSIONID 和服務器端的sessionID,如果匹配那麼就說這個用戶不是第一次登錄,

Session:
String getId() 獲取sessionId
Boolean isNew() 是否新用戶
Void invalid() session失效,在開發的時候註銷和退出登錄的時候會使用到
setAttribute()
getAttribute()
session中可以存放:用戶名、密碼
Void setMaxInactiveInterval(秒)設置有效最大非活動時間,多少時間沒操作那麼需要重新登錄。
Int getMaxInactiveInterval()
session.removeAttribute("uname");  指定屬性移出

session 同一次會話共享,(需在同一種瀏覽器中)
        登錄後,直接訪問a.jsp 或者 b.jsp 都是可以的,此時的session 都是共享的,好比當你登錄淘寶的之後,你在去打開一個擦混個口去瀏覽淘寶此時依舊是登錄狀態,可以直接訪問,但是當你關閉瀏覽器之後,這次的session就結束了,再次打開淘寶網頁,那麼久需要重新登錄了。
session 和 cookie 的異同:
                      保存位置:服務端  客戶端
                       安全性:  較安全  較不安

Cookie不是內對象,要使用必須new,但是服務端會自動new生產一個name=JSEESIONID的cookie,並返回給客戶端,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章