Servlet學習筆記

簡介

瀏覽器請求處理流程:瀏覽器發請求?=> 服務器tomcat(?=> 應用程序 ( => servlet) )

Servlet應用的三大作用域:requestsessionapplication

tomcat存放項目的層級結構

注釋:servlet原引用包名 javax.servlet,2017年,被oracle把servlet捐給了eclipse基金會,不讓使用java包名,tomcat10之后,servlet的包名更名為jakarta.servlet。

1. Web.xml(配置)

配置的加載順序: ServletContext> context-param > listener > filter > servlet

web-app 根標簽:xmlns:xsi 命名空間實例,xmlns xml文檔位置,xsi:schemaLocation 模式位置

1.1 應用名稱

應用名稱:display-name // 不影響程序執行,可省略不寫(非必須)

1.2 應用描述

應用描述:description // 不影響程序執行,可省略不寫(非必須)

1.3 配置上下文參數

(1) 上下文參數:context-param // 可以配置多個或不寫,用于程序啟動時獲取全局變量。

(2) 參數名:context-name

(3) 參數值:context-value // 值也可以是配置文件,默認在WEB-INFO下讀取,配置到其他路徑<param-value>classpath*:META-INF/xx.xml</param-value>?

1.4 配置監聽器

(1) 監聽器:listener // 監聽全局,會話,請求,的創建銷毀與域對象的變更

(2) 監聽處理類:listener-class

1.5 配置過濾器

(1) 過濾器:filter

(2) 過濾器名:filter-name

(3) 過濾器類:filter-class

(4) 過濾器參數:init-param, param-name, param-value

(5) 過濾器配置:filter-mapping

(6) 過濾器過濾路徑:url-pattern //?匹配的是url名稱與資源是否存在無關。

(7) 過濾攔截器名:servlet-name?// web.xml只能攔截web.xml配置的servlet名,注解servlet攔不住

(8) 過濾器訪問權限:dispatcher

注釋:dispatcher配置:REQUEST(過濾器應用于來自客戶端的請求), INCLUDE(應用于RequestDispatcher的include請求), FORWARD(應用于RequestDispatcher的forward請求), ERROR(應用于發生錯誤引起的轉發請求)

1.6 配置處理器

(1) 處理器:servlet

(2) 處理器名:servlet-name

(3) 處理器類:servlet-class

(4) 處理器參數:init-param, param-name, param-value

(5) 處理器加載順:load-on-startup // 不寫或負數首次訪問加載,0-10由小到大加載

(6) 處理器配置:servlet-mapping

(7) 處理器處理路徑:url-pattern

1.7 配置會話

(1) 會話配置:session-config

(2) 會話超時時間:session-timeout // 單位分鐘,負數或0永久有效。

注釋:應用web.xml不設置默認執行的是tomcat的配置30分鐘會話超時。

1.8 配置文件后綴

(1) 配置MIME:mime-mapping

(2) 文件后綴:extension?

(3) 傳送方式:mime-type

注釋:當瀏覽器訪問服務器的文件時,根據文件后綴匹配extension找到mime-type,以該方式將文件傳輸給瀏覽器。text/plain和text/html是瀏覽器可識別直接能打開的類型。瀏覽器不識別的類型會下載該文件。tomcat默認配置了大部分類型的文件,應用內配置mime主要用于自定義文件后綴的識別。***注意修改mime-mapping配置后需要清空瀏覽器緩存才會生效

1.9 配置歡迎頁

(1) 歡迎頁列表:welcome-file-list? // 默認歡迎頁,不指定servlet請求的默認顯示頁面

(2) 歡迎頁:?welcome-file // 配置默認顯示頁面,按定義的先后順序,執行優先級表示

注釋:不配置默認找 webapp根目錄下的 index.html 沒有則找 index.jsp,還沒有報404錯誤

1.10 配置異常處理

(1) 異常配置:error-page

(2) 錯誤碼:error-code //?404,配置錯誤碼,攔截錯誤或response.sendError返回的錯誤碼

(3) 異常類:exception-type //?異常類配置

(4) 異常處理頁面:location //? 值 /xxx.jsp,/servlet? 要跳轉的頁面或請求

注釋:jsp配置的是單個頁面的錯誤頁,優先級高。web.xml配置的是整個應用的錯誤頁。

java.lang.Throwable是異常的根類,location必須以/開頭,代表應用根目錄?

1.11 配置JSP設置

詳細在下一個jsp筆記中記錄

jsp-config

? taglib

? jsp-property-group

? ? description 設置說明

? ? display-name 設定名稱

? ? url-pattern 影響范圍 例如:*.jsp

? ? el-ignored (true 不支持el , false 支持el)

? ? scripting-invalid (true 不支持腳本 <% src.. %>

? ? page-encoding (jsp網頁編碼 例如:GBK)

? ? include-prelude (jsp網頁頭)

? ? include-coda (jsp網頁結尾)

2. 全局應用(application)

Web容器(tomcat)啟動時為每個web應用創建唯一的ServletContext實例

2.1 獲取ServletContext方式

(1)?request.getServletContext() //?Servlet,GenericServlet,HttpServlet,JSP

(2) request.getSession().getServletContext() //?HttpServlet,JSP

(3) getServletConfig().getServletContext() //?Servlet,GenericServlet,HttpServlet,JSP

(4) getServletContext() // GenericServlet,HttpServlet,JSP

?

2.2?獲取Context-Param的值

(1) 獲取參數value值:servletContext.getInitParameter("param1");

(2) 獲取全部name值:servletContext.getInitParameterNames();

2.3 ServletContext域對象

(1) 獲取全局域對象值:servletContext.getAttribute("key")

(2) 設置全局域對象值:servletContext.setAttribute("key","value")

(3) 刪除全局域對象值:servletContext.removeAttribute("key");

(4) 獲取全局域對象名:servletContext.getAttributeNames();

2.4?ServletContext轉發?

全局轉發:context.getRequestDispatcher("/WEB-INF/JSP/xx.jsp").forward(request, response);? // 省略了/應用名,只能轉本應用下 /開頭的應用根目錄請求,不能跨應用。與請求轉發不同必須以/開頭。

2.5?獲取配置文件內容

(1) 新建配置對象:Properties pro = new Properties();

(2) 取得ServletContext:ServletContext context = getServletContext();

(3) 取得文件流:InputStream in = context.getResourceAsStream("/WEB-INF/test.properties");

(4) 加載配置文件數據:pro.load(in);

(5) 關閉文件流:in.close();

(6) 取得配置文件內容:String name = (String)pro.getProperty("username");

2.6 ServletContext方法

(1) 獲取應用請求路徑:servletContext.getContextPath(); // 獲取【/應用的請求】

(2) 獲取配置的項目名:servletContext.getServletContextName();?// 獲取應用名

(3) 獲取服務器名:servletContext.getServerInfo();?// 獲取 Apache Tomcat/版本號

(4) 獲取項目盤符:servletContext.getRealPath("/");?// 獲取 盤符:\路徑...\應用名\

(5) 略?

3. 監聽器(listener)

一共有8個監聽器接口,隨著技術變化只有ServletContextListener有用。

3.1 應用監聽器

(1) 監聽全局對象的創建與銷毀:ServletContextListener // 服務器啟動時創建,停止時銷毀

?(2) 監聽全局的域對象:ServletContextAttributeListener // 添加修改刪除全局域時觸發

3.2 請求監聽器

(1) 監聽請求的創建與銷毀:ServletRequestListener // 請求開始創建,請求結束銷毀

(2) 監聽請求的域對象:ServletRequestAttributeListener // 添加修改刪除請求域時觸發

3.3 會話監聽器

(1) 監聽會話的創建與銷毀:HttpSessionListener // 首次請求后創建,超時或退出銷毀

(2) 監聽會話的域對象:HttpSessionAttributeListener // 添加修改刪除會話域時觸發

(3) HttpSessionActivationListener

(4) HttpSessionBindingListener?

3.4 注解配置listener

(1) 注解配置:@WebListener

4.?過濾器(filter)

在后端處理請求之前攔截請求,在響應返回瀏覽器之前處理響應

4.1 創建過濾器

創建filter步驟:(1)實現filter接口,(2)重寫dofilter方法,(3)配置xml文件

4.1.1 實現Filter接口

需重寫doFilter方法

(1) 實現init方法:init?//?項目啟動加載方法初始化只調用1次,可獲取filterConfig

(2) 實現doFilter方法:doFilter //?(req, res, chain) 執行過濾chain.doFilter轉下一個過濾器處理

(3) 實現destroy方法:destroy // 項目停止時,執行。

4.1.2 繼承GenericFilter抽象類

GenericFilter實現了Filter接口,需重寫doFilter方法

(1) 初始化:init

(2) 獲取Filter名:getFilterName() // web.xml配置的filter-name

(3) 獲取全局對象:getServletContext()

(4) 獲取Filter對象:getFilterConfig()

(5) 獲取Filter參數名:filterConfig.getInitParameterNames()

(6) 獲取Filter參數值:filterConfig.getInitParameter("name")

4.1.3 繼承HttpFilter抽象類

HttpFilter繼承了GenericFilter,需重寫doFilter方法

(1) 執行過濾器:doFilter //?過濾器處理完,要繼續執行需要調用FilterChain的doFilter方法,不調用則不會執行后續filter或servlet,若過濾器攔截請求用return結束程序。

4.2 Filter執行順序

(1) 第一優先級:url-pattern // 【/*】【*.do】由配置順序從上到下先執行

(2) 第二優先級:servlet-name // 【web.xml配置的servlet-name】

4.3 注解配置Filter

執行優先級:urlPatterns或value【/*】【*.do】先執行,servlet-name后執行,

注釋:同級的多個urlPatterns的過濾器,可能是按文件名的先后順序執行的。

4.3.1 注解配置Filter的URL

(1) URL配置:@WebFilter(urlPatterns="/xxx")? // 等同于web.xml的<url-pattern>

(2) 默認屬性:@WebFilter(value="/xxx")? // value與urlPatterns 作用相同

(3) 省略屬性:@WebFilter("/xxx")? // 只有value一個屬性時可以省略屬性名

4.3.2 注解Filter的URL格式

(1) 多路徑攔截:@WebFilter({"/xxx/*", "*.do"}) // 可指定攔截多種路徑訪問

(2) 精確攔截:@WebFilter("/xxx/xx") // 多層目錄精確匹配

(3) 目錄攔截:@WebFilter("/xxx/*") // 結尾/*任意匹配

(4) 擴展名匹配:@WebFilter("*.do") // 【任意.do】訪問,前不加斜線

4.3.3 注解Filter的屬性

(1) filterName等同于配置文件 <filter-name>

(2) valuevalue與urlPatterns等同于配置文件 <url-pattern>

(3) initParams等同與配置文件 <init-param>

(4) servletNames// 指定過濾的servlet名,取web.xml或@WebServlet配置的servlet名

(5) dispatcherTypes等同于配置文件 <dispatcher>

注釋:@WebInitParam只能同 Webservlet 和WebFilter一起使用,只有name和value屬性

4.4 Filter案例

4.4.1 請求字符集過濾

處理請求之前,統一設定字符集

4.4.2 瀏覽器不緩存頁面過濾

4.4.3 請求資源過濾

設置允許訪問的資源

4.4.4 用戶登錄過濾

判斷用戶是否登錄,及登錄用戶訪問權限

5. 處理器(servlet)

5.1 創建Servlet

創建servlet步驟:(1)繼承Servlet接口,(2)重寫抽象方法,(3)web.xml配置Servlet

5.1.1?實現Servlet接口

(1) init請求后判斷沒有servlet對象,則實例化一個對象,進行初始化init,只執行一次。

(2) getServletConfig用于獲取servlet配置對象

(3) getServletInfo用于獲取servlet的參數信息

(4)?service瀏覽器發請求后(多次請求多次調用),創建req,res對象,開新線程,調用service

(5)?destroy容器(tomcat)正常關閉時銷毀處理,調用destroy

注釋:獲取ServletConfig的方式,1.init參數獲取,2.Servlet子類中getServletConfig()獲取

5.1.2 繼承GenericServlet類

(1) 實現service方法:service?//?處理請求,及響應?

5.1.3?繼承HttpServlet類

(1) 實現doGet方法:doGet // 處理get請求

(2) 實現doPost方法:doPost // 處理post請求

注釋:doPut處理put請求,doDelete處理delete請求,doHead:讀web頭,doOptions:查特點選項,doTrace:返回收到的請求

5.2 注解配置Servlet

Servlet3.0新增注解方式,無需配置servlet的web.xml文件,可不創建web.xml

5.2.1 注解配置Servlet的URL

(1) URL配置:@WebServlet(urlPatterns="/xxx")? // 等同于web.xml的<url-pattern>

(2) 默認屬性:@WebServlet(value="/xxx")? // value與urlPatterns 作用相同

(3) 省略屬性:@WebServlet("/xxx")? // 只有value一個屬性時可以省略屬性名

5.2.2 注解Servlet的URL格式

(1) 多路徑請求:@WebServlet({"/xxx", "/xxx"}) // 可指定多種路徑訪問

(2) 精確匹配:@WebServlet("/xxx/xx") // 多層目錄精確匹配

(3) 目錄匹配:@WebServlet("/xxx/*") // 結尾/*任意匹配

(4) 擴展名匹配:@WebServlet("*.do") // 【任意.do】訪問,前不加斜線

注釋:url=主機(www.xx.com) +程序名(/webxx) + 處理器名(/xxservlet])+方法(/xx.do])+參數(?xx=xx)。uri=程序+servlet+方法。

5.2.3 注解Servlet的屬性

(1) name等同于配置文件 <servlet-name>

(2) valuevalue與urlPatterns等同于配置文件 <url-pattern>

(3) initParams等同與配置文件 <init-param>

(4) loadOnStartup等同于配置文件 <load-on-startup>

注釋:@WebInitParam只能同 Webservlet 和WebFilter一起使用,只有name和value屬性

5.3. Servlet生命周期

(1) 實例和初始化:init

(2) 就緒:service

(3) 銷毀:destroy

6. 請求(request)

6.1 表單請求

6.1.1 發送請求方式

(1) url回車? get方式

(2) 超鏈接? get方式

(3) 表單提交submit, js, ajax) get, post 等

6.1.2 提交表單方式

(1) 表單按鈕提交:<input type="submit"> // 提交表單到form的action, 頁面會刷新

(2) 按鈕提交:<form> <button>提交</button> </form>? // form內的按鈕默認是提交按鈕

(3) JS事件提交:<input type="button" onClick="sub1"> <script> function sub1() { document.getElementById("formid").submit();</script>

(4) 修改form默認提交事件:頁面加載后 document.getElementById("formid").onSubmit = function () { ... this.submit(); }

(5) ajax提交:

6.2 請求方式

(1) GET:參數在url中,?發送文本有限制225字符以內,?不安全數據url可見(url可緩存)

(2) POST:參數在請求體中,發文本或二進制長度沒限制,相對安全url不可見(無緩存)

(3) PUT(4) DELETE(5) HEAD(6) OPTIONS(7) TRACE

注釋:connect保留?

6.3? http請求數據格式

6.3.1 http請求格式

(1) 請求行:請求方式? 請求uri? 請求協議/版本get /xxx.html http/1.1

(2) 請求頭(鍵:值):

(3) 請求空行

(4) 請求體:get沒有請求體。post請求, 封裝內容(name=value&name=value)格式

6.3.2 請求頭

? user-Agent:? ? ? ? // 瀏覽器及版本信息

? accept: text/html? //瀏覽器接收的MIME類型(text/heml, application/xhtml+html, */*)

? accept-language:zh-CN? //瀏覽器首選語言, 支持的語言環境

? accept-encoding:? ?// 客戶端處理編碼類型(gzip, )

? Referer: http:localhost/xx.html? // 告訴服務器請求來源,防止盜取鏈接,可統計來源信息

? Connection:? ?// 連接信息,是否鏈接狀態

? host:localhost:8080? //?服務器主機名和端口號

? cookie: 會話信息

? content-type:表單編碼類型(text/plain, multipart/form-data(上傳文件), application/x-www-form-urlencoded(默認格式))

6.4?處理請求(獲取請求數據)

服務器封裝請求的數據,作成request,response對象,傳給service方法處理。

6.4.1 獲取請求行

(1) 獲取客戶端主機名:servletRequest.getRemoteHost()

(2) 獲取客戶端IP:servletRequest.getRemoteAddr()

(3) 獲取客戶端端口號:servletRequest.getRemotePort()

(4) 獲取URL:httpServletRequest.getRequestURL()

(5) 獲取URI:httpServletRequest.getRequestURI()

(6) 獲取Servlet請求路徑:httpServletRequest.getServletPath()

(7) 獲取請求方式:httpServletRequest.getMethod()

過濾普通權限訪問管理路徑

6.4.2 獲取請求頭

(1) request.getHeader("key")

6.4.3 獲取post請求體

一般用不上這種方式

?(1) 獲取字符輸入流:BufferedReader r = request.getReader() // 只能操作字符數據

?(2) 獲取內容:String line = null;? while( (line=r.readLine() ) != null ) { ... } //line是&連接的參數,username=%E6%9D%8E%E5%9B%9B1&pwd=123&qx=0&ah=2&ah=3&zy=3

注釋:此解析不出中文?

6.4.4 獲取請求參數

(1) 獲取表單參數值:getParameter("name") // text,password,hidden,radio,select,textarea

(2) 獲取表單復數參數值:getParameterValues("name") //?checkbox, select(multiple可多選)

(3) 取表單的所有請求名:getParameterNames()?

(3) 取表單的所有鍵值對:getParameterMap()?

6.4.5?請求域對象

(1) 獲取請求域的值:request.getAttribute("key")

(2) 設置請求域的值:request.setAttribute("key", value)

(3) 刪除請求域的值:request.removeAttribute("key")

(4) 獲取請求域的名稱:request.getAttributeNames()

6.4.6 請求轉發

(1) 請求轉發:req.getRequestDispatcher("/WEB-INF/JSP/xx.jsp").forward(request, response);??

注釋:不能跨應用轉發,只能訪問當前應用內部項目資源,一次請求服務器內部轉發,Url顯示地址不變,/開頭表示應用根目錄,不以/開頭表示servlet或jsp同級目錄。

6.4.7 請求中文亂碼解決

(1) 獲取請求編碼:request.getCharacterEncoding()

(2) tomcat7及以下(get,post)通用解決方案:

String reqstr = request.getParameter("name").getBytes("iso8859-1");

String str = new String(reqstr, "utf-8");

(3) tomcat8解決方案:

get解決對策:tomcat8默認解決了get的亂碼問題

post解決對策: request.setCharacterEncodeing("UTF-8")

6.5 http協議

基于tcp/ip 端口80 一次請求一次響應,http無狀態,請求之間獨立。

版本 , 一次url訪問圖片,會產生多層請求,

版本1.0 每次請求建立新鏈接

版本1.1 復用鏈接

6.6 tcp協議

6.6.1 三次握手

第一次握手:SYN=1, seq=x(隨機)?//本地端口(50515) => 訪問服務器端口(80)

第二次握手:SYN=1, ACK=1 (1有效,0無效), ack=x+1, seq=y(隨機) // 服務器80=>本地50515

第三次握手:ACK=1, ack=y+1, seq=x+1 // 本地50515=>服務器80

注釋:本地=>服務器(我要訪問你, 我是x標識, 我可能有其他連接x1,x2,), 服務器=>本地(可以訪問, 我將你的x訪問標記為y, 要建立連接么), 本地=>服務器(我是x, 你通過y標識同意了我的請求,讓我們建立連接)

6.6.2 四次揮手

第一次揮手FIN=1, seq=U // 本地端口50515 => 服務器端口80

第二次揮手ACK=1, ack=U+1, seq=V // 80 => 50515

第三次揮手FIN=1, ack=U+1, ACK=1, seq=W // 80 => 50515?

第四次揮手:ACK=1, ack=W+1, seq=U+1 ?// 50515 => 80

注釋:本地=>服務器(我要斷開連接, 我是U), 服務器=>本地(我知道了, U你這次請求我標記為V, 等我會, 看看數據都給你傳完沒),服務器=>本地(U, 你的數據傳完了,你可以通過W來斷開連接,若沒收到第4步回復再次這個發送),本地=>服務器(我是U, 你標記為W的請求可以斷開了)

服務器發送探測報文,一般默認2小時,在應用層做心跳機制

7. 響應(response)

7.1 http響應

7.1.1 響應格式

(1) 狀態行:請求協議/版本? 狀態碼? 響應狀態HTTP/1.1 200 OK

(2) 響應頭(鍵:值):Date: sat 01 Aug 2023/10/25 23:52:59 GMT...Content-Type: text/html

(3) 響應空行

(4) 響應HTML:<html>...</html>

7.1.2 響應類型

(1) 響應類型:Content-Type //?設置服務器傳送給瀏覽器數據的類型(MIME是因特網標準,用于識別文本,圖片,聲音,視頻,程序專用數據等)

(2) 后端設置響應類型:res.setContenType("text/html; charset=UTF-8"); ?

(3) 設置下載文件名:res.setHeader("Content-Disposition", "attachment;filename="+file.getName());?// 當響應類型為下載文件時需要設置文件名

word文檔(application/msword)AcrobatPDF(application/pdf)Excel(application/vnd.ms-excel)ZIP文件(application/zip)gif圖片(image/gif)jpeg圖片(image/jpeg)html文檔(text/html)文本(text/plain)mpeg視頻(video/mpeg)midi音頻(audio/midi)

7.2 響應數據

字符流:res.getWriter().write("<html>xxx</html>"); // 返回html或字符數據

字符流:res.getWriter().print(97); // 返回html或字符數據,瀏覽器識別 ASCII為97的字符,顯示a

字節流:res.getOutputStream().write("<html>...".getBytes());// html或文本或二進制文件

字節流:res.getOutputStream().print(FileInputStream.read()...);// html或文本或二進制文件

7.3 響應中文亂碼

方案1:

(1) 設置服務器編碼:servletRes.setCharacterEncodeing("utf-8);?

(2) 設置客戶端編碼:httpRes.setHeader("content-type", "text/html;charset=utf-8")?

方案2:

(1) 同時設置服務器和客戶端編碼:servletRes.setContentType("text/html;charset=utf-8")?

7.4 重定向

res.sendRedirect("Servlet20.do"); // 不以/開頭為本應用目錄,直接訪問servlet

res.sendRedirect("/應用名/servlet"); // 以/開頭為tomcat服務器目錄,需指定應用名

res.sendRedirect("http://localhost:8080/應用名/servlet請求"); // 可重定向到其他網站

注釋:重定向不能在響應out.flush(提交)之后進行,重定向不能請求WEB-INF下資源

7.5 響應異常

?res.sendError(異常狀態碼) // 返回一個異常code, 可通過web.xml攔截該異常?

8. 會話(session)

http請求是無狀態的,跟蹤客戶端狀態有4種方式

1.session, 2 cookie 3 url重寫, 4隱藏表單域

8.1 獲取session

(1) 獲取session:HttpSession session = htttReq.getSession(); // 存在獲取,不存在創建

(2) 獲取session:httpReq.getSession(boolean); // true無對象則創建,false無對象返回null?

(2) 獲取Session標識:String id =session.getId(); // JSESSIONID服務器存在瀏覽器的sessionid,瀏覽器訪問不傳或者服務器沒有這個id則服務器新建sessionid傳給瀏覽器保存。

8.2 session域對象

(1) 獲取會話域的值:session.getAttribute("key")

(2) 設置會話域的值:session.setAttribute("key", value)

(3) 刪除會話域的值:session.removeAttribut("key")

(4) 獲取會話域所有名稱:session.getAttrabuteNames()

8.3 會話銷毀

8.3.1 設置會話超時時間

(1)?session.setMaxInactiveInterval(秒數); //負數和0當前會話永久有效,web.xml對所有會話有效

(2)?程序的web.xml文件

(3)?tomcat 的conf目錄下 web.xml文件

注釋:1.httpsession.set方法設置優先級最高,2 web.xml配置優先級第二,3tomcat conf 的web.xml配置最低

8.3.2 會話超時的方式

(1) 長時間不操作頁面則會話失效。//?根據配置的時間(默認30分鐘)操作后重新計時。

(2) 關閉瀏覽器 //?關閉瀏覽器會清除JSESSIONID, 下次請求就不會傳id, 相當于session失效。

(3)?立即銷毀:session.invalidate();

注釋:JSESSIONID存在cookie里,服務器返回 響應頭 set-Cookie: JSESSIONID = 123AB24C... (32位16進制)。客戶端訪問時,發送請求頭 Cookie: JSESSIONID = 123AB24C...

9. cookie

Cookie 是存儲在客戶端計算機上的文本信息。(包:javax.servlet.http.Cookie?)

(1) 服務器腳本向瀏覽器發送一組Cookie信息,瀏覽器將信息存在本地。

(2)?瀏覽器向服務器發送請求時,把本地Cookie信息一起發送給服務器,用來讓服務器識別用戶。

9.1 cookie創建設置獲取

(1) 新建cookie對象:Cookie cookie = new Cookie("key", "value");

(2) 獲取cookie名:cookie.getName(); // cookie名不可變更

(3) 獲取cookie值:cookie.getValue(name);

(4) 設置cookie值:cookie.setValue("");

(5) 向客服端發送:response.addCookie(cookie);

(6) 獲取cookie:Cookie[] cookies = request.getCookies(); // cookie只能從請求中獲取,無法單獨獲取某一個cookie,只能全部獲取if ( cookies != null && cookies.length > 0) {?? for (Cookie cookie : cookies) {...

7.2 cookie到期時間

(1) 關閉cookie失效:cookie.setMaxAge(-1)? // 默認-1 關閉瀏覽器cookie失效

(2) 設置cookie失效時間:cookie.setMaxAge(正數) // 單位秒,超時瀏覽器自動刪除該cookie

(3) 刪除cookie:?cookie.setMaxAge(0) //?0代表刪除cookie

7.3 cookie存儲中文信息

(1) 中文存儲:tomcat7的cookie不能存中文。tomcat8的cookie可以存中文,不能存空格等特殊符號。

(2) 中文及特殊符號存儲:URLEncoder.encode("這是 中文",Charset.forName("UTF-8"))

(3) 中文及特殊符號獲取:URLDecoder.decode(cookie.getValue(),"UTF-8")

7.4 cookie路徑

(1) 服務器cookie:cookie.setPath("/") // 當前服務器任意項目可獲取

(2) 應用cookie:cookie.setPath("/項目名") // 只有當前項目可獲取,默認設定。

(3) 請求cookie:cookie.setPath("/項目名/路徑") // 只有指定的請求或路徑可獲取

?7.4 cookie安全

(1) http傳送:cookie.setHttpOnly(true) // http傳送

(2) 加密傳送:cookie.setSecure(true) // https傳送

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/211390.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/211390.shtml
英文地址,請注明出處:http://en.pswp.cn/news/211390.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

卡爾曼濾波器

歡迎訪問我的博客首頁。 卡爾曼濾波器 1. 參考 1. 參考 卡爾曼濾波器&#xff0c;B 站&#xff0c;2020。擴展卡爾曼濾波器&#xff0c;CSDN&#xff0c;2023。

Git的安裝以及SSH配置

前言 近期工作需要&#xff0c;所以版本管理工具要用到Git&#xff0c;某些操作需要ssh進行操作&#xff0c;在某次操作中遇到&#xff1a;git bash報錯&#xff1a;Permission denied, please try again。經排查是ssh沒有配置我的key&#xff0c;所以就借著這篇文章整理了一下…

WorkPlus即時通訊,讓溝通零障礙!企業協作更高效

如今&#xff0c;隨著信息技術的快速發展&#xff0c;企業對于高效溝通和即時協作的需求也日益增長。在這個數字化時代&#xff0c;WorkPlus作為一款領先的企業級移動辦公平臺&#xff0c;以其強大的即時通訊功能和卓越的用戶體驗&#xff0c;成功為企業打造了高效溝通的新時代…

input = torch.randn(20, 2, 11, 11, 32)輸出形式

input torch.randn(20, 2, 11, 11, 32) m torch.nn.AdaptiveAvgPool3d((1,1, 32)) xm(input) print(x.shape) 結果&#xff1a; 也就是不用管批次和通道數

pico示波器使用

文章目錄 Pico示波器保存波形Pico示波器錄制數據Pico示波器解析CAN報文Pico示波器保存波形 Pico示波器可以通過以下步驟保存波形: 在示波器上選擇要保存的波形。連接示波器到計算機上,可以使用USB或者Ethernet連接。打開PicoScope軟件,選擇“File”菜單,然后選擇“Save As…

Python開發運維:Python垃圾回收機制

目錄 一、理論 1.Python垃圾回收機制 一、理論 1.Python垃圾回收機制 &#xff08;1&#xff09;引?計數器 1&#xff09;環狀雙向鏈表 refchain 在python程序中創建的任何對象都會放在refchain鏈表中。 name "david" age 20 hobby ["籃球",游泳…

放蘋果 .

把m個同樣的蘋果放在n個同樣的盤子里&#xff0c;允許有的盤子空著不放&#xff0c;問共有多少種不同的分法&#xff1f; 注意&#xff1a;如果有7個蘋果和3個盤子&#xff0c;&#xff08;5&#xff0c;1&#xff0c;1&#xff09;和&#xff08;1&#xff0c;5&#xff0c;1&…

spring集成mybatis簡單教程

首先說下實現了什么效果&#xff0c;就是不用每次查詢前手動創建 sessionFactory和添加datasource文件了。 整個工程結構是這樣的 這次我也把代碼放在了gitee上&#xff0c;方便大家更全貌的看到所有的實現細節。代碼鏈接如下&#xff1a; Java: 一些Java代碼 (gitee.com) …

大話數據結構-查找-多路查找樹

注&#xff1a;本文同步發布于稀土掘金。 7 多路查找樹 多路查找樹&#xff08;multi-way search tree&#xff09;&#xff0c;其每個結點的孩子可以多于兩個&#xff0c;且每一個結點處可以存儲多個元素。由于它是查找樹&#xff0c;所有元素之間存在某種特定的排序關系。 …

排序:歸并排序

目錄 歸并排序——有遞歸的&#xff1a; 基本思想&#xff1a; 思路分析&#xff1a; 代碼分析&#xff1a; 劃分區間思路&#xff1a; 代碼思路分析&#xff1a; 歸并排序——有遞歸的&#xff1a; 基本思想&#xff1a; 歸并排序&#xff08;MERGE-SORT&#xff…

2023 CCF中國軟件大會(CCF ChinaSoft)“軟件工程教育”論壇 成功召開

2023年12月1日&#xff0c;2023年度CCF中國軟件大會“軟件工程教育”論壇成功召開。 ? 自去年來大模型技術的出現以及在各個領域的應用&#xff0c;對相關的學科和行業產生了深刻的影響。軟件工程首當其沖&#xff0c;以ChatGpt和CopilotX等為代表的智能化開發工具可以幫助軟…

2024年網絡安全競賽-數字取證調查attack817

? 數字取證調查 (一)拓撲圖 服務器場景:FTPServer20221010(關閉鏈接) 服務器場景操作系統:未知 FTP用戶名:attack817密碼:attack817 分析attack.pcapng數據包文件,通過分析數據包attack.pcapng找出惡意用戶第一次訪問HTTP服務的數據包是第幾號,將該號數作為Flag值…

倪海廈:教你正確煮中藥,發揮最大藥效

同樣的一個湯劑&#xff0c;我開給你&#xff0c;你如果煮的方法不對&#xff0c;吃下去效果就沒那么好。 所以&#xff0c;湯&#xff0c;取它的迅捷&#xff0c;速度很快&#xff0c;煮湯的時候還有技巧&#xff0c;你喝湯料的時候&#xff0c;你到底是喝它的氣&#xff0c;…

RTMP流設置超時時間失敗

使用FFmpeg(版本是5.0.3&#xff09;將rtmp流作為輸入&#xff0c;設置超時時間&#xff08;使用-timeout參數&#xff09;&#xff0c;結果報錯&#xff1a;Cannot open Connection tcp://XXX:1935?listen&listen_timeout 通過./ffmpeg -help full 命令查看FFmpeg幫助&am…

Evidently:一個神奇的Python庫,機器學習必備!

Evidently 是一個面向數據科學家和機器學習工程師的開源 Python 庫。它有助于評估、測試和監控從驗證到生產的數據和 ML 模型。它適用于表格、文本數據和嵌入。 簡介 Evidently 是一個開源的 Python 工具&#xff0c;旨在幫助構建對機器學習模型的監控&#xff0c;以確保它們的…

2024年網絡安全競賽-A模塊任務解析報告單(詳細每一步)

2024年網絡安全競賽-A模塊任務 一、項目和任務描述: 假定你是某企業的網絡安全工程師,對于企業的服務器系統,根據任務要求確保各服務正常運行,并通過綜合運用登錄和密碼策略、流量完整性保護策略、事件監控策略、防火墻策略等多種安全策略來提升服務器系統的網絡安全防御能…

MyBatis參數獲取和傳遞

1、參數獲取方式 MyBatis可以通過以下兩種方式獲取參數值: #{變量名} 本質是占位符賦值 ${變量名} 本質是字符串拼接&#xff0c;如果拼接的是字符串類型或日期類型&#xff0c;則需要手動添加單引號 2、參數獲取的幾種情況&#xff1a; 2.1 mapper接口方法的參數為單個字…

判斷一個Series序列的值是否為單調遞減Series.is_monotonic_decreasing

【小白從小學Python、C、Java】 【計算機等考500強證書考研】 【Python-數據分析】 判斷一個Series序列中 各值是否單調遞減 s.is_monotonic_decreasing [太陽]選擇題 以下代碼的輸出結果中正確的是? import pandas as pd s1 pd.Series([3,2,1]) s2 pd.Series([3,2,4]) pri…

【代碼隨想錄】算法訓練計劃41

dp 1、343. 整數拆分 題目&#xff1a; 給定一個正整數 n &#xff0c;將其拆分為 k 個 正整數 的和&#xff08; k > 2 &#xff09;&#xff0c;并使這些整數的乘積最大化。 返回 你可以獲得的最大乘積 。 輸入: n 10 輸出: 36 解釋: 10 3 3 4, 3 3 4 36。 思路…

Kotlin Flow 操作符

前言 Kotlin 擁有函數式編程的能力&#xff0c;使用Kotlin開發&#xff0c;可以簡化開發代碼&#xff0c;層次清晰&#xff0c;利于閱讀。 然而Kotlin擁有操作符很多&#xff0c;其中就包括了flow。Kotlin Flow 如此受歡迎大部分歸功于其豐富、簡潔的操作符&#xff0c;巧妙使…