文中部分借鉴了:https://www.cnblogs.com/xdp-gacl/p/3855702.html

        https://blog.csdn.net/p744174529/article/details/71716097

session

1.什么是session:

  session是一种将数据保存到服务端的技术,依赖Cookie技术。

2.session的实现原理:

  当客户端访问服务器时,Servlet容器会创建一个Session对象和id属性,服务器创建Session后,会把session的Id以Cookie的形式返回给客户机,只要客户机的浏览器不关闭,再次访问服务器时,都会带着session的id值过来。

  服务端会为每一个客户端创建一个session对象,session对象就像是客户端在服务端的账号,它们被服务器放到一个Map集合中,这个Map集合被称为session缓存。当客户端后续访问服务端时,只要将session的id值传递给服务端,服务端就能判断出时哪一个客户端发送的,从而选择与之对应的session对象来为其服务。

3.HttpSession API:

  HttpSession中的常用方法:

  String getId():用于返回当前HttpSession对象关联的Id值;

  long getCreationTime():用于返回当前HttpSession的创建时间。

  long getLastaccessedTime():返回客户端最后一次发送与session相关请求的时间。

  boolean isNew():判断当前session是否时新创建的。

  void invalidate():强制使当前的session对象失效。

  ServletContext getServletContext():用于返回当前session对象所属的ServletContext对象。

  void setAttribite(String name,Object value):将一个对象和一个名称关联后存储到session对象中。

  string getAttribite():用于从当前session对象中返回指定名称的属性对象。

  void removeAttribite(String name):用于从当前Httpsession对象中删除指定名称的属性。

4.获取session:

  session与每个请求有关,为此HttpSessionRequest定义了两个获取session对象的getSession()方法:

    public HttpSession getSession(boolean create)

    public HttpSession getSession()

  request.getSession()有两种可能:一种使创建session,一种使获取session。

  第一个getSession方法使根据参数来判断当没有session对象时是否创建新的session对象,如果为true,就创建新的session对象。

  第二个getSession方法相当于第一个方法参数为true时,在相关的session对象不存在时创建新的session对象

  注意:由于getSession方法可能会返回会话标识号(id)的Cookie头字段,因此,必须在发送相应内容前调用getSession方法。

  session是由服务器端来创建的,当你访问服务器时,服务器不会立马给你创建一个session对象,而是在第一次访问session时,才给你创建,什么时候时第一次访问呢?既当你第一次调用getSession()方法时,服务器会先判断请求头中的Cookie.

  1. package cn.it.gan.sessionDemo;
  2.  
  3. import java.io.IOException;
  4.  
  5. import javax.servlet.ServletException;
  6. import javax.servlet.annotation.WebServlet;
  7. import javax.servlet.http.HttpServlet;
  8. import javax.servlet.http.HttpServletRequest;
  9. import javax.servlet.http.HttpServletResponse;
  10. import javax.servlet.http.HttpSession;
  11.  
  12. @WebServlet("/SessionText")
  13. public class SessionText extends HttpServlet {
  14. private static final long serialVersionUID = 1L;
  15.  
  16. public SessionText() {
  17. super();
  18. // TODO Auto-generated constructor stub
  19. }
  20.  
  21. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  22. response.setCharacterEncoding("utf-8");
  23. response.setContentType("text/html;charset=utf-8");
  24. //使用request对象来获取session,如果session不存在就创建一个session;
  25. HttpSession session=request.getSession();
  26. //将数据存到session中
  27. session.setAttribute("date", "小小");
  28. //获取session的ID值
  29. String sessionID=session.getId();
  30. //判断此session是新建的还是已经存在的
  31. if(session.isNew()) {
  32. System.out.println("session对象已经创建好了,sessionID是"+sessionID);
  33. }else {
  34. System.out.println("session对象已经存在了");
  35. }
  36.  
  37. }
  38.  
  39. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  40. // TODO Auto-generated method stub
  41. doGet(request, response);
  42. }
  43.  
  44. }

猜想request.getSession()方法内部新创建了Session之后一定是做了如下的处理

  1. 1 //获取session的Id
  2. 2 String sessionId = session.getId();
  3. 3 //将session的Id存储到名字为JSESSIONID的cookie中
  4. 4 Cookie cookie = new Cookie("JSESSIONID", sessionId);
  5. 5 //设置cookie的有效路径
  6. 6 cookie.setPath(request.getContextPath());
  7. 7 response.addCookie(cookie);

session注意事项:

  1.session的创建并不是在浏览器向服务器发出请求的瞬间产生的,而是在servlet端调用HttpServletRequest.getSession()时创建的。

  2.在一个jsp页面中,session能作为隐式对象被调用是因为jsp在编译的过程中自动调用了HttpServletRequest.getSession()。

  3.当在jsp页面中使用了<%@ page session="false"%>时,jsp页面不会去主动创建session,但是我们可以手动的去创建一个session。

session的失效有两种情况:

  1.设置session的超时响应使它失效

  2.调用了session的invalidate()方法使它失效。

  需要注意的是,如果使用了第二种方法,session在失效的同时,浏览器会自动创建一个新的session。

  

  一般来说,要想使一个jsp中session为null,那么只有在jsp页面中使用<%@ page session="false"%>且不使用HttpServletRequest.getSession()或使用时设置为 HttpServletRequest.getSession(false)。

  同时需要注意的是当使用<%@ page session="false"%>,且在jsp代码中调用:

    <%

      HttpSession session = new request.getSession();

      out.print(session);

      session.invalidate();

      out.print(session);

    %>

  时,前后两个out.print()输出的是同一个session。

  但是如果不使用<%@ page session="false"%>,仅在jsp代码中使用

    <%

      out.print(session);

      session.invalidate();

      out.print(session);

    %>

  此时,输出的两个session不同。

javaweb学习——会话技术(二)的更多相关文章

  1. javaweb学习——会话技术(一)

    会话: 1.什么是会话:从打开一个浏览器,访问页面,到最终关闭浏览器的一个过程,就是一次会话. 2.会话的特点:包含多个请求,一次完整的会话是只针对一个用户. 3.会话机制:web中常用的技术,用来跟 ...

  2. javaweb学习笔记(二)

    一.javaweb学习是所需要的细节 1.Cookie的注意点 ① Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任意值,创建后允许被修改. ② 关于Cookie中的setMaxAg ...

  3. JavaWeb基础: 会话技术简介

    会话技术 用户使用Web应用的过程实际是调用了一系列的Servlet来组合处理请求,从而完成整个业务流.不同Servlet组合起来为用户服务的时候就会遇到一个数据共享和传输的问题,如何让多个Servl ...

  4. JavaWeb学习 (六)————Servlet(二)

    一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...

  5. JAVAWeb学习总结(二)

    JavaWeb学习总结(二)——Tomcat服务器学习和使用(一) 一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. ...

  6. JavaWeb学习记录(二)——防盗链技术

    public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...

  7. JavaWeb学习总结(十二)——Session

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

  8. Javaweb学习笔记——(二十)——————Javaweb监听器、国际化

    Javaweb监听器     三大组件         *Servlet         *Listener         *Filter Listener:监听器         1.初次相见:A ...

  9. JavaWeb学习总结(十二)——Session(转)

    一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...

随机推荐

  1. 洛谷[Luogu] 普及村总结

    总结 简单的模拟 交叉模拟 排序 排序EX

  2. Assignment写作谨慎学术抄袭是关键

    学术写作(Academic Writing)作为留学生涯的“必修课”,总是让闻者叹气,抓耳挠腮.初入课堂的留学生,更是缺乏写作经验不知从何下笔,只想仰天长啸“Essay真的好难啊!!”面对一个Essa ...

  3. JAVA基本数据类型和注释

    一.注释 1.注释的概念 注释是程序中给人看的提示信息,会被编译器忽略:在程序编译和执行过程中不会有任何影响,仅仅在代码阅读时提供提示信息. 2.注释的形式 基本语法://注释的内容   a.行注释 ...

  4. 第十九篇 同源策略与Jsonp

    同源策略 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的 ...

  5. 前端ajax用post方式提交json数据给后端时,网络报错 415

    项目框架:spring+springmvc+mybatis 问题描述:前端ajax用post方式提交json数据给后端时,网络报错 415 前端异常信息:Failed to load resource ...

  6. c++ 字符串转数字或数字转字符串

    在C++中字符串转换为数字,或数字转换为字符串,用到如下函数: _itoa atoi.atof.itoa.itow _itoa_s 1.整形转换为字符串: wchar_t * _itot(int _V ...

  7. mongodb replication set 主从切换

    今天被问到mongodb副本集主从切换的问题,然后发现没有相关命令的中文文档,这里翻译记录一下 rs.stepDown() rs.stepDown(stepDownSecs, secondaryCat ...

  8. RFX2401C与RFX2402E的区别

    随着科技的发展,射频设备也慢慢的普及,射频放大器在射频设备中起着非常重要的作用.为了能获得足够大的距离,必须都要外加射频信号放大器. 射频信号放大器简称 “PA”.PA主流应用主要有ZigBee .无 ...

  9. 微信小程序手绘地图实现之《Canvas》

    环境:微信SDK2.9+   + uniapp (可切换直接使用.map.js不限制环境) 正题: 先创建一个地图组件 <template> <view class="cu ...

  10. Kmp--P3375 【模板】KMP字符串匹配

    题目描述 如题,给出两个字符串 s1 和 s2,其中 s2 为 s1 的子串,求出 s2 在 s1​ 中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组 next. (如果你不知道这 ...