99偷拍视频精品区一区二,口述久久久久久久久久久久,国产精品夫妇激情啪发布,成人永久免费网站在线观看,国产精品高清免费在线,青青草在线观看视频观看,久久久久久国产一区,天天婷婷久久18禁,日韩动漫av在线播放直播

Cookie和Session-創新互聯

目錄

創新互聯公司-專業網站定制、快速模板網站建設、高性價比囊謙網站開發、企業建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式囊謙網站制作公司更省心,省錢,快速模板網站建設找我們,業務覆蓋囊謙地區。費用合理售后完善,10年實體公司更值得信賴。

回顧

一.優化表白墻代碼

二.Cookie 和 Session

1.Servlet中操作Cookie和Session Api

2.案例1:寫一個模擬登錄的案例:

3. 案例2:上傳文件


回顧

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

狀態碼
各種header
body


一.優化表白墻代碼

當前表白墻寫了多個DataSourse,使用單例模式優化
餓漢:類加載創建實例
懶漢:效率更高(首次調用創建實例)

public class DBUtil {
? ? private static DataSource dataSource=null;
? ? public DataSource getDataSource(){
? ? ? ? //首次調用的時候創建實例
? ? ? ? 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");
? ? ? ? ? ? //數據庫的密碼
? ? ? ? ? ? ((MysqlDataSource)dataSource).setPassword("1309411303");
? ? ? ? }
? ? ? ? return dataSource;
? ? }
}

還要注意線程安全問題:
多個線程同時判定dataSouce為null,會創建多個實例
Servlet代碼中,涉及到多線程/線程安全問題,
Servlet寫的是一個服務器,同一時刻,可能要處理多個客戶端的請求,一旦有多個客戶端發送多個請求,服務器務必需要同時處理多個請求
Tomcat內部正式使用了多線程的方式

解決方案:
1.加上volatile

private static ?volatile DataSource dataSource=null;

2.加鎖

3.構造方法私有

二.Cookie 和 Session

Cookie 是瀏覽器在本地持久化保存數據的一種方案
一個典型的使用方式,存儲登錄信息

1.Servlet中操作Cookie和Session Api

在Servlet中也專門提供了相關的Api,讓我們來操作Cookie和Session

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

使用模式有倆中

參數填寫 false 判定當前會話是否存在,如果不存在,直接返回對應的HttpSession對象

參數填寫true,判定當前會話是否存在,如果不存在,就創建一個新的鍵值對,保存到哈希表中,并把生成的sessionId 返回到瀏覽器這里,

都是根據請求中的Cookie里的sessionId來查哈希表,如果存在則直接返回HttpSeeion對象

Cookie[]getCookie()返回一個數組, 包含客戶端發送該請求的所有的 Cookie 對象. 會自動把Cookie 中的格式解析成鍵值對
HttpServletResponse類中的相關方法
方法描述
void addCookie(Cookie cookie)

返回響應,你想給瀏覽器返回哪些cookie,都可以通過這個方法來添加

在這里添加的鍵值對,都會體現在Http響應報文的SetCookie字段上

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

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

每個 Cookie 對象就是一個鍵值對

理解會話機制
服務器同一時刻收到的請求是很多的. 服務器需要清除的區分清楚每個請求是從屬于哪個用戶, 就需要在服務器這邊記錄每個用戶令牌以及用戶的信息的對應關系


2.案例1:寫一個模擬登錄的案例:

構思內容:
1.登錄頁面,用戶可以填寫用戶名+密碼
2.Servlet來處理登錄請求
3.使用另一個Servlet來生成主頁內容(登錄成功后,跳轉到的頁面)

具體步驟

1.構造form表單發給Servlet處理(注意三點匹配關系)
name(getParameter),method ,action


2.Servlet進行判定
當用戶點擊提交的時候,就會把剛才input框的name的值作為key,把input框里用戶的輸入,作為value,把這個鍵值對,放到body中提交給服務器,name屬性決定了鍵值對中的建,通過服務器getParameter獲取值



這里將字符串寫到前面,肯定不是空的,一定不會出現空指針異常(好處double check),雖然equls內部已經針對參數為null進行從處理了

3.登錄成功創建新的會話(SessionId),設置鍵值對,并重定向到指定的頁面

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

4.登錄失敗

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

5.重定向后生成的主頁內容

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

理解3,5步驟

完整代碼:處理登錄請求+登錄頁面+跳轉后的服務器響應

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;

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

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

前端,搭配form表單,允許通過瀏覽器選中一個文件,上傳給服務器

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

注意對應關系

完整代碼

@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");
    }
}

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧

本文名稱:Cookie和Session-創新互聯
路徑分享:http://www.yijiale78.com/article10/pcido.html

成都網站建設公司_創新互聯,為您提供網頁設計公司響應式網站ChatGPT小程序開發電子商務網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

網站優化排名