本文共 5966 字,大约阅读时间需要 19 分钟。
问题引出:我想大家都有这种经历,当我们在网页上访问一个网页时,比如博客,邮箱等一些需要登陆的网站。每当我们关闭浏览器,下次再进入该网站时我们还需要再登陆(当然有些浏览器可能会做处理,询问用户是否保存用户名和密码,这个是属于浏览器帮我们做的,不做考虑)。但是当我们登陆上去但是不关闭浏览器而去跳转到别的网站,我们再回来进入该网站时是不需要登陆的。
那么为什么会出现这种情况呢?——Cookie怎么来的? 简单的来说,当我们首次进入该网站登录时,会生成一个特殊的字符,这个特殊字符就是Cookie。那么当我们不关闭浏览器再去访问该网站时,它一看这个用户曾经来过,就不需要再登陆了。那么当我们关闭浏览器时,本次会话就结束了,会话结束时会自动将Cookie删除。 那么会话又是什么呢? 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。也就是打开浏览器会话产生,关闭浏览器会话结束。 保存会话的两种技术:Cookie和Session具体来说,cookie机制使用一种在客户端维护状态的方案。它是客户端会话状态的存储机制,他需要用户打开客户端的cookie支持。 Cookie的作用是解决HTTP协议中缺少无状态缺陷的问题。在我们Java语言中Cookie是有API的,是在javax.servlet.http.Cookie包下。我们就直接来看下Cookie类的构造和常用方法:
Cookie的构造方法
Cookie的普通方法
Cookie案例:测试用户是否来过
编写测试的Servlet代码
package com.muhan.cookie;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;//导入Servlet需要的Jar包,让该类继承HttpServlet类并重写doGet和doPost方法public class CookieTest01 extends HttpServlet { boolean flag = false;//设置一个标记 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //调用doPost方法是为了防止请求写错而导致测试失败 // 无论是什么get还是post请求都会调用doPost方法 doPost(req,resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置字符编码,防止中文乱码 req.setCharacterEncoding("utf-8"); resp.setCharacterEncoding("utf-8"); //检查用户的请求,检查是否有Cookie //通过请求对象req获取,返回值为存放着Cookie对象的数组 Cookie[] cookies = req.getCookies(); if (flag){//如果flag为true,说明用户来过 //判断Cookie[]是否为空,如果不为空遍历Cookie数组 if (cookies!=null){ for (int i = 0; i < cookies.length; i++) { //取出Cookie对象 Cookie cookie = cookies[i]; //判断Cookie的名字和我们给它设置的名字是否相同(下面会给设置) if (cookie.getName().equals("lastLoginTime")){ //如果Cookie对象的名字不为空,说明这个Cookie对象曾经来过 //那么就把这个Cookie的对象值响应到网页上,方便观察 resp.getWriter().println("上一次来的时间为:"+cookie.getValue()); } } } }else {//如果flag为false,说明用户没来过 //提示用户第一次来,并给用户分配Cookie resp.getWriter().println("你是第一次来,我给你分一个Cookie吧"); long nowTime = System.currentTimeMillis();//获取系统当前时间 String timeStr = String.valueOf(nowTime);//将系统当前时间转换为字符串,因为Cookie的值只能为String类型 //给用户分配一个名为lastLoginTime,值为系统当前时间的Cookie Cookie cookie = new Cookie("lastLoginTime",timeStr); //最后把这个设置好的Cookie对象响应给用户 resp.addCookie(cookie); //然后把标记改为true flag=true; } }}
配置web.xml
CookieTest01 com.muhan.cookie.CookieTest01 CookieTest01 /cookieTest.do
测试:
运行Tomcat,使用360浏览器或者chrome浏览器右键审查元素 我们发现只有两个浏览器设置的cookie,并没有我们设置的cookie。 那么我们访问我们刚写的Servlet对应的url看看结果: 上面的是第一次访问,那么我们再访问第二次看看:Session是一次浏览器与服务器交互的过程,称之为会话。会话就像是两个人的一次聊天一样,聊天结束会话就结束了。session会话机制是一种服务器端机制, 服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。一个连接对应一个session,session可以在一个会话中传递信息。
两个常用方法:
案例:通过Session设置值/获取值
package com.muhan.session;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"); //通过HttpServletRequest获得session对象 HttpSession session = req.getSession(); //获取SessionID String id = session.getId(); //响应到网页上 resp.getWriter().println("SessionID:"+id); //用Session设置值 String name = "张三"; session.setAttribute("name",name); //在网页上响应一下存入的值 resp.getWriter().println("Session设置的值为:"+name); //用Session取出值 String str = (String) session.getAttribute(name); //响应出去 resp.getWriter().println("Session获取到的值为:"+str); }}
配置web.xml
SessionTest com.muhan.session.SessionTest SessionTest /session.do
结果展示:
Session注销
session.invalidate();
1
转载地址:http://eaiwi.baihongyu.com/