Java中session存儲(chǔ)Users對(duì)象實(shí)現(xiàn)記住密碼
之前做過(guò)cookie實(shí)現(xiàn)記住密碼,這次換成session記住密碼又做了一遍,有很多收獲。
本次博客分為兩部分。一部分是cookie和session的區(qū)別(面試經(jīng)常被問(wèn)道);另一部分是sesion實(shí)現(xiàn)記住密碼,在Jsp頁(yè)面和Controller頁(yè)面的代碼編寫(xiě)。
一、cookie和session區(qū)別
區(qū)別:
1.cookie是瀏覽器端技術(shù);將數(shù)據(jù)保存到瀏覽器中,不安全;不可以保存中文保存時(shí)編碼: URLEncoder.encode();取值時(shí)解碼:URLDecoder.decode();。
2.session是服務(wù)器端技術(shù);將數(shù)據(jù)保存到服務(wù)器中,當(dāng)訪(fǎng)問(wèn)servlet時(shí),服務(wù)器創(chuàng)建session對(duì)象同時(shí)會(huì)向?yàn)g覽器寫(xiě)入一個(gè)sessionId保存到cookie中,當(dāng)瀏覽器關(guān)閉,session里面的數(shù)據(jù)沒(méi)有刪除,而是保存sessionId的cookie丟失因此找不到數(shù)據(jù),安全。
相同:
兩者作用范圍都是一次會(huì)話(huà)(瀏覽器開(kāi)啟到關(guān)閉)有效。
二、session實(shí)現(xiàn)記住密碼
分為3步。
1.jsp頁(yè)面布局
默認(rèn)rem選擇框是選中狀態(tài)
<form name="register" action="login.action" method="post"> <div class="form_row"> <label class="contact"><strong>Phone:</strong></label> <input type="text" class="contact_input" name="uPhone" id="uPhone" value="${param.uPhone }" onblur="phoneBlur(this.value);"/> <span id="uPhoneMsg"></span> </div> <div class="form_row"> <label class="contact"><strong>Pwd:</strong></label> <input type="text" class="contact_input" name="uPwd" id="uPwd"/> <span id="uPwdMsg">${flag }</span> </div> <div class="form_row"> <div class="terms"> <input type="checkbox" name="rem" id="rem" checked="checked">記住密碼 <!-- <input type="checkbox" name="terms" id="terms"/> Rember me --> </div> </div> <div class="form_row"> <input type="submit" class="register" value="login" /> </div> </form>
2.controller層邏輯處理
我的代碼有兩處用到session,這里只看第二處即可。
//2.登錄按鈕按下后 當(dāng)rem被選中,且密碼正確時(shí),將賬號(hào)密碼這個(gè)對(duì)象存入session
//5.1登錄 @RequestMapping("login") public String login(String uPhone,String uPwd,String rem,Model model,HttpServletResponse response,HttpServletRequest request){ HttpSession session = request.getSession(); String flag = "1"; String uId = us.selectUsersByPhone_PwdService(uPhone, uPwd); //判斷如果賬號(hào)密碼不存在 返回登錄頁(yè)面;存在,跳轉(zhuǎn)到首頁(yè) if(uId==null){ flag="密碼錯(cuò)誤"; request.setAttribute("flag", flag); return "register"; }else{ Users u1 = us.selectUsersByIdService(uId); //1.只要登錄成功 就將users對(duì)象存入session中,為之后的過(guò)濾器使用 session.setAttribute("handlerInterceptorSession", u1); //2.登錄按鈕按下后 當(dāng)rem被選中,且密碼正確時(shí),將賬號(hào)密碼存入session if(rem.equals("on")){ Users u2 = new Users(uPhone,uPwd); session.setAttribute("remSession", u2); } return "index"; } }
3.jsp頁(yè)面補(bǔ)充
這里主要看//5.當(dāng)光標(biāo)離開(kāi)后調(diào)用記住密碼的功能
邏輯是:用戶(hù)輸入賬號(hào)光標(biāo)離開(kāi)后,從session中取值,如果賬號(hào)在session中存在,則獲取賬號(hào)對(duì)應(yīng)的密碼,將密碼賦值給輸入框。(前提是:rem選擇框是選中狀態(tài),在1.jsp頁(yè)面布局里面就設(shè)置好了)
<script> function phoneBlur(uPhone){ var phoneMsg = document.getElementById("uPhoneMsg"); phoneMsg.innerText=""; $.ajax({ type:"post", url:"phoneExist.action", data:{"uPhone":uPhone}, dataType:"text", /* 當(dāng)flag =0 提示用戶(hù)不存在 當(dāng)flag = 1 普通用戶(hù) */ success:function(flag){ if(flag==0){ phoneMsg.innerText = "請(qǐng)先注冊(cè)"; } } }) //5.當(dāng)光標(biāo)離開(kāi)后調(diào)用記住密碼的功能 remPwd(uPhone); }; //5記住密碼 /*1.當(dāng)phone光標(biāo)離開(kāi)后 當(dāng)rem被選中 從Remsession里面遍歷,獲取賬號(hào)對(duì)應(yīng)的密碼。 */ //alert($("#rem").val()); function remPwd(uPhone){ //每次進(jìn)入 密碼先清空 $("#uPwd").val(""); var remVal = $("#rem").val(); if(remVal=="on"){ //第一次登錄會(huì)報(bào)異常,所以加"" var sessionPhone= ${remSession.uPhone}+""; var sessionPwd= ${remSession.uPwd}+""; //當(dāng)賬號(hào)在session中可以查詢(xún)到,就將session中的密碼賦值給輸入框pwd if(sessionPhone==uPhone){ $("#uPwd").val(sessionPwd); } } } </script>
至此,session存儲(chǔ)Users對(duì)象實(shí)現(xiàn)記住密碼功能完畢,更多相關(guān)Java session記住密碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java中的session對(duì)象及其常用方法小結(jié)
- Java異常 Factory method''sqlSessionFactory''rew exception;ested exception is java.lang.NoSuchMethodError:
- Java Web會(huì)話(huà)技術(shù)Session的簡(jiǎn)單使用
- 詳解Java分布式系統(tǒng)中session一致性問(wèn)題
- Java分布式session存儲(chǔ)解決方案圖解
- Java Session驗(yàn)證碼案例代碼實(shí)例解析
- 詳解Java分布式Session共享解決方案
- Java Hibernate使用SessionFactory創(chuàng)建Session案例詳解
相關(guān)文章
Java深入探索線(xiàn)程安全和線(xiàn)程通信的特性
這篇文章主要介紹了Java線(xiàn)程安全和線(xiàn)程通信的特性,線(xiàn)程安全是多線(xiàn)程編程時(shí)的計(jì)算機(jī)程序代碼中的一個(gè)概念。在擁有共享數(shù)據(jù)的多條線(xiàn)程并行執(zhí)行的程序中,線(xiàn)程安全的代碼會(huì)通過(guò)同步機(jī)制保證各個(gè)線(xiàn)程都可以正常且正確的執(zhí)行,不會(huì)出現(xiàn)數(shù)據(jù)污染等意外情況2022-05-05手?jǐn)]一個(gè) spring-boot-starter的全過(guò)程
這篇文章主要介紹了手?jǐn)]一個(gè) spring-boot-starter的全過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié)
這篇文章主要介紹了Java Swing最詳細(xì)基礎(chǔ)知識(shí)總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)Java Swing的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05解決springboot 獲取form-data里的file文件的問(wèn)題
這篇文章主要介紹了解決springboot 獲取form-data里的file文件的問(wèn)題的相關(guān)資料,這里提供了詳細(xì)的解決步驟,需要的朋友可以參考下2017-07-07maven繼承父工程統(tǒng)一版本號(hào)的實(shí)現(xiàn)
這篇文章主要介紹了maven繼承父工程統(tǒng)一版本號(hào)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08使用idea創(chuàng)建web框架和配置struts的方法詳解
這篇文章主要介紹了使用idea創(chuàng)建web框架和配置struts的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09java程序員如何編寫(xiě)更好的單元測(cè)試的7個(gè)技巧
測(cè)試是開(kāi)發(fā)的一個(gè)非常重要的方面,可以在很大程度上決定一個(gè)應(yīng)用程序的命運(yùn)。良好的測(cè)試可以在早期捕獲導(dǎo)致應(yīng)用程序崩潰的問(wèn)題,但較差的測(cè)試往往總是導(dǎo)致故障和停機(jī)。本文主要介紹java程序員編寫(xiě)更好的單元測(cè)試的7個(gè)技巧。下面跟著小編一起來(lái)看下吧2017-03-03解決工具接口調(diào)用報(bào)錯(cuò):error:Unsupported Media Type問(wèn)題
當(dāng)遇到"UnsupportedMediaType"錯(cuò)誤時(shí),意味著HTTP請(qǐng)求的Content-Type與服務(wù)器期望的不匹配,比如服務(wù)器期待接收J(rèn)SON格式數(shù)據(jù),而發(fā)送了純文本格式,常見(jiàn)的Content-Type類(lèi)型包括text/html、application/json、multipart/form-data等2024-10-10Springboot Redis設(shè)置key前綴的方法步驟
這篇文章主要介紹了Springboot Redis設(shè)置key前綴的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換
這篇文章主要介紹了基于Java實(shí)現(xiàn)文件和base64字符串轉(zhuǎn)換,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01