Cookie
Cookie是servlet发送到web浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器,
cookie一般用来保存session的id的会话。
一个Cookie拥有一个名称、一个值和一些可选属性,比如注释、路径和域限定符、最大生存时间和版本号
Servlet通过使用HttpServletResponse的addCookie(cookie)方法将 Cookie发送到浏览器,该方法将字段添加到HTTP响应头发送到浏览器。浏览器支持每台Web服务器有20个Cookie,总共有300个Cookie,每个Cookie的大小默认为4KB
浏览器通过向HTTP请求头添加字段将Cookie返回给Servlet。可使用HttpServletRequest的getCookies()方法从请求中获取Cookie
Cookie通过名称和路径来进行区分
Cookie的常用方法
1.Cookie(String name, String value) 构建通过key/value保存的信息
例子:
2.void setMaxAge(int time)设置Cookie的最大生存时间,以秒为单位。负值浏览器退出时删除。0值会导致删除cookie
例子:
3.int getMaxAge() 返回以秒为单位指定的Cookie最大生存时间(默认生存时间为-1)
例子:
4.String getName() 返回Cookie名称,名称在创建之后不能更改
例子:
5.String getValue() 返回cookie值
例子:
6.void setPath(String uri) 指定客户端应该返回cookie的路径,对于指定目录中的所有页面及该目录子目录中的所有页面都是可见的
例子:
7.void setDomain(String pattern) 指定应在其中显示此Cookie的域
8.String getDomain() 返回为此Cookie设置的域名
(设置 cookie 不能设置中文)
重写URL
为什么要对URL重写
–客户端不支持Cookie或禁用Cookie
–服务器端不能通过Cookie获取jsessionid
URL重写
–将jsessionid加入到URL之后
–使用HttpServletResponse迚行重写
• String encodeURL(String url) 通过将会话ID包含在指定URL中并对该 URL进行编码。如果
不需要编码,则返回未更改的URL
• String encodeRedirectURL(String url) 对指定URL进行编码,以便在 sendRedirect方法中使
用它,如果不需要编码,则返回未更改的URL(可判断是否需要将ID加入URL)
防止表单重复提交
思路:
在服务端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时在当前用户的session域中保存这个Token。然后将Token发送到客户端的form表单中,在form表单中使用隐藏域来存储这个Token,表单提交的时候连同这个Token一起提交到服务端,然后在服务端判断客户端提交上来的Token与服务端生成的Token是否一致,如果不一致,那就是重复提交了,此时服务端就可以不处理重复提交的表单了。如果相同则处理表单提交,处理完后清理当前用户的session域中存储的标识号
重复提交的几种情况?
①在表单提交到一个servlet,而servlet又通过请求转发的方式到jsp页面,地址栏里面还保存着servlet的路径,然后在响应页面点击刷新,这就是重复提交
②在响应页面没有到达时,重复点击提交按钮
③点击返回,直接点击提交
如何避免表单重复提交?
在表单做一个标记,提交到servlet,检查标记是否存在,检查标记和预定义的标记是否一致,如果一致,受理请求,销毁标记,如果不一致,或没有标记,则直接响应页面提示信息,“重复提交”。
第一种方式:
提供一个隐藏域(pass), 原因:无法准确获取请求的信息
第二种方式:
放在request中(pass),原因:因为表单页面刷新后,当前request已经被销毁了,再提交,已经是新的request了
第三种方式:
把标记放在session中:(pass)
- 把原表单页面生成随机token
- 在原表单页面,把token值放入session属性
- 在原表单中,token值放到隐藏域
- 在目标servlet中,获取session和隐藏域中的token的值,比较两个值
若一致,受理请求且把session的请求的值销毁
若不一致,提示表单已经提交过了