.2 session
是服务器端共享数据。
-
概念:在一次会话的多次请求之间共享数据,将数据保存在服务器端session对象中。
基操:
-
1.获取session对象
request.getSession();==>getSession(true); 直接获取session,如果session不存在,就创建一个。
request.getSession(false); 获取已经存在的session对象,如果不存在获取到null。
-
2.使用session对象
setAttribute(String name,Object value);设置session的值 getAttribute(name);根据session的名字,获取session的值 removeAttribute(String name);删除session
如果使用请求的转发,可以通过request将数据转发到jsp页面,但是导致页面的路径不会改变,如果使用重定向,可以改变地址栏路径,但是不能通过request传输数据,所以此时用session进行数据的共享。
request 在一次请求之间共享数据。
session在一次对话(多次请求)之间共享数据。
设置session得失效时间。默认30分钟。
HTTP 是一种"无状态"协议,这意味着每次客户端检索网页时,客户端打开一个单独的连接到 Web 服务器,服务器会自动不保留之前客户端请求的任何记录。
但是仍然有以下三种方式来维持 Web 客户端和 Web 服务器之间的 session 会话:
HttpSession 对象
除了上述的三种方式,Servlet 还提供了 HttpSession 接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
Servlet 容器使用这个接口来创建一个 HTTP 客户端和 HTTP 服务器之间的 session 会话。会话持续一个指定的时间段,跨多个连接或页面请求。
您会通过调用 HttpServletRequest 的公共方法 getSession() 来获取 HttpSession 对象,如下所示:
HttpSession session = request.getSession();
你需要在向客户端发送任何文档内容之前调用 request.getSession()。下面总结了 HttpSession 对象中可用的几个重要的方法:
序号 | 方法 & 描述 |
---|---|
1 | public Object getAttribute(String name) 该方法返回在该 session 会话中具有指定名称的对象,如果没有指定名称的对象,则返回 null。 |
2 | public Enumeration getAttributeNames() 该方法返回 String 对象的枚举,String 对象包含所有绑定到该 session 会话的对象的名称。 |
3 | public long getCreationTime() 该方法返回该 session 会话被创建的时间,自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
4 | public String getId() 该方法返回一个包含分配给该 session 会话的唯一标识符的字符串。 |
5 | public long getLastAccessedTime() 该方法返回客户端最后一次发送与该 session 会话相关的请求的时间自格林尼治标准时间 1970 年 1 月 1 日午夜算起,以毫秒为单位。 |
6 | public int getMaxInactiveInterval() 该方法返回 Servlet 容器在客户端访问时保持 session 会话打开的最大时间间隔,以秒为单位。 |
7 | public void invalidate() 该方法指示该 session 会话无效,并解除绑定到它上面的任何对象。 |
8 | public boolean isNew() 如果客户端还不知道该 session 会话,或者如果客户选择不参入该 session 会话,则该方法返回 true。 |
9 | public void removeAttribute(String name) 该方法将从该 session 会话移除指定名称的对象。 |
10 | public void setAttribute(String name, Object value) 该方法使用指定的名称绑定一个对象到该 session 会话。 |
11 | public void setMaxInactiveInterval(int interval) 该方法在 Servlet 容器指示该 session 会话无效之前,指定客户端请求之间的时间,以秒为单位。 |
4. cookie和session得区别?
为什么要用cookie和session 因为http协议是一个无连接,无状态的协议,每一次请求之间互相独立,互不关联,所以无法在多次 请求之间共享数据,cookie和session解决的问题就是不同请求共享数据问题。 一次会话中包含多次请求和响应。 什么是一次会话:浏览器第一次给服务器发送请求开始---》到任意一方断开为止。 功能:在一次会话的范围内,多次请求之间共享数据。
3. cookie的注意事项
-
一次可不可以发送多个cookie
可以。
-
cookie在浏览器中的保存时间
-
默认情况下:当浏览器关闭后cookie被销毁
-
持久化存储:
-
setMaxAge(int seconds)方法
-
正数:将cookie存储到硬盘中,数字大小就是cookie的存活时间 以秒计
-
负数:默认
-
-
-
-
cookie中能不能存中文
-
tomcat8之前不行,tomcat8之后可以
-
4. cookie的特点:
1.存储数据在浏览器端
2.浏览器对单个cookie 的数据大小有限制(4k--),同一个域名下的总cookie个数也有限制(<20)
-
数据也有限制,只能是字符串,特殊字符也不能有。
使用:免登录操作(记住密码)。
删除 Session 会话数据
当您完成了一个用户的 session 会话数据,您有以下几种选择:
- 移除一个特定的属性:您可以调用 public void removeAttribute(String name) 方法来删除与特定的键相关联的值。
- 删除整个 session 会话:您可以调用 public void invalidate() 方法来丢弃整个 session 会话。
- 设置 session 会话过期时间:您可以调用 public void setMaxInactiveInterval(int interval) 方法来单独设置 session 会话超时。
- 注销用户:如果使用的是支持 servlet 2.4 的服务器,您可以调用 logout 来注销 Web 服务器的客户端,并把属于所有用户的所有 session 会话设置为无效。
- web.xml 配置:如果您使用的是 Tomcat,除了上述方法,您还可以在 web.xml 文件中配置 session 会话超时,如下所示:
<session-config> <session-timeout>15</session-timeout> </session-config>
上面实例中的超时时间是以分钟为单位,将覆盖 Tomcat 中默认的 30 分钟超时时间。
在一个 Servlet 中的 getMaxInactiveInterval() 方法会返回 session 会话的超时时间,以秒为单位。所以,如果在 web.xml 中配置 session 会话超时时间为 15 分钟,那么 getMaxInactiveInterval() 会返回 900。