最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java全面細(xì)致講解Cookie與Session及kaptcha驗(yàn)證碼的使用

 更新時(shí)間:2022年06月18日 11:05:16   作者:蘇瞳吶  
web開發(fā)階段我們主要是瀏覽器和服務(wù)器之間來(lái)進(jìn)行交互。瀏覽器和服務(wù)器之間的交互就像人和人之間進(jìn)行交流一樣,但是對(duì)于機(jī)器來(lái)說(shuō),在一次請(qǐng)求之間只是會(huì)攜帶著本次請(qǐng)求的數(shù)據(jù)的,但是可能多次請(qǐng)求之間是會(huì)有聯(lián)系的,所以提供了會(huì)話機(jī)制

Cookie

1. 概念

是服務(wù)器通知客戶端保存鍵值對(duì)的一種技術(shù)。

cookie 是 servlet(服務(wù)器) 發(fā)送到 Web 瀏覽器(客戶端)的少量信息,這些信息由瀏覽器保存,然后發(fā)送回服務(wù)器。

客戶端有了 cookie 后,每次請(qǐng)求都發(fā)送給服務(wù)器

每個(gè) cookie 的大小不能超過(guò) 4 KB。

2. 創(chuàng)建Cookie

protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    //1. 創(chuàng)建Cookie對(duì)象
    Cookie cookie = new Cookie("key1", "value1");
    //2. 通知客戶端保存
    resp.addCookie(cookie);
    resp.getWriter().write("Cookie創(chuàng)建成功");
}

3. 服務(wù)器獲取Cookie

protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie : cookies) {
        //System.out.println(cookie);
        resp.getWriter().write("Cookie["+ cookie.getName() + " = " + cookie.getValue() + "] <br/>");
    }
    // 查找特定的Cookie  (項(xiàng)目中會(huì)把這個(gè)寫成工具類)
    Cookie need = null;
    for (Cookie cookie : cookies) {
        if ("key2".equals(cookie.getName())) {
            need = cookie;
            break;
        }
    }
    if (need != null) { // 不等于null,說(shuō)明賦過(guò)值
        resp.getWriter().write("找到了需要的Cookie");
    }
}

CookieUtils.java

// 查找特定的Cookie
public static Cookie findCookie(Cookie[] cookies, String name) {
    if (cookies == null || name == null || cookies.length == 0) {
        return null;
    }
    for (Cookie cookie : cookies) {
        if (name.equals(cookie.getName())) {
            return cookie;
        }
    }
    return null;
}

4. Cookie的修改

protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) {
    // 第一種
    // 修改需要先創(chuàng)建同key的Cookie對(duì)象,新值直接構(gòu)造傳入就行
    Cookie newCookie1 = new Cookie("key1", "newValue1"); 
    resp.addCookie(newCookie1); // 保存修改
    // 第二種
    Cookie newCookie2 = CookieUtils.findCookie(req.getCookies(), "key2");
    if (newCookie2 != null) {
        newCookie2.setValue("newValue2"); // !注意不支持中文和一些符號(hào),需要的話可以使用BASE64編碼
        resp.addCookie(newCookie2);
    }
}

5. Cookie的生命控制

Cookie的生命控制,即Cookie什么時(shí)候銷毀

API:setMaxAge(int expiry)

  • 正值表示 cookie 將在經(jīng)過(guò)該值表示的秒數(shù)后過(guò)期 (關(guān)閉瀏覽器再次訪問(wèn)還在)
  • 負(fù)值意味著 cookie 不會(huì)被持久存儲(chǔ),將在 Web 瀏覽器退出時(shí)刪除 (默認(rèn)是負(fù)數(shù),-1)
  • 0 值表示馬上刪除 cookie。

修改后記得 resp.addCookie(cookie);

6. Cookie的有效路徑Path

有效路徑Path 可以過(guò)濾哪些Cookie可以發(fā)送給服務(wù)器,那些不發(fā)。

Path是通過(guò)請(qǐng)求的地址來(lái)進(jìn)行有效的過(guò)濾

例如:

cookie1 path=/工程路徑

cookie2 path=/工程路徑/abc

請(qǐng)求地址: (默認(rèn)是當(dāng)前的工程路徑)

http://ip:port/工程路徑/a.html 則cookie1會(huì)發(fā)送給服務(wù)器,cookie2不發(fā)送

http://ip:port/工程路徑/abc/d.html cookie2,cookie1都發(fā)送!!

Cookie cookie = new Cookie("path1", "path1");
cookie.setPath(req.getContextPath() + "/abc"); //  ->  /工程路徑/abc

7. Cookie應(yīng)用-免用戶名密碼登錄

前端:login.jsp

<form action="/dynamicobject/loginServlet" method="post">
    用戶名: <input type="text" name="username" value="${cookie.username.value}"> <br/>
    密碼: <input type="password" name="password" value="${cookie.password.value}"> <br/>
    <input type="submit" value="登錄">
</form>

后端:LoginServlet.java

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        // 這里可以去數(shù)據(jù)庫(kù)查找,我們這里寫死了
        if ("sutong".equals(username) && "123456".equals(password)) {
            Cookie c1 = new Cookie("username", username);
            c1.setMaxAge(60 * 60 * 24 * 7); // 一周內(nèi)有效
            resp.addCookie(c1);
            Cookie c2 = new Cookie("password", password); // 一般密碼都會(huì)加密的
            c2.setMaxAge(60 * 60 * 24 * 7);
            resp.addCookie(c2);
            System.out.println("登陸成功!");
        } else {
            System.out.println("登陸失??!");
        }
    }
}

Session

1. 概念

Session是一個(gè)接口(HttpSession),就是會(huì)話。

用來(lái)維護(hù)一個(gè)客戶端和服務(wù)器之間關(guān)聯(lián)的一種技術(shù)。

每個(gè)客戶端都有它自己的一個(gè)Session。

Session會(huì)話中,我們經(jīng)常用來(lái)保存用戶登錄之后的信息。

2. 創(chuàng)建和獲取Session

創(chuàng)建和獲取都是一個(gè)函數(shù) request.getSession()

第一次調(diào)用是創(chuàng)建Session,之后調(diào)用都是獲取前面創(chuàng)建好的Sesson會(huì)話對(duì)象

isNew() : 判斷是不是剛創(chuàng)建出來(lái)的(是不是新的)

getId() : 每個(gè)會(huì)話都會(huì)有個(gè)唯一id值

protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    req.setCharacterEncoding("utf-8");
    resp.setContentType("text/html;charset=utf-8");
    HttpSession session = req.getSession(); // 創(chuàng)建或獲取Session
    boolean flag = session.isNew(); // 判斷是否剛創(chuàng)建
    String id = session.getId(); // id
    resp.getWriter().write("得到的Session的Id是" + id + "<br/>");
    resp.getWriter().write("這個(gè)Session是否剛創(chuàng)建" + flag);
}

3. Session域數(shù)據(jù)的存取

存取:

HttpSession session = req.getSession();
session.setAttribute("key1", "value1");

獲?。?/p>

String att = (String) req.getSession().getAttribute("key1");  // 返回的是Object

4. Session的生命周期的控制

API:public void setMaxInactiveInterval(int interval)

設(shè)置Session的超時(shí)時(shí)間(秒為單位),超過(guò)時(shí)長(zhǎng)就會(huì)被銷毀(是最大不活躍間隔!)

正數(shù)是超時(shí)時(shí)長(zhǎng),負(fù)數(shù)是永不超時(shí)。注意:0不是立即銷毀,立即銷毀是session.invalidate()

獲取方法:public int getMaxInactiveInterval()

默認(rèn)是1800秒,即半小時(shí)。

因?yàn)樵赥omcat的服務(wù)器的配置文件web.xml中,有寫<session-timeout>30</session-timeout>

如果我希望我們工程的Session不想是30分鐘,可以在自己項(xiàng)目下的web.xml做以上相同的配置,就可以修改工程下所有Session的默認(rèn)超時(shí)時(shí)長(zhǎng)了。

<session-config>
    <session-timeout>20</session-timeout> <!-- 分鐘為單位-->
</session-config>

如果只想修改個(gè)別Session的超時(shí)時(shí)長(zhǎng),則需要使用session.setMaxInactiveInterval(interval) 方法

超時(shí)時(shí)長(zhǎng):指的是客戶端兩次請(qǐng)求的最大間隔時(shí)長(zhǎng)??!

5. 瀏覽器和Session的關(guān)聯(lián)

當(dāng)客戶端沒有Cookie信息的時(shí)候,發(fā)送請(qǐng)求,服務(wù)器會(huì)(調(diào)用req.getSession())創(chuàng)建Session對(duì)象,每次創(chuàng)建Session會(huì)話的時(shí)候,都會(huì)創(chuàng)建一個(gè)Cookie對(duì)象,這個(gè)Cookie對(duì)象的key永遠(yuǎn)是:JSESSIONID,value是新創(chuàng)建出來(lái)的Session的Id。然后通過(guò)響應(yīng)頭返回給客戶端。

當(dāng)客戶端有了這個(gè)Cookie之后,每次請(qǐng)求會(huì)把Session的Id以Cookie的形式發(fā)送給服務(wù)器,然后服務(wù)器這邊會(huì)通過(guò)Id查找自己之前創(chuàng)建好的Session對(duì)象(調(diào)用req.getSession()),并返回。

如果上次創(chuàng)建的Session的沒過(guò)期的時(shí)候,我們手動(dòng)把Cookie信息刪掉的話,服務(wù)器就沒法通過(guò)得到id,就沒法找到之前的那個(gè)Session對(duì)象,客戶端發(fā)送請(qǐng)求的時(shí)候,服務(wù)器則會(huì)重新創(chuàng)建新的Session會(huì)話,重復(fù)上面的操作。

Session 技術(shù),底層其實(shí)是基于 Cookie 技術(shù)來(lái)實(shí)現(xiàn)的

kaptcha驗(yàn)證碼

驗(yàn)證碼可以解決表單重復(fù)提交的情況

1. 使用

我們可以使用第三方的jar包,谷歌驗(yàn)證碼,kaptcha-2.3.2.jar

  • 導(dǎo)包
  • 在 web.xml 中去配置用于生成驗(yàn)證碼的Servlet程序 (即com.google.code.kaptcha.servlet.KaptchaServlet這個(gè)類,谷歌寫的)
<servlet>
    <servlet-name>KaptchaServlet</servlet-name>
    <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>KaptchaServlet</servlet-name>
    <!-- 注意這里改的訪問(wèn)名(看起來(lái)像個(gè)圖片),這樣的話訪問(wèn)這個(gè)就是自動(dòng)生成驗(yàn)證碼和圖片,并保存到Session域--> 
    <url-pattern>/kaptcha.jpg</url-pattern> 
</servlet-mapping>

在表單中使用 img標(biāo)簽去顯示驗(yàn)證碼并使用它

<form action="" method="post">
    用戶名:<input type="text" name="username"> <br/>
    密碼:<input type="password" name="password"> <br/>
    驗(yàn)證碼:<input type="text" name="code"> <br/>
    <img id="code_img" src="http://localhost:8080/book/kaptcha.jpg" alt="圖片找不到"> <br/>
    <input type="button" value="注冊(cè)">
</form>

在服務(wù)器獲取谷歌生成的驗(yàn)證碼和客戶端發(fā)來(lái)的驗(yàn)證碼比較使用 (獲取后記得馬上刪除)

獲取谷歌生成的驗(yàn)證碼 :req.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);

獲取用戶提交的驗(yàn)證碼:req.getSession().getAttribute("code")

2. 驗(yàn)證碼的切換

// 給驗(yàn)證碼圖片綁定單機(jī)事件
$("#code_img").click(function () {
    // 但這樣每次發(fā)一樣的請(qǐng)求,可能會(huì)被瀏覽器的緩存導(dǎo)致驗(yàn)證碼無(wú)法改變,
    // 緩存是根據(jù)工程名后面的資源名和參數(shù)產(chǎn)生的,所以我們可以在后面加上一個(gè)隨機(jī)的參數(shù)跳過(guò)緩存
	//this.src = "http://localhost:8080/book/kaptcha.jpg"; 
    this.src = "http://localhost:8080/book/kaptcha.jpg?d=" + new Date(); // 可以加個(gè)時(shí)間戳
});

到此這篇關(guān)于Java全面細(xì)致講解Cookie與Session及kaptcha驗(yàn)證碼的使用的文章就介紹到這了,更多相關(guān)Java Cookie Session kaptcha內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹的實(shí)現(xiàn)方法詳解

    Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹的實(shí)現(xiàn)方法詳解

    這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)中關(guān)于AVL樹的實(shí)現(xiàn)方法,AVL樹是高度平衡的二叉樹,它的特點(diǎn)是AVL樹中任何節(jié)點(diǎn)的兩個(gè)子樹的高度最大差別為1,本文主要給大家介紹了Java語(yǔ)言如何實(shí)現(xiàn)AVL樹,需要的朋友可以參考下
    2024-02-02
  • SpringBoot返回中文亂碼問(wèn)題解決方法匯總

    SpringBoot返回中文亂碼問(wèn)題解決方法匯總

    這幾天在使用Spring Boot學(xué)習(xí)AOP原理的時(shí)候,通過(guò)瀏覽器訪問(wèn)后端接口的時(shí)候,響應(yīng)報(bào)文總是出現(xiàn)中文亂碼問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于SpringBoot返回中文亂碼問(wèn)題解決方法,需要的朋友可以參考下
    2023-06-06
  • 教你如何在 javadoc 輸出<> 符號(hào)

    教你如何在 javadoc 輸出<> 符號(hào)

    在 javadoc 輸出 <> 兩個(gè)符號(hào),直接使用會(huì)提示錯(cuò)誤,今天通過(guò)本文教大家如何在 javadoc 輸出<> 符號(hào),需要的朋友可以參考下
    2023-05-05
  • spring AOP的Around增強(qiáng)實(shí)現(xiàn)方法分析

    spring AOP的Around增強(qiáng)實(shí)現(xiàn)方法分析

    這篇文章主要介紹了spring AOP的Around增強(qiáng)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了spring面向切面AOP的Around增強(qiáng)具體步驟與相關(guān)操作方法,需要的朋友可以參考下
    2020-01-01
  • Java接收text/event-stream格式數(shù)據(jù)的詳細(xì)代碼

    Java接收text/event-stream格式數(shù)據(jù)的詳細(xì)代碼

    這篇文章主要介紹了java接收text/event-stream格式數(shù)據(jù),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • 解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問(wèn)題

    解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問(wèn)題

    這篇文章主要介紹了解決eclipse啟動(dòng)tomcat時(shí)不能加載web項(xiàng)目的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Spring?Batch批處理框架操作指南

    Spring?Batch批處理框架操作指南

    Spring?Batch?是?Spring?提供的一個(gè)數(shù)據(jù)處理框架。企業(yè)域中的許多應(yīng)用程序需要批量處理才能在關(guān)鍵任務(wù)環(huán)境中執(zhí)行業(yè)務(wù)操作,這篇文章主要介紹了Spring?Batch批處理框架操作指南,需要的朋友可以參考下
    2022-07-07
  • 一名Java高級(jí)工程師需要學(xué)什么?

    一名Java高級(jí)工程師需要學(xué)什么?

    作為一名Java高級(jí)工程師需要學(xué)什么?如何成為一名合格的工程師,這篇文章給了你較為詳細(xì)的答案,需要的朋友可以參考下
    2017-08-08
  • Java面試題沖刺第三十天--數(shù)據(jù)庫(kù)(6)

    Java面試題沖刺第三十天--數(shù)據(jù)庫(kù)(6)

    這篇文章主要為大家分享了最有價(jià)值的三道關(guān)于數(shù)據(jù)庫(kù)的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 原生Java操作兔子隊(duì)列RabbitMQ

    原生Java操作兔子隊(duì)列RabbitMQ

    這篇文章主要介紹了原生Java操作兔子隊(duì)列RabbitMQ,MQ全稱為Message?Queue,即消息隊(duì)列,“消息隊(duì)列”是在消息的傳輸過(guò)程中保存消息的容器,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

广东省| 东阳市| 嘉荫县| 吴桥县| 宁阳县| 新晃| 建阳市| 海南省| 东山县| 冕宁县| 株洲县| 宁乡县| 四川省| 莫力| 烟台市| 正镶白旗| 深泽县| 德钦县| 甘孜县| 宁夏| 博湖县| 正定县| 久治县| 石渠县| 托里县| 西安市| 阜平县| 阳泉市| 山西省| 张北县| 叶城县| 庆城县| 商水县| 永修县| 麦盖提县| 高雄市| 鄂伦春自治旗| 嘉峪关市| 盖州市| 三江| 玉门市|