Session的引入以及Cookie的不足
一、为什么引入session
> Cookie实际上就是一个头。
> 服务器会创建Cookie,并且将Cookie以一个响应头的形式发送给浏览器
> 浏览器收到Cookie以后,会保存Cookie,并且每次访问服务器时都会以请求头的形式带着Cookie
> 服务器就可以根据浏览器带着的Cookie来识别不同的用户。
> Cookie的不足:
- Cookie是纯文本的,使用起来不安全。
- 浏览器每次访问服务器都需要带着Cookie,无形中增加浏览器的流量。
- 浏览器对Cookie的数量和大小都有不同的限制,所以我们不能再Cookie中保存大量的信息。
二、 HttpSession的引入及简介
1、简介
- Cookie的信息最终都是要保存到浏览器上的,但是浏览器对Cookie的大小和数量都有限制,不能再Cookie中保存大量信息。
- 但是在服务器中保存的内容的大小和数量是没有限制,可不可以将用户的信息保存到服务器上的一个对象中?
- 可以为这个对象创建一个唯一的标示,然后将这个唯一的标示交给浏览器保存(以Cookie的形式),然后服务器中就可以根据这个标识找到他的对象。
- 服务器中的对象就是我们熟悉的HttpSession。
- HttpSession用来保存当前浏览器的会话的信息,每一次会话都对应一个session对象。
- 一个浏览器对应一个Session对象,不同浏览器之间不会共享Session
- Session的默认有效时间是一次会话,一旦关闭浏览器以后Session对象将失效
- 每一个Session都有一个唯一的ID,我们只需要将ID交给浏览器,就可以通过ID来找到浏览器对应的那个Session对象
- 当服务器创建一个新的HttpSession对象时,会将session的id以Cookie的形式发送给浏览器:Set-Cookie: JSESSIONID=96343C6F88D5917BEE3B8D3E940DBD66
- 当浏览器再次访问服务器是,会以Cookie的形式带着Session的ID,服务器会去检查ID,并根据ID获取到HttpSession对象Cookie: JSESSIONID=96343C6F88D5917BEE3B8D3E940DBD66
- Session在服务器内部是保存到一个叫做SessionMap的集合中,这个map的key是Session的ID,值就是Session对象
2、 工作机制
- Session对象的创建时机
- Session对象是在request.getSession()方法第一次被调用时创建。
- 在第一次访问JSP时,也会创建一个Session对象,因为在JSP对应的java文件中,已经调用过该方法了。
3、UUID及时间戳:
UUID:是一个32位的唯一标识符,UUID是根据机器码以及时间戳生成的,所以UUID是全世界的一个唯一的标识符,
永远不会重复,一般使用UUID做为一个对象的唯一标识,或者做为数据库表中的一个主键!
String uuid = UUID.randomUUID().toString();
System.out.println(uuid);
时间戳指的就是从1970年1月1日0时0分0秒到现在时间的毫秒数
4、有效时间
- Session对象的默认有效时间是一次会话,这里并不是因为Session对象被销毁了,而是浏览器保存的JSESSIONID的这个Cookie丢失了。
- 能不能让Session对象,在关闭浏览器以后依然有效?
我们可以通过修改JSESSIONID这个Cookie有效时间,让Session在关闭浏览器之后依然有效。
- Session对象是有一个最大的闲置时间,一旦超过最大的闲置时间,则Session对象会被销毁。
- 我们可以在总的web.xml文件中配置Session对象的最大闲置时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
它的单位是分钟,可以在这里来修改,但是如果在这修改那么服务器中所有项目的闲置时间都会修改。
如果我们只想修改我们当前项目的闲置时间,可以在当前项目的web.xml文件中进行修改
- 通过setMaxInactiveInterval来设置有效时间
//当传一个大于0的数时,session的最大闲置时间会被设置为相应的秒数
//session.setMaxInactiveInterval(10);
//当传一个等于0的数或者当传一个小于0的数时,session对象会永远有效,所以尽量不给他设置负值
session.setMaxInactiveInterval(-100);
- 使Session立即失效
session.invalidate();
5、URL重写
- Session的运行机制是基于Cookie。
- 如果浏览器禁用Cookie,那么Session机制将会失效。
- 如果浏览器禁用了Cookie,那么浏览器将不会保存JSESSIONID这个Cookie,但是我们可以通过地址栏来传递Cookie的信息
http://localhost:8080/16_WEB_Session/2.jsp;jsessionid=2AA78907BE47396DA23DEB094269AFF3
- 可以通过
response.encodeRedirectURL("绝对路径")
response.encodeURL("绝对路径")
这两个方法来重写URL地址,这两个方法,当浏览器不支持Cookie时会自动的在地址后边加上Cookie的信息
- 还可以通过c:url标签来重写URL地址
<c:url value="/2.jsp"></c:url>
注意使用URL标签时,不用加上项目名
- 一般开发时,我们不太使用URL重写,因为URL重写不太安全。
6、Session的活化和钝化
> 钝化:
- 将一个HttpSession对象序列化到硬盘中我们称为Session的钝化。
> 活化
- 将写入硬盘中HttpSession对象反序列化到内存中的过程我们成为Session的活化。
> 一般情况下,当服务器停止时,Session对象会被写入到硬盘中,然后当服务器再次启动时,
会自动将硬盘中的对象加载进内存。
> 如果希望Session域中的属性可以和Session一起钝化到磁盘中,那这些属性必须实现java.io.Serializable接口
> 当访问服务器的用户过多时,会有非常多的会话产生,这些会话,每一个会话都会对应一个HttpSession对象。
这时在服务器的内存会存在大量的Session对象,但是这些对象并不是都在使用中,
所以我们希望将这些不使用的Session对象钝化到硬盘中,当这些对象再次使用时,在活化进内存。
在Tomcat的配置文件conf/context.xml文件的根标签中加入如下代码
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="mySession" />
</Manager>
maxIdleSwap属性:指的Session闲置时间,当闲置一定时间以后,会自动钝化到硬盘中
directory属性:Session钝化后的目标文件夹
7、表单的重复提交问题的解决
- 同一个表单中的内容多次提交到服务器中。
- 第一种情况:
提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。
- 这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面。
- 这样整一个业务,只发送了一次请求,那么当你在浏览器中点击刷新按钮或者狂按f5会一直都会刷新之前的请求
-解决方案:
使用重定向跳转到目标页面
- 第二种情况:
在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。
- 产生的原因:是因为咱们的提交按钮可以点击多次。
- 解决方案:
使提交按钮只能点击一次。这事咱们得通过js来完成。
window.onload = function(){
//获取按钮的对象
var btn = document.getElementById("sub_btn");
//为按钮绑定单击响应函数
btn.onclick = function(){
//点击以后使按钮不可用
this.disabled=true;
//当将提交按钮设置为不可用时,会自动取消它的默认行为
//手动提交表单
this.parentNode.submit();
};
};
- 第三种情况:
表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。
- 产生的原因:
因为服务器在处理请求时,不会检查是否为重复提交的请求。
- 解决方案:
使用一个token的机制。
- token就是令牌的意思。
- 服务器在处理请求之前先来检查浏览器的token。
- token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token
- 服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面
- 服务器所创建的token只能使用一次。
- token一般使用一个唯一的标识。
- 表单重复提交的危害:
- 向数据库中插入大量的重复且没有意义的数据,占用服务器的资源。
- 处理请求服务器并没有检查请求是否为重复的请求,导致恶意的攻击。
Session的引入以及Cookie的不足的更多相关文章
- Django(十三)状态保持 —— cookie与session+ajax异步请求+session记住登录状态+cookie记住登录名密码
一.状态保持的概述 http协议是无状态的.下一次去访问一个页面时并不知道上一次对这个页面做了什么.因此引入了cookie.session两种方式来配合解决此问题. Duplicate entry:重 ...
- 【转】Session ID/session token 及和cookie区别
Session + Cookie 知识收集! cookie机制采用的是在客户端保持状态的方案.它是在用户端的会话状态的存贮机制,他需要用户打开客户端的cookie支持.cookie的作用就是为了解决 ...
- Session id实现通过Cookie来传输方法及代码参考
1. Web中的Session指的就是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间.因此从上述的定义中我们可以看到,Session实际上是一个特定的 ...
- session详解&和cookie的区别
session简介 1. 定义 session用来保存会话数据, 将数据保存到服务器中. 2. 作用 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),一个浏览器独占一 ...
- session,ajax 跨域cookie
什么是Session, 什么是Cookie? Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,用该SessionID为标识符来 ...
- 关于session的实现:cookie与url重写
本文讨论的语境是java EE servlet. 我们都知道session的实现主要两种方式:cookie与url重写,而cookie是首选(默认)的方式,因为各种现代浏览器都默认开通cookie功能 ...
- Session、SessionId和Cookie的关系
Session是保存在服务器中的,SessionId是保存在Cookie中的. 当用户·登录时候,系统会将"用户名"和"密码"保存到Session中,系统会给每 ...
- javaWeb学习总结(7)-关于session的实现:cookie与url重写
本文讨论的语境是java EE servlet.我们都知道session的实现主要两种方式:cookie与url重写,而cookie是首选(默认)的方式,因为各种现代浏览器都默认开通cookie功能, ...
- requests库使用:通过cookie跳过验证码登录,并用Session跨请求保持cookie
拿我平时测试的一个系统为例,从UI层面来说必须先登录才可以进行后续操作,但是我在测试接口文档提供的接口时,发现并不需要登录,每个接口只要传参就可以正常返回.原因是我们这边专门弄了一个接口包来统一管理常 ...
随机推荐
- Eclipse添加struts2
参照:http://jingyan.baidu.com/article/915fc414fd94fb51394b208e.html 一.插件下载:http://struts.apache.org/do ...
- js 设置下拉框的默认值
设置下拉框的默认值,直接在option中增加selected就可以了.但是现在要使用JS来设置它的默认值,代码如下: <select name="aaa" id=" ...
- DotNetCore跨平台~Dockerfile的解释
回到目录 大叔感觉网上对Dockerfile的说明不是很清楚,或者说怎么去用说的不清楚,在vs2017里我们可以去建立自己的Dockerfile文件,然后你的项目可以被生成一个镜像,把它推到仓库之后, ...
- [CF787D]遗产(Legacy)-线段树-优化Dijkstra(内含数据生成器)
Problem 遗产 题目大意 给出一个带权有向图,有三种操作: 1.u->v添加一条权值为w的边 2.区间[l,r]->v添加权值为w的边 3.v->区间[l,r]添加权值为w的边 ...
- 学习java应该了解一些html超文本标记语言(前端)
在自己学习的过程中遇到一些内容,怕忘记所以借助博客加深印象也方便查找! html超文本标记语言中,分行级元素和块级元素. 行级元素的含义:行级元素不独占一行,相邻的行级元素在一行排列:行级元素可以控制 ...
- java面向对象浅析
1.(了解) 面向对象 vs 面向过程 例子:人开门:把大象装冰箱 2.面向对象的编程关注于类的设计!1)一个项目或工程,不管多庞大,一定是有一个一个类构成的.2)类是抽象的,好比是制造汽车的图纸. ...
- 标准IO:常用函数集合
stdio : 标准IO (1) 流(stream)和文件(file) 流和文件 在Turbo C2.0中是有区别的, Turbo C2.0 为编程者和被访问的设备之间提供了一层抽象的东西, 称之为 ...
- 输出a-b之间的随机数并考虑异常
输出a-b之间的随机数并考虑异常 代码如下: package Day05;import java.util.Scanner;import java.util.Random; public class ...
- django MVC模式 数据库的操作mysql
介绍:本节课我们继续学习djangoWEB框架的开发,这节课主要是学习如何访问数据库,django如何自动为我们创建好表结构等相关内容. 1.首先我们打开settings.py找到DATABASES关 ...
- 微信小程序开发问答《五十四》同步请求授权 & 用户拒绝授权,重新调起授权 ... ...
1.同步请求授权 需求分析: 1.在小程序首次打开的时候,我需要同时请求获取多个权限,由用户逐一授权. (['scope.userInfo','scope.userLocation','scope.a ...