web session 原理1
原理
我们都知道,浏览器无状态的。浏览器是操作不了session的,浏览器能够做的只是传递cookie,每次都传递。 把当前主机下的,和当前请求相同域下的cookie 传递到服务器去,只要cookie没过时。
当我们第一次访问某个web 应用的时候,比如 http://localhost:8080/, 且假设之前没有访问过,那么 当前浏览器是不会存在 http://localhost:8080/ 网站的 session cookie 的,那么, 我们的请求头就不会包含 类似于: Cookie:JSESSIONID=C0EC2D80C7DE37C26013EF3FB4ED8B2E 这样的请求头cookie。 然后, 必然的,web 服务器会返回来一个类似这样的请求头:
Set-Cookie:JSESSIONID=9BAE417668B911F21FBBC2BD909B36A8; Path=/; HttpOnly
浏览器会识别Set-Cookie, 然后读取其内容,然后添加到浏览器 对应域名下 cookie池中去。 之后,每次都会携带这个JSESSIONID的cookie。 直到服务器端对当前session进行了invalidate 操作,或者 当前session 超时,那么, 它就失效了(注意session 失效了,但是 当前域下面的其他 cookie 却不会失效的,可以说失效的cookie 仅仅是JSESSIONID )。 然后,我们再次发送http请求, web 服务器又会给我们分配新的 session, 也就是再次响应Set-Cookie:xxx 。
做个测试。
提供两个servlet, 第一个给session属性,
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException; /**
* Created by luokai on 2017/10/15.
*/
public class SessionOperationServlet extends HttpServlet{ @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("user", "lk"); System.out.println("new session isNew = " + session.isNew());
System.out.println("new session getMaxInactiveInterval = " + session.getMaxInactiveInterval()); // session 是不需要login 的,但是可以被 设置为失效。
}
}
第二个让session失效:
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration; /**
* Created by luokai on 2017/10/15.
*
* 这里的Logout ,其实就是 invalidate 操作
*
*/
public class SessionLogoutServlet extends HttpServlet{ @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
// request.getSession(true); 这样会新建 session
System.out.println("session has attr = " + session.getAttributeNames().hasMoreElements());
if (session.getAttributeNames().hasMoreElements()) {
dumpSession(session);
}
System.out.println("session id = " + session.getId());
session.invalidate();
session = request.getSession();
System.out.println("new session isNew = " + session.isNew());// invalidate后的第一次request.getSession(), 那么session.isNew() 为true
System.out.println("new session getMaxInactiveInterval = " + session.getMaxInactiveInterval());
System.out.println("new session has attr = " + session.getAttributeNames().hasMoreElements());
System.out.println("new session id = " + session.getId());
} private static void dumpSession(HttpSession session) {
Enumeration<String> attributeNames = session.getAttributeNames();
while (attributeNames.hasMoreElements()) {
String s = attributeNames.nextElement();
System.out.println(s + " = " + session.getAttribute(s));
}
}
}
web.xml配置:
<servlet>
<servlet-name>sessOut</servlet-name>
<servlet-class>SessionLogoutServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sessOut</servlet-name>
<url-pattern>/sessOut</url-pattern>
</servlet-mapping> <servlet>
<servlet-name>sessOper</servlet-name>
<servlet-class>SessionOperationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>sessOper</servlet-name>
<url-pattern>/sessOper</url-pattern>
</servlet-mapping>
先访问 http://localhost:8080/sessOper
然后访问 http://localhost:8080/sessOut
, 我们就可以看到 session是如何起作用了的!
web session 原理1的更多相关文章
- java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用)
java web Session会话技术(原理图解+功能+与Cookie的区别+基本使用) 这是我关于会话技术的第二篇文章,对 Cookie有不了解的兄弟可以点击下方的Cookie跳转 Cookie链 ...
- 聊聊从web session的共享到可扩展缓存设计
先从web session的共享说起 许多系统需要提供7*24小时服务,这类系统肯定需要考虑灾备问题,单台服务器如果宕机可能无法立马恢复使用,这必定影响到服务.这个问题对于系统规模来说,从小到大可 ...
- [转]PHP Session原理分析及使用
之前在一个叫魔法实验室的博客中看过一篇<php session原理彻底分析>的文章,作者从session的使用角度很好阐述了在代码运行过程中,每个环节的变化以及相关参数的设置及作用.本来想 ...
- web基础-web工作原理,http协议,浏览器缓存
1,web工作原理 2,http协议 3,浏览器缓存 4,cookie和session -------------------------------------------------------- ...
- python---cookie模拟登陆和模拟session原理
cookie模拟登陆: import tornado.web class IndexHandler(tornado.web.RequestHandler): def get(self): #self. ...
- web安全原理-文件包含漏洞
前言 起来吃完早饭就开始刷攻防世界的题,一个简单的文件包含题我竟然都做不出来我服了 拿出买的书开始从头学习总结文件包含漏洞! 一.文件包含漏洞 文件包含漏洞 文件包含函数的参数没有经过过滤或者严格的 ...
- atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制
atitit. access token是什么??微信平台公众号开发access_token and Web session保持状态机制 1. token机制and session保持状态机制 1 ...
- C/S B/S 及WEB工作原理
一.C/S B/S区别 (http://wenku.baidu.com/link?url=e8bxaqz_lYCXws6TlDRJEq1qsLumNTBhr3Es6eA1ZuhHhq9FZGbVgo ...
- session原理总结
session原理总结 session多服务器共享的方案梳理 session原理 session的工作原理 客户端禁用cookie时session解决方案[转]
随机推荐
- WCF 基础连接已经关闭: 服务器关闭了本应保持活动状态的连接。
详细错误信息: System.ServiceModel.CommunicationException: 接收对 http://localhost:48655/XXXXXX.svc 的 HTTP 响应时 ...
- Scrapy环境安装
开始安装前,建议安装Visual C++ 2015 Build Tools,否则会一直出现如下提示: 下载地址:http://landinghub.visualstudio.com/visual-cp ...
- Visual studio 下C++工程相关经验
1.链接其他库调试时产生告警: warning LNK4099: 未找到 PDB“vc100.pdb” 解决方案:属性 -> C/C++ -> 输出文件 -> 程序数据库文件名 -& ...
- 黄聪: $(document).click() 在iphone上不触发事件解决办法
解决方案:加上 touchstart 事件 $(document).on(“click touchstart”, “.name”, function() { alert(“name”); });
- ALGO-14_蓝桥杯_算法训练_回文数
问题描述 若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数. 例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数. 又如:对于10进制数 ...
- JAVA中Integer类型变量比较问题
今天在做实验的时候,发现了一个比较奇怪的问题:两个Integer型变量用==进行比较时,有时候能成功有时候不能成功.举个例子: 代码1: Integer l1 = 122; Integer l2 = ...
- googletest--测试控制
有时候如果某个测试出现了异常,但是我们想继续其他的测试怎么办. 最简单的方法就是,在测试的名字前加上"DISABLED_",如下面的例子所示: // Test with fixtu ...
- 【Mysql+shell】查询结果导出到文件,文件数据导入到数据库
Shell: 执行Mysql查询,并将查询结果导出到文件 直接使用Mysql执行查询 mysql> use xxx_dbName; mysql> select * from log_06 ...
- MySQL 服务启动y异常: 本地无法启动MySQL服务,报的错误:1067,进程意外终止---解决
启动MySQL后,几秒钟后直接报错了 然后在事件查看器中发现了几条错误信息 Can't start server: Bind on TCP/IP port: No such file or direc ...
- 关于socket阻塞与非阻塞情况下的recv、send、read、write返回值---部分内容可能不确切,待讨论
1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回值 ...