Session和Cookie的区别与实际应用——分别以保持用户状态和记住密码功能举例

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 00:28   850   0

一、Session和Cookie的连续与区别

1.session保存在服务器端,cookie保存在客户端

2.session被默认保存在服务器的一个文件中,也可以被放在文件、数据库甚至内存中

3.session依赖于session id,而session id存在于cookie中——关于这一点,我们可以遍历cookie,会发现一个name="JSESSIONID"的cookie——也就是说,session实际上依赖于cookie,如果cookie被浏览器禁用了,那么session也就不能用了。


二、Session实现保持用户状态

用户登录后,在页面之间传递user信息显然是很麻烦的,总不能每次切换页面时都携带一个user的数据项吧,这个时候我们用session来实现。

实现很简单:

首先保存用户信息至session:

request.getSession().setAttribute("user", user);//登录成功,向session中存入user信息

然后在切换页面时获取session中保存的用户信息,交给新页面:

HttpSession session = request.getSession();
if(session != null && session.getAttribute("user")!=null) {
 view.addObject("user", (User)session.getAttribute("user"));
}else {//未登录}

三、Cookie记住账户信息,自动填充登录信息

上面我们实现了通过session保存用户登录状态,那么,如何实现非常常见的“记住密码”功能呢?

显然这里有两种方式:1.使用session,优点是安全,缺点是会话结束后这个用户信息就丢失了。2.使用cookie,优点是可以设置过期时限,缺点是不安全。

这里我只使用cookie保存用户id,用户请求打开登录界面时,服务端根据这个id从数据库获得整个user,这样不会泄露更多信息,造成安全问题。

实现同样很简单:

首先是保存登录信息:

String rememberPassword = request.getParameter("rememberPassword");
//用户信息正确时,保存密码至Cookie
if(rememberPassword!=null && rememberPassword.equals("on")) {
 Cookie cookie = new Cookie("user_id", user.getId()+"");
 cookie.setMaxAge(7*24*60*60);//cookie时限,单位是s;
 response.addCookie(cookie);//将用户id添加至cookie
}

然后在处理用户打开登录界面请求时,使用这个cookie:

@RequestMapping(path="/toLogin",method= {RequestMethod.GET})
public ModelAndView toLogin(HttpServletRequest request,HttpServletResponse response) {
 ModelAndView view = new ModelAndView("user/login");
 Cookie[] cookies = request.getCookies();
 for(Cookie c : cookies) {
  if(c.getName().equals("user_id")) {
   int id = Integer.parseInt(c.getValue());
   User user = userService.getUserById(id);
   if(user!=null) {
    view.addObject("user", user);
   }
  }
 }
 return view;
}

现在,界面user/login.html拿到了user的信息,然后填充登录信息:

(注意我这里用的thymeleaf模板引擎,用jsp或者其他技术的使用自己的语法即可)

<script th:inline="javascript">
$(document).ready(function(){
 var email = [[${user.email}]];
 if(email!=null){
  if(email!=""){
   document.getElementById("email").value=email;
   document.getElementById("password").value=[[${user.password}]];
   document.getElementById("rememberPassword").checked=true;
  }
 }
});
</script>

最后强调一点,session的生命周期是从会话开始到会话结束,而cookie的生命周期是自己设置的,如果不设置,默认浏览器关闭这个cookie就没了,所以最好设置一下期限。

ok,关于session和cookie的知识就讲到这里。




分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP