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

一、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的知识就讲到这里。



   


猜你喜欢

转载自blog.csdn.net/qq_28379809/article/details/79976959