javaweb学习——会话技术(二)
文中部分借鉴了: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.
package cn.it.gan.sessionDemo; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; @WebServlet("/SessionText")
public class SessionText extends HttpServlet {
private static final long serialVersionUID = 1L; public SessionText() {
super();
// TODO Auto-generated constructor stub
} protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//使用request对象来获取session,如果session不存在就创建一个session;
HttpSession session=request.getSession();
//将数据存到session中
session.setAttribute("date", "小小");
//获取session的ID值
String sessionID=session.getId();
//判断此session是新建的还是已经存在的
if(session.isNew()) {
System.out.println("session对象已经创建好了,sessionID是"+sessionID);
}else {
System.out.println("session对象已经存在了");
} } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
} }
我猜想request.getSession()方法内部新创建了Session之后一定是做了如下的处理

1 //获取session的Id
2 String sessionId = session.getId();
3 //将session的Id存储到名字为JSESSIONID的cookie中
4 Cookie cookie = new Cookie("JSESSIONID", sessionId);
5 //设置cookie的有效路径
6 cookie.setPath(request.getContextPath());
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学习——会话技术(二)的更多相关文章
- javaweb学习——会话技术(一)
会话: 1.什么是会话:从打开一个浏览器,访问页面,到最终关闭浏览器的一个过程,就是一次会话. 2.会话的特点:包含多个请求,一次完整的会话是只针对一个用户. 3.会话机制:web中常用的技术,用来跟 ...
- javaweb学习笔记(二)
一.javaweb学习是所需要的细节 1.Cookie的注意点 ① Cookie一旦创建,它的名称就不能更改,Cookie的值可以为任意值,创建后允许被修改. ② 关于Cookie中的setMaxAg ...
- JavaWeb基础: 会话技术简介
会话技术 用户使用Web应用的过程实际是调用了一系列的Servlet来组合处理请求,从而完成整个业务流.不同Servlet组合起来为用户服务的时候就会遇到一个数据共享和传输的问题,如何让多个Servl ...
- JavaWeb学习 (六)————Servlet(二)
一.ServletConfig讲解 1.1.配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servlet配置一些 ...
- JAVAWeb学习总结(二)
JavaWeb学习总结(二)——Tomcat服务器学习和使用(一) 一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. ...
- JavaWeb学习记录(二)——防盗链技术
public class TestServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpSer ...
- JavaWeb学习总结(十二)——Session
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
- Javaweb学习笔记——(二十)——————Javaweb监听器、国际化
Javaweb监听器 三大组件 *Servlet *Listener *Filter Listener:监听器 1.初次相见:A ...
- JavaWeb学习总结(十二)——Session(转)
一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下).因此,在需要保存用户数据时,服务 ...
随机推荐
- (转)ERROR 2002 (HY000): Can't connect to local MySQL server through socket '***' (2)
有时候,当我们使用“mysql”.“mysqladmin”.“mysqldump”等命令管理数据库时,服务器抛出类似如下错误: 1 ERROR 2002 (HY000): Can't connect ...
- 057-while循环
<?php $x=1; //初始化变量 while($x<=5){ //执行while循环 echo "$x<br />"; $x++; } ?>
- (HN)AHOI2018 转盘
题意: 有 \(n\) 个格子围成一圈,每个格子里有一个物品,每个物品的出现时间为 \(T_i\) .开始时选择一个格子为起点,每个单位时间可以向前走一格或不动,若当前格的物品已出现则将其标记.有 \ ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 异常处理
异常是程序在执行期间产生的问题.C++ 异常是指在程序运行时发生的特殊情况,比如尝试除以零的操作. 异常提供了一种转移程序控制权的方式.C++ 异常处理涉及到三个关键字:try.catch.throw ...
- Promise 与 await 组合使用
看例子就行了,废话不多说! async function checkStatus(name){ return new Promise((resolve,reject) => { ...
- springboot - 返回JSON error 从自定义的 ErrorController
使用AbstractErrorController(是ErrorController的实现),返回json error. 1.概览 2.基于<springboot - 映射 /error 到自定 ...
- Codeforces 392 C Unfair Poll(模拟)
题意:老师点名顺序规则如下:第1排,第2排,……,第n-1排,第n排,第n-1排,……,第2排,第1排,第2排,……,第n-1排,第n排,……对于每排都是从左到右依次点名,问点名k个人后,所有人中最多 ...
- C++ 大文件读写
//你必须映射一个只包含一小部分文件数据的文件视图.首先映射一//个文件的开头的视图.当完成对文件的第一个视图的访问时,可以取消它的映像,然后映射//一个从文件中的一个更深的位移开始的新视图.必须重复 ...
- DataStructuresAndAlogorithm--红黑树
简介 为了理解红黑树(red-black tree)是什么,首先需要知道二叉树. 定义1:二叉树是结点的有限集合,该集合或者为空集,或者是由一个根和两棵互不相交的,称为该根的左子树和右子树的二叉树组成 ...
- Loading PDSC Debug Description Failed for STMicroelectronics STM32Lxxxxxxx”
今天在调程序的时候遇到这个问题 解决办法:将安装在MDK下面的文件属性由只读去掉: 成功!可以下载.