1.1 会话技术简介
会话可以简单理解为,一个用户打开一个浏览器,在同一个WEB应用上,点击多个超链接,访问多个WEB资源,然后关闭浏览器,那这整个过程我们称之为一个会话.
1.1.1 会话技术作用
会话技术可以保存用户在会话过程中所产生的数据
会话技术也可以让用户在同一个会话中实现数据的共享
会话应用场景的思路风暴
-
想保存数据到购物车 不重要 个人私有
- 保存哪里 服务器? 数据库 淘宝 京东 不登录
- 编程最重要的域对象 域对象 临时存储数据
-
浏览器
- 可能会被清掉 服务器怎么知道浏览器里面有购物车数据
- 每次访问服务器的时候把这个数据给带过去
-
服务器
- 占用空间 弄混 我怎么识别这个数据是谁的
- 我怎么让用户证明这个数据是他的
存在浏览器,主要问题是带来带去 存服务器主要问题是
我要识别这个数据是谁的
归根到底: 会话技术就是用来临时保存数据的
-
1.1.12 会话技术分类
-
cookie
- cookie是一种客户端技术,程序可以把每一个用户特有的数据,以响应头set- cookie发送给每一个用户的浏览器,那最终会以文件的形式保存在用户的硬盘上,
- 当用户再次使用浏览器来访问我们的WEB服务器,用户的浏览器会带上他特有的数据,而我们的程序所处理的则是来访用户特有的数据。
-
session
- session是一种服务器技术,WEB服务器会在运行时为每一个用户的每一个会话创建一个其独享的HttpSession对象,
- 由于session对象是用户独享的,所以我们可以使用session对象来保存用户在一个会话过程中所产生的数据。
- session对象也是一个域对象,范围是整个会话
-
注意:
- cookie 把数据保存在用户的硬盘上
- session 把数据保存在服务器的内存上
-
会话: 打开淘宝--浏览--关闭 一个会话
- cookie
- 存在浏览器
- 服务器先创建出来
- 随着响应带到浏览器,然后浏览器做临时保存,保存完之后,下次请求在带回去
- 优点:
- 减少服务器的压力,服务器内存可以少用一点
- 缺点:
- 换一个浏览器就获取不到
- 随时都会被清理,适合保存不重要的东西
- 带来带去,占用带宽,适合存小的东西,如果过大,用户等待的时候很长
- 数据传来传去, 不安全
- 总结: 不必要的,比较小的,不涉及安全性的内容,用cookie
- 存在浏览器
- session
- 存在服务器
- session 就是一个域对象,(setAttribute getAttribute,removeAttribute),就是通过这个保存数据
- cookie
1.2 Cookie 常用方法
1.2.1 Cookie的方法
方法 | 描述 |
---|---|
Cookie(String name, String value) | Constructs a cookie with a specified name and value. |
void setMaxAge(int expiry) | Sets the maximum age of the cookie in seconds. |
void setPath(String uri) | Specifies a path for the cookie to which the client should return the cookie. |
String getName() | Returns the name of the cookie. |
String getValue() | Returns the value of the cookie. |
1.2.2 关于Cookie对象的方法
Cookie[] cs = request.getCookies();
得到的是一个数组,通过遍历可以得到自己想要的Cookie信息
添加Cookie对象
response.addCookie(c);
其中参数c 为cookie对象
设置有效时间
void setMaxAge(int expiry)
cookie.setMaxAge(60 * 60 * 24);//有效期一天
cookie.setMaxAge(-1);//当浏览器关闭,会话结束后cookie会自动的被删除
cookie.setMaxAge(0);//cookie会立刻被删除
cookie.setMaxAge(Integer.MAX_VALUE);//最长的有效时间
设置路径
void setPath(String uri)//雾霾 江苏 南京市 上海
当用户访问这个路径下的web资源,或者是这个路径下子路径的资源,他都会自动携带这个cookie
cookie.setPath("/myCookie");//cookie的默认路径是当前WEB应用的根路径
cookie.setPath(request.getContextPath());//推荐使用这个方法,比较灵活
1.2.3 关于Cookie的一些细节
- 一个cookie只能用来标识一种信息,而cookie至少需要包含这个信息的名称和值
- 一个网站可以向一个浏览器提供多个cookie,而一个浏览器也可以接收多个网站所提供的cookie
- 一个浏览器一般最多可以接收300个cookie,一个网站所对应的cookie最多为20个,一个cookie大小限制为4kb
- 创建一个cookie对象,发送至客户端,那这个cookie他默认的级别是会话级别
- 会话级别:当用户关闭浏览器,会话结束了,那这个cookie也被删除了
[图片上传中...(记录用户上次访问时间分析.png-a00c2d-1522371203795-0)] - 如果需要把cookie保存在用户的硬盘上,需要设置cookie的有效时间(过期时间)
- cookie的名称和值都不可以使用中文,因为中文被认为是不安全的字符
1.3 Cookie 入门案例
图解
1.3.1 记录用户上次的访问时间
思路整理
- 拿到指定的cookie信息
- 判断是否为null
- 如果为null,给出提示信息
- 否则,获取上次的访问时间,并显示
- 获得当前的时间存在cookie当中,发到客户端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//记录用户上次的访问时间
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
//获取cookie信息
Cookie[] cs = request.getCookies();
if(cs != null) {
for (int i = 0; i < cs.length; i++) {
String name = cs[i].getName();
if("lastAccessTime".equals(name)) {
cookie = cs[i];
break;
}
}
}
//判断是否有上次的访问时间
if(cookie == null) {
//如果没有上次的访问时间,需要给出提示信息
out.println("欢迎第一次访问");
}
else {
//如果有上次的访问时间,需要获取上次的访问时间并显示
String value = cookie.getValue();
out.println("您上次的访问时间为:" + value);
}
//获取这次的访问时间(当前的系统时间)
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String now = sdf.format(new Date());
//创建Cookie对象
Cookie c = new Cookie("lastAccessTime",now);
//记录用户这次的访问时间,并发送至客户端
response.addCookie(c);
}
1.3.2 记住用户名
登录页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
Cookie[] cs = request.getCookies();
Cookie cookie = CookieUtils.getCookie(cs, "username");
String username = "";
String checked = "";
if (cookie != null) {
username = cookie.getValue();
checked = "checked = 'checked'";
}
out.println("<html>");
out.println("<head>");
out.println("<title>登录页面</title>");
out.println("</head>");
out.println("<body>");
out.println("<form action='/myCookie/LoginServlet' method='post'>");
out.println("用户名:<input type='text' name='username' value='"+username+"' />");
out.println("<br />");
out.println("密码:<input type='text' name='password' />");
out.println("<br />");
out.println("<input type='submit' value='登录' />");
out.println("<input type='checkbox' name='remember' value='1'"+checked+" />记住用户名");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
跳转页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
out.println("<h1>我是首页</h1>");
}
处理页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
//获取用户名
String username = request.getParameter("username");
//获取密码
String password = request.getParameter("password");
//获取复选框记住用户名的值
String remember = request.getParameter("remember");
System.out.println(username);
System.out.println(password);
//判断用户名和密码是否有效
if ("itcast".equals(username) && "123456".equals(password)) {
//登录成功
out.println("登录成功,3秒后跳转首页");
response.setHeader("Refresh", "3;URL=/myCookie/IndexServlet");
if ("1".equals(remember)) {
//需要记住用户名
//创建Cookie对象
Cookie cookie = new Cookie("username", username);
//设置cookie的有效时间
cookie.setMaxAge(Integer.MAX_VALUE);
//发送cookie至客户端
response.addCookie(cookie);
}else {
//不需要记住用户名
Cookie cookie = new Cookie("username", "");
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}else {
//登录失败
out.println("用户名或者密码错误,3秒后跳转到登录页面");
response.setHeader("Refresh", "3;URL=/myCookie/LoginUIServlet");
}
}