前言:

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学习小结的更多相关文章

  1. dubbo学习小结

    dubbo学习小结 参考: https://blog.csdn.net/paul_wei2008/article/details/19355681 https://blog.csdn.net/liwe ...

  2. flex学习小结

    接触到flex一个多月了,今天做一个学习小结.如果有知识错误或者意见不同的地方.欢迎交流指教. 画外音:先说一下,我是怎么接触到flex布局的.对于正在学习的童鞋们,我建议大家没事可以逛逛网站,看看人 ...

  3. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  4. react学习小结(生命周期- 实例化时期 - 存在期- 销毁时期)

    react学习小结   本文是我学习react的阶段性小结,如果看官你是react资深玩家,那么还请就此打住移步他处,如果你想给一些建议和指导,那么还请轻拍~ 目前团队内对react的使用非常普遍,之 ...

  5. objective-c基础教程——学习小结

    objective-c基础教程——学习小结   提纲: 简介 与C语言相比要注意的地方 objective-c高级特性 开发工具介绍(cocoa 工具包的功能,框架,源文件组织:XCode使用介绍) ...

  6. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  7. ExtJs学习笔记之学习小结LoginDemo

    ExtJs学习小结LoginDemo 1.示例:(登录界面) <!DOCTYPE html> <html> <head> <meta charset=&quo ...

  8. 点滴的积累---J2SE学习小结

    点滴的积累---J2SE学习小结 什么是J2SE J2SE就是Java2的标准版,主要用于桌面应用软件的编程:包括那些构成Java语言核心的类.比方:数据库连接.接口定义.输入/输出.网络编程. 学习 ...

  9. Session学习

    Session学习 Session的作用就是在服务器端保存一些用户的数据,然后传递给用户一个名字为JSESSIONID的Cookie,这个JESSIONID对应这个服务器中的一个Session对象,通 ...

随机推荐

  1. NYOJ--311(完全背包)

    题目:http://acm.nyist.net/JudgeOnline/problem.php?pid=311 分析:这里就是一个完全背包,需要注意的就是初始化和最后的输出情况        dp[j ...

  2. iBatis 代码自动生成工具 iBator 及 Example 使用

    iBator的下载和安装 官方下载地址:http://people.apache.org/builds/ibatis/ibator/ 安装:见<Eclipse 插件安装> 安装完成后,“F ...

  3. Luogu P1429 平面最近点对(加强版)(分治)

    P1429 平面最近点对(加强版) 题意 题目描述 给定平面上\(n\)个点,找出其中的一对点的距离,使得在这\(n\)个点的所有点对中,该距离为所有点对中最小的. 输入输出格式 输入格式: 第一行: ...

  4. 如何撤销Git操作?

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:如何撤销Git操作?: Git 版本管理时,往往需要撤销某些操作. 本文介绍几种最主要的情况,给出详细的解释.更多的命令可以参考< ...

  5. MySQL的高可用实现方案之mysql-mmm

    一.环境简述 1.工作逻辑图 2.MySQL-MMM优缺点 优点:高可用性,扩展性好,出现故障自动切换,对于主主同步,在同一时间只提供一台数据库写操作,保证的数据的一致性. 缺点:Monitor节点是 ...

  6. [JZOJ5969] 世界线修理(欧拉回路)

    题目 描述 > 题目大意 给你两棵树,让你对每个点赋权,使得在两棵树中的任意子树的和绝对值为111. 比赛思路 其实我一开始理解错题意了-- 正解 首先,我们可以判断每个点权的奇偶性. 如果一个 ...

  7. js中的对象、原型链机制、构造函数

    一.在js中创建对象的方式 //一.字面量或直接量创建对象 var obj1 = { name:"zs", age:12 }; //二.通过new来创建对象 var obj2 = ...

  8. c语言学习笔记 关于double

    今天做了个简单的例子,由于没有使用正确的数据类型导致出错,下面是记录 #include <stdio.h> int main(void){ int i; double sum; doubl ...

  9. megacli在线raid构建详解(转载自用)

    版权声明:本文为博主原创文章,未经博主允许不得转载,转载附上原文链接即可. https://blog.csdn.net/GX_1_11_real/article/details/83213959 ht ...

  10. fastjson循环引用 问题@ManyToOne @OneToOne返回数据中"$ref"问题

    返回数据为 这样前端就无法获取正确数据(至少是不改变代码,不增加代码量的情况下) 所以还是改返回值比较好 根据查阅 https://blog.csdn.net/qq_38487524/article/ ...