1. Cookie:实际上就是一个头。
                   服务器会创建Cookie,并且将Cookie以一个响应头的形式发送给浏览器
                   浏览器收到Cookie以后,会保存Cookie,并且每次访问服务器时都会以请求头的形式带着Cookie
                   服务器就可以根据浏览器带着的Cookie来识别不同的用户

2.  Cookie的不足:
                            Cookie是纯文本的,使用起来不安全。
                            浏览器每次访问服务器都需要带着Cookie,无形中增加浏览器的流量。
                            浏览器对Cookie的数量和大小都有不同的限制,所以我们不能再Cookie中保存大量的信息。

3.  Cookie的信息最终都是要保存到浏览器上的,但是浏览器对Cookie的大小和数量都有限制,不能在Cookie中保存大量信息,但是在服务器中保存的内容的大小和 数量是没有限制的,所以可以将用户的信息保存到服务器上的一个对象中,并生成一个唯一的标识,然后将这个唯一的标识交给浏览器保存(以Cookie的形式),然后服务器中就可以根据这个标识找到他的对象, 服务器中的对象就是我们熟悉的HttpSession。

4.  HttpSession用来保存当前浏览器的会话的信息,每一次会话都对应一个session对象。
                            一个浏览器对应一个Session对象,不同浏览器之间不会共享Session
                            Session的默认有效时间是一次会话,一旦关闭浏览器以后Session对象将失效
                            每一个Session都有一个唯一的ID,我们只需要将ID交给浏览器,就可以通过ID来找到浏览器对应的那个Session对象。
                            当服务器创建一个新的HttpSession对象时,会将session的id以Cookie的形式发送给浏览器:
                            当浏览器再次访问服务器是,会以Cookie的形式带着Session的ID,服务器会去检查ID,并根据ID获取到HttpSession对象
                            Session在服务器内部是保存到一个叫做SessionMap的集合中,这个map的key是Session的ID,值就是Session对象

5. HttpSession工作机制
                            Session对象的创建时机
                            Session对象是在request.getSession()方法第一次被调用时创建。
                            在第一次访问JSP时,也会创建一个Session对象,因为在JSP对应的java文件中,已经调用过该方法了。
        6. UUID及时间戳:
                            UUID:是一个32位的唯一标识符,UUID是根据机器码以及时间戳生成的,所以UUID是全世界的一个唯一的标识符,
                            永远不会重复,一般使用UUID做为一个对象的唯一标识,或者做为数据库表中的一个主键!
                            生成UUID的码过程:

在此类中写如下生成uuid的代码
                                 

运行结果如下:

7.  有效时间

Session对象的默认有效时间是一次会话,这里并不是因为Session对象被销毁了,而是浏览器保存的JSESSIONID的这个Cookie丢失了。

能不能让Session对象,如何使关闭浏览器以后依然有效?通过修改JSESSIONID这个Cookie有效时间,让Session在关闭浏览器之后依然有效。         -

Session对象是有一个最大的闲置时间,一旦超过最大的闲置时间,则Session对象会被销毁。

我们可以在总的web.xml文件中配置Session对象的最大闲置时间

它的单位是分钟,可以在这里来修改,但是如果在这修改那么服务器中所有项目的闲置时间都会修改。

如果我们只想修改我们当前项目的闲置时间,可以在当前项目的web.xml文件中进行修改

8.  通过setMaxInactiveInterval来设置有效时间

当传一个大于0的数时,session的最大闲置时间会被设置为相应的秒数

//session.setMaxInactiveInterval(10);

当传一个等于0或小于0的数时,session对象会永远有效,所以尽量不给他设置负值

//session.setMaxInactiveInterval(0);          session.setMaxInactiveInterval(-100);

使Session立即失效      session.invalidate();

9. 当浏览器禁用Cookie时解决方法
                             Session的运行机制是基于Cookie。
                             如果浏览器禁用Cookie,那么Session机制将会失效。浏览器将不会保存JSESSIONID这个Cookie。

1、通过地址栏来传递Cookie的信息,自己手动加上;jsessionid
                                   http://localhost:8080/16_WEB_Session/2.jsp;jsessionid=2AA78907BE47396DA23DEB094269AFF3
                             2、可以通过在jsp中写路径时
                                   response.encodeRedirectURL("绝对路径")
                                   response.encodeURL("绝对路径")
                                   这两个方法来重写URL地址

(暂时无图)

3、当浏览器不支持Cookie时会自动的在地址后边加上Cookie的信息,还可以通过c:url标签来重写URL地址
                                   <c:url value="/2.jsp"></c:url>

(暂时无图)
                                   注意使用URL标签时,不用加上项目名,一般开发时,我们不太使用URL重写,因为URL重写不太安全。

10.  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钝化后的目标文件夹

11.  表单的重复提交,同一个表单中的内容多次提交到服务器中。

表单重复提交的危害:
                                 1、向数据库中插入大量的重复且没有意义的数据,占用服务器的资源。
                                 2、处理请求服务器并没有检查请求是否为重复的请求,导致恶意的攻击。
                            第一种情况:
                                         提交完表单以后,不做其他操作,直接刷新页面,表单会提交多次。这种情况产生的根本原因是,Servlet处理完请求以后,直接转发到目标页面。这样整一个业务,只发送了一次请求,那么当你在浏览器中点击刷新按钮或者狂按f5会一直都会刷新之前的请求。 
                              解决方案:
                                         使用重定向跳转到目标页面

      
                           第二种情况:
                                         在提交表单时,如果网速较差,可能会导致点击提交按钮多次,这种情况也会导致表单重复提交。产生的原因是因为提交按钮可以点击多次。
                              解决方案: 
                                         使提交按钮只能点击一次,通过js来完成。获取id为sub_btn的input并加入onclick事件。
                            
                              第三种情况:
                                         表单提交成功以后,直接点击浏览器上回退按钮,不刷新页面,然后点击提交按钮再次提交表单。产生的原因是因为服务器在处理请求时,不会检查是否为重复提交的请求。
                                解决方案:
                                        使用一个token的机制。
                                        token就是令牌的意思。
                                        服务器在处理请求之前先来检查浏览器的token。
                                        token由服务器来创建,并交给浏览器,浏览器在向服务器发送请求时需要带着这个token
                                        服务器处理请求前检查token是否正确,如果正确,则正常处理,否则返回一个错误页面
                                        服务器所创建的token只能使用一次。
                                        token一般使用一个唯一的标识。

在jsp页面中:


                                       在servlet中:
                               

最新文章

  1. bzoj2086【Poi2010】Blocks
  2. Linux之VSFTP服务
  3. 常用三方,Reachability 检测网络连接
  4. 【贪心】bzoj 3709:[PA2014]Bohater
  5. 2014年国人开发的最热门的.NET开源项目 TOP 25
  6. swfobject.js IE兼容问题
  7. php-redis扩展模块安装记录
  8. 30第二建筑Github Page
  9. OBS studio最新版配置鉴权推流
  10. springdataJAP的更新与保存的方法是同一个
  11. SpringBoot入门基础
  12. 移动前端webApp开发点滴积累20140524
  13. 第六周周赛——AK机会不易得,好好把握题解(出自HDU5650,codeforces 616A,624A,659A,655A,658A)
  14. MyBatis是如何解决Sql注入的
  15. CentOS 7以上版本Nginx开机自启
  16. 在mvc中动态加载菜单
  17. java中获取系统变量
  18. 【LeetCode】104. Maximum Depth of Binary Tree (2 solutions)
  19. fib博弈
  20. java 静态方法上的泛型

热门文章

  1. Java json框架简介
  2. C++中对象的构造顺序
  3. Ubuntu 解决wifi无法打开的问题 安装NVIDIA显卡驱动的正确姿势
  4. Python链表倒置的两种方法
  5. Redis哨兵功能与集群搭建
  6. 基于gulp的前端自动化方案
  7. Paper Reading
  8. IWorkspaceFactory pWorkspaceFactory = new ShapefileWorkspaceFactoryClass(); 时,报COMException
  9. FreeIPA部署及基本使用
  10. 关于&lt;input type=&quot;hidden&quot;/&gt;标签的记录