会话
(1)什么是会话
会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;
有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;
(2)保存会话的两种技术
1.cookie 客户端技术
服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了;
2.session 服务端技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!
服务器登记你来过了,下次你来的时候我来匹配你;
Cookie
(1)概念
Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持。
(2)步骤
- 服务器脚本发送一系列 cookie 至浏览器。比如名字,年龄,ID 号码等等。
- 浏览器在本地机中存储这些信息,以备不时之需。
- 当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。
(3)方法举例
1 public void setDomain(String pattern)
//设置 cookie 的域名,比如 runoob.com
2 public String getDomain()
//获取 cookie 的域名,比如 runoob.com
3 public void setMaxAge(int expiry)
//设置 cookie 有效期,以秒为单位,默认有效期为当前session的存活时间
4 public int getMaxAge()
//获取 cookie 有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止
5 public String getName()
//返回 cookie 的名称,名称创建后将不能被修改
6 public void setValue(String newValue)
//设置 cookie 的值
7 public String getValue()
//获取cookie的值
8 public void setPath(String uri)
//设置 cookie 的路径,默认为当前页面目录下的所有 URL,还有此目录下的所有子目录
9 public String getPath()
//获取 cookie 的路径
10 public void setSecure(boolean flag)
//指明 cookie 是否要加密传输
11 public void setComment(String purpose)
//设置注释描述 cookie 的目的。当浏览器将 cookie 展现给用户时,注释将会变得非常有用
12 public String getComment()
//返回描述 cookie 目的的注释,若没有则返回 null
(4)使用jsp设置cookie
使用 JSP 设置 cookie 包含三个步骤:
1.创建一个 cookie 对象
Cookie cookie = new Cookie("key","value");
2.设置有效期
//调用 setMaxAge() 函数表明 cookie 在多长时间(以秒为单位)内有效。下面的操作将有效期设为了 24 小时。
cookie.setMaxAge(60*60*24);
3.将 cookie 发送至 HTTP 响应头中
//调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。
response.addCookie(cookie);
(5)如何删除Cookie
- 不设置有效期,关闭浏览器自动失效
- 设置有效时间为0
(6)Cookie来测试用户是否来过
package com.westos.serlvet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieTest extends HttpServlet {
boolean flag = false;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决乱码问题:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//检查请求的人是否带了Cookie
//通过用户的请求,检查它是否有cookie
Cookie[] cookies = request.getCookies();
System.out.println("cookie:"+cookies);
if (flag){//如果flag是真,来过
if (cookies!=null){//你有cookie
for (int i = 0; i < cookies.length ; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastLoginTime")){
response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
System.out.println("刷新了cookie");
}
}
}
}else { //如果flag是真,没来过
response.getWriter().println("你是第一次来,还想要会员套餐");
System.out.println("给该用户一个cookie");
}
//建立一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie保存的时间
//cookie.setMaxAge();
//把这个cookie发给客户端
response.addCookie(cookie);
//response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
flag = true;
}
}
Session
(1)概念
- 服务器会给每一个用户(浏览器)创建一个Seesion对象;
- 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
- 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……
- JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。
(2)Session和Cookie的区别
- Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
- Session对象由服务创建;
(3)Session的方法
1 public Object getAttribute(String name)
//返回session对象中与指定名称绑定的对象,如果不存在则返回null
2 public Enumeration getAttributeNames()
//返回session对象中所有的对象名称
3 public long getCreationTime()
//返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
4 public String getId()
//返回session对象的ID
5 public long getLastAccessedTime()
//返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
6 public int getMaxInactiveInterval()
//返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
7 public void invalidate()
//将session无效化,解绑任何与该session绑定的对象
8 public boolean isNew()
//返回是否为一个新的客户端,或者客户端是否拒绝加入session
9 public void removeAttribute(String name)
//移除session中指定名称的对象
10 public void setAttribute(String name, Object value)
//使用指定的名称和值来产生一个对象并绑定到session中
11 public void setMaxInactiveInterval(int interval)
//用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效
(4)Session使用
一个连接对应一个session,session可以在一个会话中传递信息;
通过setAttribute设置值;
通过getAttribute获得 值;
由于是由服务器控制的,服务器一旦重启,信息就会丢失
package com.westos.serlvet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
public class SessionTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//Session由服务器自动创建,如何获得session
//HttpSession 得到的sessioin对象
HttpSession session = req.getSession();
//得到sessionID,一次会话,一个seesionID;
String id = session.getId();
resp.getWriter().println("获得的sessionId:\n"+id);
String name = "qinjiang";
//向session中存入一个值;
session.setAttribute("name",name);
resp.getWriter().println("存入信息成功:"+name);
}
}
package com.westos.serlvet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
//获得session存入的值
public class SessionTest2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//获得
HttpSession session = req.getSession();
System.out.println("得到的SessionID:"+session.getId());
String name = (String) session.getAttribute("name");
resp.getWriter().println("得到的session存入的信息"+name);
//Servlet < Seesion < WebContext
}
}
(5)会话的注销:
方式一:
session.invalidate();//通过代码注销会话
方式二:(在web.xml进行)
<!--session-config可以设置会话自动过期,时间分钟为单位-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>