Session学习小结
前言:
1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术。这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中的。
说到session就不得不提cookie了,个人对互联网的发展不是很了解,只是简单的知道早期的网站都是使用cookie进行用户管理的。
cookie是什么呢?我们先简单的了解下。
javax.servlet.http.Cookie是servlet自带的类,所以jsp页面可以调用。下面简单的介绍下cookie的使用
Cookie cookie = new Cookie("name", "dawa");
//设置域名
cookie.setDomain(".google.com");
//设置cookie的访问路径
cookie.setPath("/server");
//设置cookie有效时间
cookie.setMaxAge(1800);
//设置cookie是否只能由安全的协议访问如https
cookie.setSecure(true);
cookie类似于工作证,浏览器每次访问web项目时,会发送对应的cookie,而发送的cookie是之前response返回的。

上图中截图的部分就是浏览器发送给服务器的一个简单的sessionId的cookie。
2.随着时代的发展,session出现了,大有取代cookie的形势,但是常规的session还是依赖cookie的存储的,存储的是session的Id值,如上面的截图中的JSESSIONID。
下面我们来说说session这个玩意。
Web项目中我们一般把用户保存在session中,为什么这样使用呢?
因为我们在Web获取session时一般简单的通过request.getSession()的方式来获取session,用户的请求与session有了直接的关联,而用户的信息放在session中就形成一对一的关系。
之前我曾简单的考虑过一个问题,我们一般在登陆的时候通过request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser)这样的方式来讲user存放到session中取得,此处不禁想到,
多个用户登陆设置session的时候,key不都是一样的么,那么session是如何区分的呢?
这里就要说到之前截图里的JSESSIONID,在用户登陆之后,服务器会将session的Id以cookie的方式保存到response中返回给浏览器,浏览器再次发起请求的时候就会带上之前返回的cookie,
服务器在request.getSession()会根据cookie里的sessiondId获取对应的session,所以是不会造成混乱的。
说到这里,我们大致了解了一些session的知识。
实际项目中对于session的操作一般用户login和sessionFilter中,下面贴上login和sessionFiler的简单代码:
LoginController部分代码:
@RequestMapping("/login.do")
public String loginHandler(HttpServletRequest request, HttpServletResponse response, ModelMap model){
String action = request.getParameter("action");
if("do".equals(action)){
String workno = request.getParameter("account");
String password = request.getParameter("password")==null ? "":request.getParameter("password");
if(!"".equals(workno) && !"".equals(password)){
Map<String, Object> param = new HashMap<String, Object>();
param.put("name", workno);
param.put("password", password);
User user = userService.get(param);
if(user != null){
SessionUser sessionUser = new SessionUser();
sessionUser.setWorkno(user.getId());
sessionUser.setNickName(user.getName());
System.out.println("设置session");
request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser);
//此处演示下cookie的使用
Cookie cookie = new Cookie("name","dawa");
response.addCookie(cookie);
return "redirect:home.do";
} else {
model.put("errMsg", "用户名或者密码错误");
return "login";
}
} else {
model.put("errMsg", "用户名或者密码不能为空");
return "login";
}
}
return "login";
}
SessionFiler部分代码:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest hsrq = (HttpServletRequest) request;
HttpServletResponse hsrp = (HttpServletResponse) response; SessionUser person = null;
String reqPage = hsrq.getServletPath().trim();
if (!reqPage.equals("/login.do") && !reqPage.equals("/login_out.do")) {
System.out.println("sesion拦截");
person = (SessionUser) hsrq.getSession().getAttribute(Constants.SESSION_USER_KEY);
if (person == null) {
hsrp.sendRedirect("login.do");
return;
}
}
chain.doFilter(request, response);
}
代码都比较简单,没什么可说的,最后补充下session的过期时间和失效方法:
Web项目的session过期时间一般设置在web.xml中
<!-- 默认的session超时时间 ,单位为分钟-->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
而session的失效要调用invalidate()才能使session销毁,也只有这样才能触发HttpSessionListener的sessionDestroyed的方法,关闭浏览器只是断开了session,断开的session会在session过期后销毁。
request.getSession().invalidate();
Session学习小结的更多相关文章
- dubbo学习小结
dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...
- flex学习小结
接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...
- Python 学习小结
python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...
- react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)
react学习小结 本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...
- objective-c基础教程——学习小结
objective-c基础教程——学习小结 提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- ExtJs学习笔记之学习小结LoginDemo
ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...
- 点滴的积累---J2SE学习小结
点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...
- Session学习
Session学习 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通 ...
随机推荐
- Python学习day08-python进阶(2)-内置方法
Python学习day08-python进阶(2)-内置方法 列表数据类型内置方法 作用 描述多个值,比如爱好 定义方法 xxxxxxxxxx 2 1 hobby_list ...
- python学习笔记4_数据清洗与准备
一.处理缺失值 pandas使用浮点值NaN(Not a Number)来显示缺失值,并将缺失值称为NA(not available(不可用)). NA常用处理方法: dropna:根据每个标签的值是 ...
- css3之背景background-origin,background-clip,background-size
background-origin属性指定了背景图像的位置区域. content-box, padding-box,和 border-box区域内可以放置背景图像. background-clip用来 ...
- springboot2配置druid数据库连接池
注意配置以下的依赖: <!-- 引入druid数据源--> <dependency> <groupId>com.alibaba</groupId> &l ...
- [转]【全面解禁!真正的Expression Blend实战开发技巧】第八章 FluidMoveBehavior完全解析之一漂浮移动
好久没更新博客了,今天如果没急事,准备连发三篇,完全讲解Blend最牛的元素-“FluidMoveBehavior”.我向大家保证这三章一定非常精彩,不看你肯定后悔.我相信这三篇文章发表后,国内很多s ...
- JZOJ5898【NOIP2018模拟10.6】距离统计
题目 题目大意 给你带边权的树,然后有多高询问,每次询问距离某个点第kkk近的节点的距离. 思考 一眼看下去,首先就是想到如何动态的区间第K大,还要支持区间修改-- 于是想了半天,觉得不可做-- 最终 ...
- Python开发第三方必备工具
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style=&quo ...
- 【bzoj2120】数颜色 带修莫队
数颜色 题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画 ...
- Django项目:CRM(客户关系管理系统)--56--47PerfectCRM实现CRM客户报名流程01
#urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...
- JSP - (Java Server Pages) - Java服务器界面
JSP简介: 在HTML中嵌入Java脚本代码,由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码,然后将生成的整个页面信息返回给客户端: 一个JSP页面包含:静态内容(HTML静态文本), ...