Cookie和Session-創(chuàng)新互聯(lián)

目錄

創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比囊謙網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式囊謙網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋囊謙地區(qū)。費(fèi)用合理售后完善,10年實(shí)體公司更值得信賴。

回顧

一.優(yōu)化表白墻代碼

二.Cookie 和 Session

1.Servlet中操作Cookie和Session Api

2.案例1:寫(xiě)一個(gè)模擬登錄的案例:

3. 案例2:上傳文件


回顧

1.Servlet API
2.HttpServlet
DoXXX處理哪種Http方法會(huì)調(diào)用到對(duì)應(yīng)的方法
init/destroy/service--->servlet的生命周期
3.HttpServletRequest ? Http請(qǐng)求 ? ? ?get系列方法
協(xié)議名(版本號(hào))
url
query string
header
query String/body
HttpServletResponse Http響應(yīng) ? ?set系列方法

狀態(tài)碼
各種header
body


一.優(yōu)化表白墻代碼

當(dāng)前表白墻寫(xiě)了多個(gè)DataSourse,使用單例模式優(yōu)化
餓漢:類加載創(chuàng)建實(shí)例
懶漢:效率更高(首次調(diào)用創(chuàng)建實(shí)例)

public class DBUtil {
? ? private static DataSource dataSource=null;
? ? public DataSource getDataSource(){
? ? ? ? //首次調(diào)用的時(shí)候創(chuàng)建實(shí)例
? ? ? ? if(dataSource==null){
? ? ? ? ? ? dataSource=new MysqlDataSource();
? ? ? ? ? ? ((MysqlDataSource)dataSource).setURL("jdbc:/mysql://127.0.0.1:3306/java105?characterEncoding=utf8&useSSL=false");
? ? ? ? ? ? ((MysqlDataSource)dataSource).setUser("root");
? ? ? ? ? ? //數(shù)據(jù)庫(kù)的密碼
? ? ? ? ? ? ((MysqlDataSource)dataSource).setPassword("1309411303");
? ? ? ? }
? ? ? ? return dataSource;
? ? }
}

還要注意線程安全問(wèn)題:
多個(gè)線程同時(shí)判定dataSouce為null,會(huì)創(chuàng)建多個(gè)實(shí)例
Servlet代碼中,涉及到多線程/線程安全問(wèn)題,
Servlet寫(xiě)的是一個(gè)服務(wù)器,同一時(shí)刻,可能要處理多個(gè)客戶端的請(qǐng)求,一旦有多個(gè)客戶端發(fā)送多個(gè)請(qǐng)求,服務(wù)器務(wù)必需要同時(shí)處理多個(gè)請(qǐng)求
Tomcat內(nèi)部正式使用了多線程的方式

解決方案:
1.加上volatile

private static ?volatile DataSource dataSource=null;

2.加鎖

3.構(gòu)造方法私有

二.Cookie 和 Session

Cookie 是瀏覽器在本地持久化保存數(shù)據(jù)的一種方案
一個(gè)典型的使用方式,存儲(chǔ)登錄信息

1.Servlet中操作Cookie和Session Api

在Servlet中也專門(mén)提供了相關(guān)的Api,讓我們來(lái)操作Cookie和Session

HttpServlet類中的相關(guān)方法
方法描述
HttpSession getSession()

使用模式有倆中

參數(shù)填寫(xiě) false 判定當(dāng)前會(huì)話是否存在,如果不存在,直接返回對(duì)應(yīng)的HttpSession對(duì)象

參數(shù)填寫(xiě)true,判定當(dāng)前會(huì)話是否存在,如果不存在,就創(chuàng)建一個(gè)新的鍵值對(duì),保存到哈希表中,并把生成的sessionId 返回到瀏覽器這里,

都是根據(jù)請(qǐng)求中的Cookie里的sessionId來(lái)查哈希表,如果存在則直接返回HttpSeeion對(duì)象

Cookie[]getCookie()返回一個(gè)數(shù)組, 包含客戶端發(fā)送該請(qǐng)求的所有的 Cookie 對(duì)象. 會(huì)自動(dòng)把Cookie 中的格式解析成鍵值對(duì)
HttpServletResponse類中的相關(guān)方法
方法描述
void addCookie(Cookie cookie)

返回響應(yīng),你想給瀏覽器返回哪些cookie,都可以通過(guò)這個(gè)方法來(lái)添加

在這里添加的鍵值對(duì),都會(huì)體現(xiàn)在Http響應(yīng)報(bào)文的SetCookie字段上

HttpSession類中的相關(guān)方法
方法描述
Object getAttribute(String
name)
該方法返回在該 session 會(huì)話中具有指定名稱的對(duì)象,如果沒(méi)
有指定名稱的對(duì)象,則返回 null
void setAttribute(String
name, Object value)
該方法使用指定的名稱綁定一個(gè)對(duì)象到該 session 會(huì)話
boolean isNew()判定當(dāng)前是否是新創(chuàng)建出的會(huì)話
Cookie類中的相關(guān)方法
方法描述
String getName()該方法返回 cookie 的名稱。名稱在創(chuàng)建后不能改變。(這個(gè)值是 Set
Cooke 字段設(shè)置給瀏覽器的)
String getValue()該方法獲取與 cookie 關(guān)聯(lián)的值
void setValue(String
newValue)
該方法設(shè)置與 cookie 關(guān)聯(lián)的值。

一個(gè) HttpSession 對(duì)象里面包含多個(gè)鍵值對(duì). 我們可以往 HttpSession 中存任何我們需要的信息.

每個(gè) Cookie 對(duì)象就是一個(gè)鍵值對(duì)

理解會(huì)話機(jī)制
服務(wù)器同一時(shí)刻收到的請(qǐng)求是很多的. 服務(wù)器需要清除的區(qū)分清楚每個(gè)請(qǐng)求是從屬于哪個(gè)用戶, 就需要在服務(wù)器這邊記錄每個(gè)用戶令牌以及用戶的信息的對(duì)應(yīng)關(guān)系


2.案例1:寫(xiě)一個(gè)模擬登錄的案例:

構(gòu)思內(nèi)容:
1.登錄頁(yè)面,用戶可以填寫(xiě)用戶名+密碼
2.Servlet來(lái)處理登錄請(qǐng)求
3.使用另一個(gè)Servlet來(lái)生成主頁(yè)內(nèi)容(登錄成功后,跳轉(zhuǎn)到的頁(yè)面)

具體步驟

1.構(gòu)造form表單發(fā)給Servlet處理(注意三點(diǎn)匹配關(guān)系)
name(getParameter),method ,action


2.Servlet進(jìn)行判定
當(dāng)用戶點(diǎn)擊提交的時(shí)候,就會(huì)把剛才input框的name的值作為key,把input框里用戶的輸入,作為value,把這個(gè)鍵值對(duì),放到body中提交給服務(wù)器,name屬性決定了鍵值對(duì)中的建,通過(guò)服務(wù)器getParameter獲取值



這里將字符串寫(xiě)到前面,肯定不是空的,一定不會(huì)出現(xiàn)空指針異常(好處double check),雖然equls內(nèi)部已經(jīng)針對(duì)參數(shù)為null進(jìn)行從處理了

3.登錄成功創(chuàng)建新的會(huì)話(SessionId),設(shè)置鍵值對(duì),并重定向到指定的頁(yè)面

if("zhangsan".equals(username)&&"123".equals(password)){
            //登陸成功
            //a)創(chuàng)建一個(gè)會(huì)話,用戶剛登錄成功,之前是沒(méi)有會(huì)話的,重新分配一個(gè)新的會(huì)話給用戶
            //創(chuàng)建sessionId和一個(gè)HttpSession 對(duì)象
            //把這倆個(gè)內(nèi)容以鍵值對(duì)的形式插入到內(nèi)存的哈希表中
            //把sessionId通過(guò) set-cookie 寫(xiě)到響應(yīng)中
            HttpSession session=req.getSession(true);
            //隨意的設(shè)置鍵值對(duì)了(HttpSession 對(duì)象也相當(dāng)于一個(gè)哈希表)
            session.setAttribute("username","zhangsan");
            //讓響應(yīng)重定向到主頁(yè)
            resp.sendRedirect("index");
}

4.登錄失敗

//登錄失敗
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤");

5.重定向后生成的主頁(yè)內(nèi)容

//登錄成功后,跳轉(zhuǎn)到的主頁(yè)
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //首頁(yè)中先獲取session,此處的session正是剛才登錄頁(yè)的時(shí)候,登錄成功的邏輯中創(chuàng)建出來(lái)的
        //此處參數(shù)寫(xiě)作false即可,表示不新建,如果不存在,就返回null即可
        HttpSession session=req.getSession(false);
        if(session==null){
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("你尚未登陸,不能訪問(wèn)主頁(yè)");
            return;
        }
        String username=(String) session.getAttribute("username");
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("歡迎來(lái)到主頁(yè)!" +username);
    }
}

理解3,5步驟

完整代碼:處理登錄請(qǐng)求+登錄頁(yè)面+跳轉(zhuǎn)后的服務(wù)器響應(yīng)

package login;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//使用這個(gè)類來(lái)處理登錄請(qǐng)求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.從請(qǐng)求中獲取到頁(yè)面提交的用戶名和密碼
        String username=req.getParameter("username");
        String password=req.getParameter("password");
        //2.驗(yàn)證用戶名密碼是否正確
        //正常這個(gè)操作是要查數(shù)據(jù)庫(kù),此處為了簡(jiǎn)單,直接寫(xiě)成硬編碼了(把正確的用戶名和密碼寫(xiě)死了)
        //假定正確的密碼是 zhangsan 123
        if("zhangsan".equals(username)&&"123".equals(password)){
            //登陸成功
            //a)創(chuàng)建一個(gè)會(huì)話,用戶剛登錄成功,之前是沒(méi)有會(huì)話的,重新分配一個(gè)新的會(huì)話給用戶
            //創(chuàng)建sessionId和一個(gè)HttpSession 對(duì)象
            //把這倆個(gè)內(nèi)容以鍵值對(duì)的形式插入到內(nèi)存的哈希表中
            //把sessionId通過(guò) set-cookie 寫(xiě)到響應(yīng)中
            HttpSession session=req.getSession(true);
            //隨意的設(shè)置鍵值對(duì)了(HttpSession 對(duì)象也相當(dāng)于一個(gè)哈希表)
            session.setAttribute("username","zhangsan");
            //讓響應(yīng)重定向到主頁(yè)
            resp.sendRedirect("index");
        }else{
            //登錄失敗
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("登錄失敗,用戶名或密碼錯(cuò)誤");
        }
    }
}
package login;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//登錄成功后,跳轉(zhuǎn)到的主頁(yè)
@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //首頁(yè)中先獲取session,此處的session正是剛才登錄頁(yè)的時(shí)候,登錄成功的邏輯中創(chuàng)建出來(lái)的
        //此處參數(shù)寫(xiě)作false即可,表示不新建,如果不存在,就返回null即可
        HttpSession session=req.getSession(false);
        if(session==null){
            resp.setStatus(403);
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("你尚未登陸,不能訪問(wèn)主頁(yè)");
            return;
        }
        String username=(String) session.getAttribute("username");
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("歡迎來(lái)到主頁(yè)!" +username);
    }
}
3. 案例2:上傳文件

前端,搭配form表單,允許通過(guò)瀏覽器選中一個(gè)文件,上傳給服務(wù)器

HttpServletResponse類法
方法描述
Part getPart(String name)獲取請(qǐng)求中給定 name 的文件
CollectiongetParts()獲取所有的文件
Part類方法
String getSubmittedFileName()獲取提交的文件名
String getContentType()獲取提交的文件類型
long getSize()獲取文件的大小
void write(String path)把提交的文件數(shù)據(jù)寫(xiě)入磁盤(pán)文件
方法描述
String getSubmittedFileName()獲取提交的文件名
String getContentType()獲取提交的文件類型
long getSize()獲取文件的大小
void write(String path)把提交的文件數(shù)據(jù)寫(xiě)入磁盤(pán)文件

注意對(duì)應(yīng)關(guān)系

完整代碼

@WebServlet("/upload")
@MultipartConfig
public class UploadServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Part part=req.getPart("myfile");
        System.out.println(part.getSubmittedFileName());
        System.out.println(part.getSize());
        System.out.println(part.getContentType());
        part.write("c/program/result.jpg");
    }
}

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

本文名稱:Cookie和Session-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article10/pcido.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)頁(yè)設(shè)計(jì)公司、響應(yīng)式網(wǎng)站、ChatGPT、小程序開(kāi)發(fā)、電子商務(wù)網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名