一.HttpSession session
数据保存在服务器内存中,保存时间只有半小时左右
应用场景:登录与退出登录,浏览量与点赞量统计(一个用户只允许操作一次)
在web开发的时候,使用的都是B/S架构,浏览器与服务器直接连接,在服务端就会自动创建一个session对象.。
session.setAttribute(“username”,username); 》》是将username保存在session中!
session 的key值为“username”,value 值就是username真实的值,或者引用值。
Session表示会话,不止是在javaweb中存在,只要是web开发,都有会话这种机制。 * 在java中会话对应的类型是:javax.servlet.http.HttpSession,简称session/会话 * 在java web中session是一个存储在WEB服务器端的java对象,该对象代表用户和WEB服务器的一次会话。 * 工作原理: * 1.打开浏览器,在浏览器上发送首次请求 * 2. 服务器会创建一个HttpSession对象,该对象代表一次会话 * 3. 同时生成HttpSession对象对应的Cookie对象,并且Cookie对象的name是jsessionid,Cookie的value是32位长度的字符串(jsessionid=xxxx) * 4. 服务器将Cookie的value和HttpSession对象绑定到session列表中 * 5. 服务器将Cookie完整发送给浏览器客户端 * 6. 浏览器客户端将Cookie保存到缓存中 * 7. 只要浏览器不关闭,Cookie就不会消失 * 8. 当再次发送请求的时候,会自动提交缓存中当的Cookie * 9. 服务器接收到Cookie,验证该Cookie的name是否是jsessionid,然后获取该Cookie的value * 10. 通过Cookie的value去session列表中检索对应的HttpSession对象
应用场景:登录与退出登录
举例:
当用户已登录系统后,session就会存储一个用户信息对象,此后你可以随时从session中将这个对象取出来进行一些操作,比如进行身份验证,拿到用户的账户信息啊。。。。。。
1.在方法中接收HttpSession session对象.在登录成功时,使用 session.setAttribute("user",u)方法把UserVO对象往Session对象中保存
@RequestMapping("/login")//在参数中接收HttpSession session对象
public int login(@RequestBody UserLoginDTO user , HttpSession session){
System.out.println("user = " + user);
UserVO u=mapper.selectByUsername(user.getUsername());
if(u!=null){
if(user.getPassword().equals(u.getPassword())){
//往Session对象中保存
session.setAttribute("user",u);
return 1;
}
return 3;
}
return 2;
}
2.在需要验证用户信息时,用UserVO user=(UserVO)session.getAttribute("user")方法
从Session中获取之前保存的对象,然后再判断
session.getAttribute()方法返回的对象是object类型,需要强制转换为接受对象的数据类型
@RequestMapping("/weibo/insert")
public int insert(@RequestBody WeiboDTO weibo, HttpSession session){
UserVO user=(UserVO)session.getAttribute("user");
if(user==null){
return 2;
}
System.out.println("weibo = " + weibo);
/*创建微博实体类,并把DTO里面的数据装进实体类*/
Weibo w=new Weibo();
BeanUtils.copyProperties(weibo, w);
System.out.println(w);
/*设置当前时间*/
w.setCreated(new Date());
/*设置当前登录用户的id*/
w.setUserId(user.getId());
mapper.insert(w);
return 1;
}
3退出登录:调用session.removeAttribute("user");方法清除Session里保存的对象.
/*session存在于服务器内存中的*/
@RequestMapping("/logout")
public void logout(HttpSession session) {
session.removeAttribute("user");
}
应用场景2:浏览量与点赞量统计(一个用户只允许操作一次)
1)从会话对象中获取和当前页面商品id相关的信息,第一次是获取不到的
2)如果获取的info值为null说明是第一次浏览,调用mapper.updateViewCount(id)方法,让浏览量加1.
3)把当前商品id相关信息保存到Session中, 之后再次查询此商品后,此条件不会再满足,因为值不为null
@RequestMapping("/selectById/detail")
public ProductDetailVO selectDetail(int id, HttpSession session){
/*从会话对象中获取和当前页面商品id相关的信息,第一次是获取不到的*/
String info=(String)session.getAttribute("view"+id);
System.out.println("info"+info);
/*如果info值为null说明是第一次浏览*/
if(info==null){
//让浏览量加1
mapper.updateViewCount(id);
/*把当前商品id相关信息保存到Session中,
* 只后再次查询此商品后,此条件不会再满足,因为值不为null*/
session.setAttribute("view"+id,"isVisibled");
}
System.out.println(mapper.selectDetailById(id));
return mapper.selectDetailById(id);
}