会话技术Cookie和Session以及Servlet的域对象总结
概念:
- 1.可以简单的理解为用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭·浏览器,整个过程称为一次会话。
- 2.会话的优势:每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。
原理
- 1.Cookie技术:Cookie是客户端技术,程序把每个用户的数据以Cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样web资源处理的就是用户各自的数据了。
- 2.Session技术:Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session 中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。
Cookie会话技术
- 1.代码演示:记录浏览器上一次访问服务端的时间
package com.ser;
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;
import java.util.Date;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取从浏览器带过来的Cookie
Cookie[] cookies = req.getCookies();
//遍历浏览器带过来的Cookie
for (int i = 0; i < cookies.length; i++) {
Cookie cookie = cookies[i];
if ((cookies!=null)&&(cookie.getName().equals("lasttime"))) {
String value = cookie.getValue();
long l = Long.parseLong(value);
Date date = new Date(l);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("你上一次访问时间为:" + date.toLocaleString());
break;
} else {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("这是第一次访问本网站");
}
}
//创建Cookie就数据存入其中
Cookie cookie = new Cookie("lasttime",System.currentTimeMillis()+"");
//给Cookie设置有效路径
cookie.setPath("/web03_war_exploded");
//给Cookie设置有效时长,不设置的话cookie默认只存在一次会话
//如果想使cookie失效cookie.setMaxAge();设置为零就可以
cookie.setMaxAge(60*60);//设置为一个小时
//将Cookie回写发送到浏览器
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- web.xml
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>hello9</servlet-name>
<servlet-class>com.ser.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello9</servlet-name>
<url-pattern>/do9</url-pattern>
</servlet-mapping>
</web-app>
Cookie的分类
- 1.默认级别的Cookie:指的是没有设置有效时间的Cookie, 默认的情况下只要关闭了浏览器,cookie 也会被销毁。( cookie存在于浏览器的内存中,当关闭了浏览器cookie 就销毁了)。
- 2.持久级别的Cookie:指的是有有效时间的Cookie,这种Cookie的内容不是保存在浏览器的内存中,而是将cookie的内容保存(持久化)到硬盘上。这个时候,关闭浏览器,再次打开浏览器会加载硬盘上的文件,从而Cookie中的数据就不会丢失。
- 3.设置Cookie有效时间的方法上述代码已经演示。
Cookie使用注意事项
- 1.一个 Cookie 只能标识一种信息,至少含有一个标识该信息的名称和值。
- 2.一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的cookie。
- 3.浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。总结:浏览器存放的Cookie的大小和个数是有限制的。
- 4.如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie 。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调setMaxAge(int maxAge)方法,以秒为单位的。
- 5.需要手动删除持久性cookie,可以将cookie 的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。
Session会话技术(重点)
1.概念:
- Session称为是一次会话,cookie将用户产生的私有的数据保存到浏览器端,Session将用户产生的私有的数据保存到服务器端。注意:一个浏览器独占一个session对象。因此,在需要保存用户数据时候,服务器程序可以将用户数据写到 session对象中,当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,为用户服务。
2.Cookie和Session比较
- 1.Cookie局限性:Cookie保存的数据是有个数和大小的限制的。数据是保存客户端浏览器上〈相对不是很安全)。
- 2.Session优势:Session没有个数和大小限制,数据是保存在服务器上(相对比较安全)。
3.Session的创建
- Session对象由服务器创建,开发人员可以调用request对象的getsession方法得到 session对象。
4.Session的代码演示以及方法说明
package com.ser;
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 SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session
HttpSession session = req.getSession();
//给Session中存东西
session.setAttribute("name","文奇");
//获取Session的ID
String sessionId = session.getId();
//判断Session是不是新创建的
if (session.isNew()){
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("session创建成功,sessionId为:"+sessionId);
}else {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("session已经在服务器中存在了,sessionId为:"+sessionId);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
package com.ser;
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 SessionServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session
HttpSession session = req.getSession();
//获取Session中存东西
Object name = session.getAttribute("name");
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().println("session中的值为:"+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
package com.ser;
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 SessionServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取Session
HttpSession session = req.getSession();
//移除session中存东西
session.removeAttribute("name");
//手动注销Session
session.invalidate();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
- 设置session的有效时间
<!--设置session的有效时间为15分钟,15分钟后自动注销-->
<session-config>
<session-timeout>15</session-timeout>
</session-config>
Servlet的域对象总结
1.请求范围(ServletRequest)
-
1.创建和销毁
- 创建:当用户向服务器发送一次请求,服务器创建一个request对象。
- 销毁:当服务器对这次请求作出响应,服务器就会销毁这个request对象。
-
2.如何存取数据
- 存数据:setAttribute
- 取数据:getAttribute
-
3.作用范围
- 范围:一次请求。(转发就是一次请求)。
1.会话范围(HttpSession)
-
1.创建和销毁
- 创建:服务器端第一次调用getSession方法的时候。
- 销毁:三种情况。
- Session过期,默认过期时间为30分钟。
- 非正常关闭服务器。(正常关闭服务器Session会被序列化)
- 手动调用session.invalidate();
-
2.如何存取数据
- 存数据:setAttribute
- 取数据:getAttribute
-
3.作用范围
- 范围:一次会话(多次请求)。
1.应用范围(ServletContext)
-
1.创建和销毁
- 创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。。
- 销毁:服务器关闭的时候,或者项目从服务器中移除的时候。
-
2.如何存取数据
- 存数据:setAttribute
- 取数据:getAttribute
-
3.作用范围
- 范围:整个web应用