前言
Cookie:cookie是客戶端技術,程序把每個用戶的數(shù)據(jù)以cookie的形式寫給用戶各自的瀏覽器。
當用戶使用瀏覽器再去訪問服務器中的web資源時,就會帶著各自的數(shù)據(jù)區(qū),這樣,web資源處理的就是各自的數(shù)據(jù)了。
Session:session是服務器端技術,利用session技術,服務器在運行時可以為每一個用戶的瀏覽器創(chuàng)建其獨享的session對象,由于session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時,可以把各自的數(shù)據(jù)放在session中,當用戶再次去訪問服務器中的其他web資源時,其他web資源再從用戶各自的session
取出數(shù)據(jù)為用戶服務。
Session和Cookie的主要區(qū)別:
- Cookie是把用戶的數(shù)據(jù)寫給用戶的瀏覽器
- Session技術把用戶的數(shù)據(jù)寫到用戶獨占的session中。
- Session對象由服務器創(chuàng)建,開發(fā)人員可以調(diào)用request對象的getSession方法得到session對象。
我們常常通過Session來存儲用戶的部分登陸信息來驗證用戶是否在線,這應該時最容易實現(xiàn)的一種Web端方案,本文以SSM(Spring、SpringMVC、myBatis)框架為載體,來具體實現(xiàn)這套登陸系統(tǒng)。
方法如下:
1.通過前端傳遞用戶名密碼到后端接口,接口拿到值后,對其進行 MD5 加密,與數(shù)據(jù)庫中的字段進行比較,返回狀態(tài)給前端,前端根據(jù)返回值進行頁面跳轉(zhuǎn)。
MD5加密工具類
1
2
3
4
5
6
7
8
|
public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{ //確定計算方法 MessageDigest md5=MessageDigest.getInstance( "MD5" ); BASE64Encoder base64en = new BASE64Encoder(); //加密后的字符串 String newstr=base64en.encode(md5.digest(str.getBytes( "utf-8" ))); return newstr; } |
DAO層以及Mapper
1
2
3
4
|
<select id= "valiteUser" parameterType= "java.lang.String" resultType= "com.heitian.ssm.model.Userinfo" > SELECT password FROM t_user WHERE username = #{username} </select> |
Service層實現(xiàn)類
1
2
3
4
5
6
7
8
9
10
11
12
|
public String valiteUser(Userinfo userinfo) { try { Userinfo userdemo=userDao.valiteUser(EncoderByMd5(userinfo.getUsername())); if (userinfo.getPassword().equals(userdemo.getPassword())){ return "pass" ; } } catch (Exception e){ e.printStackTrace(); return "error" ; } return "refuse" ; } |
Controller層
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
@ResponseBody @RequestMapping ( "/loginUser" ) public HashMap<String,Object> loginUser(HttpServletRequest request, Userinfo userinfo){ HashMap<String,Object> result= new HashMap<String, Object>(); HttpSession session = request.getSession(); System.out.println( "login fail" ); String status=userService.valiteUser(userinfo); if (status.equals( "pass" )){ session.setAttribute( "CURRENT_USER" ,userinfo.getUsername()); result.put( "status" , "pass" ); } else { if (status.equals( "refuse" )){ result.put( "status" , "refuse" ); } else { result.put( "status" , "error" ); } } return result; } |
通過返回status信息,來判斷登陸是否成功,如果成功則將Session中寫入用戶名鍵值對。
2.當其他頁面訪問時,如何判斷是否有用戶登陸在線呢,我通過JS來取Session值來判斷。
即:先去拿Session的值,如果拿到為空或為null,則說明此會話在此之前沒有登陸行為,我們自動將其重定向到首頁,如果有值,則說明有登陸行為,且登陸在線的用戶為CURRENT_USER
所取出來的值,這時我們在用用戶名去調(diào)后臺接口即可。
1
2
3
4
5
6
7
8
|
< script language = "JavaScript" > $(document).ready(function(){ var myName="<%=session.getAttribute("CURRENT_USER")%>"; var projiectid1= "<%=request.getAttribute("projectid")%>"; if(myName=="null"){ window.location.href="/page/toindex" rel="external nofollow" ; } </ script > |
3.用戶注銷
注銷,即清除Session中的值即可,由后臺開放一個注銷接口。
1
2
3
4
5
6
|
@RequestMapping ( "/quitUser" ) public String quitUser(HttpServletRequest request){ HttpSession session = request.getSession(); session.removeAttribute( "CURRENT_USER" ); return "index" ; } |
這樣就實現(xiàn)了一套從登陸到注銷的用戶管理體系,但是這是一種最基礎的體系,安全性由很大的問題,所以類似于JWT TOKEN之類的驗證方案還是很有用武之地的。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。
原文鏈接:http://www.linuxidc.com/Linux/2017-12/149087.htm