cookie和session

一、应用场景

登录、购物车、移动端APP接口会话管理

二、cookie和session的区别

cookie--服务器与客户端资源保存,保存在客户端,不安全,容易被抓包;不支持跨浏览器;cookie默认浏览器关闭就失效,可通过setMaxAge()方式设置cookie有效时间,解决关闭浏览器就失效的问题。

session--保存在服务器端,存放在内存里,客户端与服务器端进行通讯使用SessionId,存放在服务器端。

cookie的实现流程:

session实现流程:

三、Token和SessionId

Token就是一个令牌,随机生成,有有效期,不能重复,可以

用jdk自带的UUID来实现。Token类似于SessionId。

四、表单重复提交问题的解决

1.通过前端解决

设置表单提交状态,已提交为ture,未提交为false

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Form表单</title>
<script type="text/javascript">
	var isFlag = false; //表单是否已经提交标识,默认为false

	function submitFlag() {

		if (isFlag == false) {
			isFlag = true;
			return true;
		} else {
			return false;
		}

	}
</script>
</head>

<body>
	<form action="${pageContext.request.contextPath}/DoFormServlet"
		method="post" onsubmit="return submitFlag()">
		用户名:<input type="text" name="userName"> <input type="submit"
			value="提交" id="submit">
	</form>
</body>
</html>

提交之后,设置提交按钮不可用,即常见的灰色

function dosubmit(){
    //获取表单提交按钮
    var btnSubmit = document.getElementById("submit");
    //将表单提交按钮设置为不可用,这样就可以避免用户再次点击提交按钮
    btnSubmit.disabled= "disabled";
    //返回true让表单可以正常提交
    return true;
}

2.通过后端解决

通过Token+session解决,在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的Session域中保存这个Token。然后将Token发送到客户端的Form表单中,在Form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务器端,然后在服务器端判断客户端提交上来的Token与服务器端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务器端就可以不处理重复提交的表单。如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。

为什么可以这样操作呢?是由于每次提交都会生成唯一的Token,比较token时,服务器只认第一次发送给用户Session域中的Token,若不是第一次提交时Session域中的Token,值肯定不一样。代码参考本地Session与Cookie实现原理。

  在下列情况下,服务器程序将拒绝处理用户提交的表单请求:

  1. 存储Session域中的Token(令牌)与表单提交的Token(令牌)不同。
  2. 当前用户的Session中不存在Token(令牌)
  3. 用户提交的表单数据中没有Token(令牌)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值