一.会话技术
简介:
会话简单理解为:用户打开一个浏览器,点击多个超链接访问服务器的web资源,然后关闭浏览器,整个过程称为是一次会话。
使用场景:
每个用户与服务器进行交互过程中,产生一些各自的数据,程序想要把这些数据进行保存,就需要使用会话技术。
例如:用户点击超链接购买一个商品,程序应该保存用户所购买的商品,以便于用户点击结账可以得到用户所购买的商品信息
会话技术分类:
- Cookie:
Cookie是客户端技术,程序把每个用户的数据以cookie的形式保存到各自浏览器中。当用户使用浏览器再次访问服务器中的web资源的时候,就会带着各自的数据过去。这样,web资源处理的就是用户各自的数据了。 - Session:
Session是服务器端技术,利用这个技术,服务器在运行时为每一个用户的浏览器创建一个独享的session对象。由于session为用户浏览器独享,所有用户在访问服务器的时候,可以把各自的数据放在各自的session中,当用户再次访问服务器中的web资源的时候,其他web资源再从用户各自的session中取出数据为用户服务。
两种技术的实现原理:
- Cookie:
浏览器访问服务器的时候会将已有的cookie带着过去,此时可以使用request.getCookies():这个方法来获取请求中cookie所附带的信息,然后在完成操作之后再将带有新的数据的cookie发送到浏览器,此时使用response.addCookie(cookie)这个方法。这个时候就可以将处理过后的数据存储到浏览器上
在这里有个注意事项:
使用下面的方法可以实现数据的持久化。
//在这里需要将用户名长久的存储,所以使用cookie对象
Cookie cookie = new Cookie("rember", reuser.getUsername());
//设置路径
cookie.setPath("/anli01");
//设置生存时间
cookie.setMaxAge(60*60*12);
//添加cookie
response.addCookie(cookie);
- Session:
当浏览器第一次访问服务器时,将会创建一个新的Session空间,然后服务器会返回到浏览器Session-ID(唯一标识,相当于开锁的钥匙),它的方法相当于一个域,它包含域的所有方法.
基于Cookie的,基于Cookie回写了一个Session的ID。
二.使用会话技术实现记录用户上次访问时间
代码:
编写Cookie工具类:
public class CookieUtil {
//根据指定的name来找到指定的cookie
public static Cookie getCookie(Cookie[] cookies,String sname){
if (cookies == null) {
return null;
}else{
//遍历整个cookie集,然后根据name来匹配
for (Cookie cookie : cookies) {
if (cookie.getName().equals(sname)) {
return cookie;
}
}
return null;
}
}
}
创建一个Servlet类:CookieServlet:
public class CookieServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtil.getCookie(cookies, "lastDate");
if (cookie == null) {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("欢迎使用");
} else {
response.setContentType("text/html;charset=UTF-8");
String value = cookie.getValue();
response.getWriter().println("上次登录的时间为"+value);
}
Cookie c = new Cookie("lastDate", new Date().toLocaleString());
c.setPath("/myday17");
//设置生存时间
c.setMaxAge(60*30);
//当设置时间为0的时候就是相当于将这个Cookie销毁
//c.setMaxAge(0);
response.addCookie(c);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
四.关于Cookie的使用
- 一个Cookie只用标识一种信息,至少含有一个标识该信息的名称和值。
- 一个web站点可以给一个浏览器发送多个Cookie。一个web浏览器可以存储多个web站点的Cookie。
- 浏览器一般只允许存放300个Cookie,每个站点最多可以存放20个Cookie,每个Cookie的大小限制为4KB(老版本浏览器)。-----浏览器存放的Cookie的大小和个数是有限制的。
- 如果创建了一个Cookie,并发送到浏览器,默认情况下它是一个会话级别的Cookie。用户退出浏览器就被删除。如果希望将这个Cookie存到磁盘上,需要设置有效时长调用setMaxAge(int
maxAge)方法,以秒为单位的。 - 需要手动删除持久性Cookie,可以将Cookie的有效时长设置为0.必须注意:删除Cookie时候,path必须一致,否则无法删除。
- 删除cookie其实就是添加一个name重复的coolie。
五.两种会话技术的区别
- Cookie:
Cookie保存的数据是有个数和大小的限制的。
数据是保存客户端浏览器上(相对不是很安全)。 - Session
Session没有个数和大小限制。
数据是保存在服务器上(相对比较安全)。
六.Servlet的数据访问范围(域的范围)
- ServletRequest:
请求范围
创建:当用户向服务器发送一次请求,服务器创建一个request对象。
销毁:当服务器对这次请求作出了响应,服务器就会销毁这个request对象。
作用范围:一次请求。(转发就是一次请求)。 - HttpSession
会话范围
创建:服务器端第一次调用getSession()方法的时候。
销毁:三种情况。
Session过期,默认的过期时间30分钟(web.xml中配置)。
非正常关闭服务器。(正常关闭服务器—session会被序列化)。
手动调用session.invalidate();
作用范围:一次会话(多次请求) - ServletContext
应用范围
创建:服务器启动的时候创建,为每个web项目创建一个单独ServletContext对象。
销毁:服务器关闭的时候,或者项目从服务器中移除的时候。
作用范围:整个应用 - 注意:对于域对象都有一样的方法:
存数据:
void setAttribute(String name,Object value);
取数据
Object getAttribute(String name);