前言:

1.我们在学习一项技术的时候,首先应该是什么时候会用到这项技术。这次学习session也是如此,一般的web项目中都有用户的存在,有用户那么就有了用户的管理,而用户往往是存在于session中的。

说到session就不得不提cookie了,个人对互联网的发展不是很了解,只是简单的知道早期的网站都是使用cookie进行用户管理的。

cookie是什么呢?我们先简单的了解下。

javax.servlet.http.Cookie是servlet自带的类,所以jsp页面可以调用。下面简单的介绍下cookie的使用

  1. Cookie cookie = new Cookie("name", "dawa");
  2. //设置域名
  3. cookie.setDomain(".google.com");
  4. //设置cookie的访问路径
  5. cookie.setPath("/server");
  6. //设置cookie有效时间
  7. cookie.setMaxAge(1800);
  8. //设置cookie是否只能由安全的协议访问如https
  9. 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部分代码:

  1. @RequestMapping("/login.do")
  2. public String loginHandler(HttpServletRequest request, HttpServletResponse response, ModelMap model){
  3. String action = request.getParameter("action");
  4. if("do".equals(action)){
  5. String workno = request.getParameter("account");
  6. String password = request.getParameter("password")==null ? "":request.getParameter("password");
  7. if(!"".equals(workno) && !"".equals(password)){
  8. Map<String, Object> param = new HashMap<String, Object>();
  9. param.put("name", workno);
  10. param.put("password", password);
  11. User user = userService.get(param);
  12. if(user != null){
  13. SessionUser sessionUser = new SessionUser();
  14. sessionUser.setWorkno(user.getId());
  15. sessionUser.setNickName(user.getName());
  16. System.out.println("设置session");
  17. request.getSession().setAttribute(Constants.SESSION_USER_KEY, sessionUser);
                  //此处演示下cookie的使用
  18. Cookie cookie = new Cookie("name","dawa");
  19. response.addCookie(cookie);
  20. return "redirect:home.do";
  21.  
  22. } else {
  23. model.put("errMsg", "用户名或者密码错误");
  24. return "login";
  25. }
  26. } else {
  27. model.put("errMsg", "用户名或者密码不能为空");
  28. return "login";
  29. }
  30. }
  31. return "login";
  32. }
  1. SessionFiler部分代码:
  1. public void doFilter(ServletRequest request, ServletResponse response,
  2. FilterChain chain) throws IOException, ServletException {
  3. HttpServletRequest hsrq = (HttpServletRequest) request;
  4. HttpServletResponse hsrp = (HttpServletResponse) response;
  5.  
  6. SessionUser person = null;
  7. String reqPage = hsrq.getServletPath().trim();
  8. if (!reqPage.equals("/login.do") && !reqPage.equals("/login_out.do")) {
  9. System.out.println("sesion拦截");
  10. person = (SessionUser) hsrq.getSession().getAttribute(Constants.SESSION_USER_KEY);
  11. if (person == null) {
  12. hsrp.sendRedirect("login.do");
  13. return;
  14. }
  15. }
  16. chain.doFilter(request, response);
  17. }

代码都比较简单,没什么可说的,最后补充下session的过期时间和失效方法:

Web项目的session过期时间一般设置在web.xml中

  1. <!-- 默认的session超时时间 ,单位为分钟-->
  2. <session-config>
  3. <session-timeout>30</session-timeout>
  4. </session-config>

而session的失效要调用invalidate()才能使session销毁,也只有这样才能触发HttpSessionListener的sessionDestroyed的方法,关闭浏览器只是断开了session,断开的session会在session过期后销毁。

  1. 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. java面向对象特征 — 一句话概括

    java基础学习总结之基本特征,最开始学习的时候,是形而上的理解,用了3年多,再回头看,理解起来颇为顺理成章 语言学习大概就是这样一种规律,学习,不甚解,应用,应用,渐深入人心,回头一看,恍然一悟 最 ...

  2. 关于c.toArray might (incorrectly) not return Object[] (see 6260652)的问题解答

    最近学习jdk1.8源码时,发现ArrayList(Collection<? extends E> c)这个构造函数中,有句有意思的描述:c.toArray might (incorrec ...

  3. 基于baseline、svd和stochastic gradient descent的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.3部分内容(其余部分会陆续补充上来).koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长.考虑到写文章目 ...

  4. Java超简明入门学习笔记(三)

    Java编程思想第4版学习笔记(三) 第五章 初始化与清理(构造器和垃圾回收机制)         Java有和C++类似的构造函数来为新创建的对象执行初始化及完成一些特殊的操作,有的类数据成员可能会 ...

  5. js 实现横向轮播效果

    参考:https://www.cnblogs.com/LIUYANZUO/p/5679753.html html: <!DOCTYPE html> <html> <hea ...

  6. angular 基本树结构

    HTML: http://www.ngnice.com/showcase/#/tree/basic <link rel="stylesheet" href="vie ...

  7. pip报错ImportError: cannot import name main

    编辑pip sudo gedit /usr/bin/pip 修改pip文件: 源文件 from pip import main if __name__ == '__main__': sys.exit( ...

  8. Spring注解驱动开发(七)-----servlet3.0、springmvc

    ServletContainerInitializer Shared libraries(共享库) / runtimes pluggability(运行时插件能力) 1.Servlet容器启动会扫描, ...

  9. 两天了。照着SVN的界面画的一个界面。

      可以选择显示哪些列. 界面上的东西,都简单,麻烦的是它的下层.下层全部用svn server的服务器自带的svn.exe来支持. 有些位置要启动svn.exe不止一次.所以参数的来回传递,来回组合 ...

  10. Tensorflow技巧

    1.尽量控制图片大小在1024以内,不然显存会爆炸. 2.尽量使用多GPU并行工作,训练下降速度快. 3.当需要被检测的单张图片里物体太多时,记得修改Region_proposals的个数 4.测试的 ...