五、Session

一、session与cookie的区别
Cookie是把用户的数据写给用户的浏览器。
Session 技术把用户的数据写到用户独占的 session 中。
Session 对象由服务器创建,可以调用 request 对象的 getSession 方法得到 session 对象。
二、session实现原理
          服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。
              HttpSession session = request.getSession();
              session.setAttribute("session测试", session);
              if (session.isNew()) {
                     System.out.println(session.getId()+"创建成功");
              }else {
                     System.out.println("该id:"+session.getId()+"的session已经被创建过了");
              }
当session被创建出来后,会把id保存在cookie里。
三、获取session

HttpSession session = request.getSession();
session.setAttribute("name", "张三");
Object attribute = session.getAttribute("name");
System.out.println(attribute);
四、生命周期
1、创建:第一次调用getSession()创建cookie对象
2、销毁:
                 超时 默认30分钟从最后一次请求算起
                手动调用invalidate()方法
                非正常关闭服务器
3、钝化
    当我们使用正确的方式关闭tomcat,tomcat会把session对象以及session对象所存储的数据持久化到tomcat的work目录下,以便tomcat的work目录下,以便tomcat再次启动时可以恢复这些数据,当储存的为一个javabean对象,该对象要实现序列化接口

五、 session防止表单重复提交
   在平时开发中,如果网速比较慢的情况下,用户提交表单后,发现服务器半天都没有响应,那么用户可能会以为是自己没有提交表单,就会再点击提交按钮重复提交表单,我们在开发中必须防止表单重复提交。
    方案一:通过JavaScript
            
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML>
<html>
<head>
<title>Form表单</title>
<script type="text/javascript">
    var isCommitted = false;//表单是否已经提交标识,默认为false
    function dosubmit(){
        f(isCommitted==false){
             isCommitted = true;//提交表单后,将表单是否已经提交标识设置为true
             return true;//返回true让表单正常提交
        }else{
          return false;//返回false那么表单将不提交14             }
     }
</script>
</head>
<body>
<form action="${pageContext.request.contextPath}/servlet/DoFormServlet" οnsubmit="return dosubmit()" method="post">
用户名:<input type="text" name="username">
<input type="submit" value="提交" id="submit">
</form>
</body>
</html>
    
    方案二:利用session
         具体的做法: 在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:
                       存储session域中的Token(令牌)与表单提交的Token(令牌)不同
                    当前用户的Session中不存在Token(令牌)
                    用户提交的表单数据中没有Token(令牌)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值