目錄
創(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
當(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 是瀏覽器在本地持久化保存數(shù)據(jù)的一種方案
一個(gè)典型的使用方式,存儲(chǔ)登錄信息
在Servlet中也專門(mén)提供了相關(guān)的Api,讓我們來(lái)操作Cookie和Session
方法 | 描述 |
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ì) |
方法 | 描述 |
void addCookie(Cookie cookie) | 返回響應(yīng),你想給瀏覽器返回哪些cookie,都可以通過(guò)這個(gè)方法來(lái)添加 在這里添加的鍵值對(duì),都會(huì)體現(xiàn)在Http響應(yīng)報(bào)文的SetCookie字段上 |
方法 | 描述 |
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ì)話 |
方法 | 描述 |
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)系
構(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ù)器
方法 | 描述 |
Part getPart(String name) | 獲取請(qǐng)求中給定 name 的文件 |
Collection | 獲取所有的文件 |
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)