Servlet基础知识Cookie和Session
文章目录
HTTP请求格式
一个HTTP请求分为四部分:
- 请求行
- 请求头部
- 空行
- 请求数据
1、请求行
请求行由请求方法字段、URL字段和HTTP版本字段三个字段组成,用空格分隔。
如:GET /index.html HTTP/1.1
2、请求头部
请求头部由关键字/值对组成,每一行一对,关键字和值之间用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,常用的请求头有Cookie
状态码
200——响应成功
301——永久重定向,搜索引擎将删除源地址,保留重定向地址
302——暂时重定向,重定向地址由响应头中的Location属性指定。由于搜索引擎的判定问题,较为复杂的URL容易被其他网站使用更精简的URL及302重定向劫持
400——客户端请求有语法错误,不能被服务器识别
500——服务器内部错误
Cookie
1、什么是cookie
cookie用来在浏览器端存储用户的状态信息,然后再访问后端的时候将这部分信息带回到后端。
cookie的主要内容包括:名字、值、过期时间、路径和域。
2、Cookie工作原理
- 发起请求时:浏览器检查所有存储的cookie,如果某个cookie所声明的作用范围(由路径和域决定)大于等于将要请求的资源所在的位置,则把cookie附在请求资源的HTTP请求头上发送给服务器。
- 处理请求时:在服务端,一般会对请求头中带的cookie信息做检查(比如说登录检查),如果检查通过,才能进行实际的业务处理。
- 如果校验不通过,例如没有找到cookie或者cookie信息不正确(可能会是伪造的),跳转让其登录,登录完成之后,在响应中返回cookie信息,浏览器会根据返回的cookie信息,保存在硬盘或者内存中供下次使用。
3、Servlet中操作Cookie时常用的方法
方法 | 描述 |
---|---|
public void setDomain(String pattern) | 设置cookie的作用域,如haimeng.blog.csdn.net |
public String getDomain() | 获取cookie适用的域 |
public void setMaxAge(int expiry) | 设置cookie的过期时间(以s为单位),如果不设置会在当前session会话中持续有效 |
public int getMaxAge() | 返回cookie的最大生存周期(以s为单位),默认情况下,-1表示cookie将持续下去,直到浏览器关闭 |
public String getName() | 该方法返回cookie的名称,名称在创建后不能改变 |
public void setValue(String newValue) | 设置与cookie关联的值 |
public String getValue() | 获取与cookie关联的值 |
public void setPath(String uri) | 设置cookid适用的路径。如果不指定路径,与当前页面相同目录下的(包括子目录下的)所有URL都会返回cookie |
public String getPath() | 获取cookie适用的路径 |
public void setSecure(boolean flag) | 设置布尔值,表示cookie是否应该只在加密的(即SSL)连接上发送 |
public void setComment(String purpose) | 设置cookid注释,该注释在浏览器向用户呈现cookie时非常有用 |
public String getComment() | 获取注释,如果没有返回null |
使用示例:
Cookie创建实例:
Cookie cookie = new Cookie("key","value");
cookie.setMaxAge(60*60*24); //设置过期时间,以s为单位
response.addCookie(cookie);
要通过Servlet读取Cookie,只需要通过调用HttpServletRequest的getCookies()方法创建一个javax.servlet.http.Cookie对象的数组。然后再循环遍历数组,并使用getName()和getValue方法来访问每一个Cookie和关联的值即可。
Cookie删除实例:
//删除第i个Cookie
Cookie cookie = HttpServletRequest.getCookies()[i];
cookie.setMaxAge(0);
response.addCookie(cookie);
Session
1、什么是session
Session是用来在服务器端保存用户的信息。
使用场景:
比如购物车,在用户点击“下单”按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建特定的session,用于标识这个用户,并且跟踪用户,这样才知道购物车里面有什么。这个session是保存在服务端的,有一个唯一标识。在服务端保存session的方法很多,内存、数据库、文件都可以。
2、工作原理
- 浏览器发起请求时,服务器首先读取请求头中的Session信息。如果没有找到Session信息或者本地检索不到此Session ID,就新生成一个Session ID,存储到服务器硬盘或者内存中。
- 浏览器接收到响应,会将这个返回的Session ID在本地内存也保存一份,供下次请求使用。Session保存在本地的其中一种实现方案是保存信息在Cookie上,但是实际上Cookie并不是Session保存的唯一解决方案,使用URL重写的方式也可以(把Session id直接附加在URL路径后面)。
3、实现Web客户端和Web服务器维持Session会话的四种方式
- Cookies————一个Web服务器可以分配一个唯一的Session会话ID作为每个Web客户端的Cookie,对于客户端的后续请求可以使用接收到的Cookie来识别。这不是一个有效的方法,因为很多浏览器不支持Cookie,所以不建议使用这种方式来维持Session会话
- 隐藏的表单字段————一个Web服务器可以发送一个隐藏的HTML表单字段,以及一个唯一的Session会话ID,例如:
<input type="hidden" name="session_id" value="123456">
该条目意味着,当表单被提交时,指定的名称和值会被自动包含在GET和POST数据中。每次当Web浏览器发送请求时,session_id值可以用于保持不同的Web浏览器的跟踪。
这是一种保持Session会话跟踪的有效方式,但是单击常规的超文本链接(<a href …>)不会导致表单提交,因此隐藏的表单字段也不支持常规的Session会话跟踪。 - URL重写————可以在每个URL末尾追加一些额外的数据来标识Session会话,服务器会把该Session会话标识符与已存储的有关Session会话的数据相关联。例如:https://haimeng.blog.csdn.net/file.htm;sessionid=12345,Session会话标识符被附加为sessionid=12345,标识符可被Web服务器访问以识别客户端。
URL重写是一种更好的维持Session会话的方式,它在浏览器不支持Cookie是能够很好的工作,但是它的缺点是会动态生成每个URL来为页面分配一个Session会话ID,即使是在很简单的静态HTML页面中也会如此。
4、HttpSession
除了上面的3中方式,Servlet还提供了HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。Servlet容器使用这个接口来创建一个HTTP客户端和HTTP服务器之间的Session会话。会话持续一个指定的时间段,跨多个连接或页面请求。通过调用HttpServletRequest的公共方法getSession()来获取HttpSession对象
如:
HttpSession session = request.getSession();
4、HttpSession对象常用方法
方法 | 描述 |
---|---|
public void setAttribute(String name,Object value) | 使用指定的名称绑定一个对象到该Session会话 |
public Object getAttribute(String name) | 返回在该Session会话中具有指定名称的对象 如果没有则返回null |
public Enumeration getAttributeNames() | 返回String对象的枚举 String对象包含所有绑定到该Session会话的对象的名称 |
public long getCreationTime() | 返回Session会话创建的时间 自格林尼治标准时间1970年1月1日午夜算起,以ms为单位 |
public String getId() | 返回一个包含分配给该Session会话的唯一标识符的字符串 |
public long getLastAccessedTime() | 返回客户端最后一次发送与该Session会话相关的请求的时间 自格林尼治标准时间1970年1月1日午夜算起,以ms为单位 |
public void setMaxInactiveInterval(int interval) | 在Servlet容器指示该Session会话无效之前,指定客户端请求之间的时间,以s为单位 |
public int getMaxInactiveInterval() | 返回Servlet容器在客户端访问时Session会话打开的最大时间间隔,以s为单位 |
public void invalidate() | 指示该Session会话无效,并解除绑定到它上面的任何对象 |
public boolean isNew | 如果客户端不知道该Session会话 或者如果客户选择不参与该Session会话,则该方法返回true |
public void removeAttribute(String name) | 将从Session会话移除指定名称的对象 |
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!