Cookie、Session

55 篇文章 0 订阅
10 篇文章 0 订阅

Cookie、Session

1、会话

会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

2、保存会话的两种技术

Cookie

  • Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会**携带各自的数据(Cookie)**去。这样,web资源处理的就是用户各自的数据了。

Session

  • Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session取出数据为用户服务。Session对象由服务器创建,开发人员可以调用request对象的getSession()方法得到session对象

3、Cookie

3.1、Cookie相关API

HttpServletResponse 类的方法:
//添加Cookie对象到当前response对象中,此方法可以被调用多次
void addCookie(Cookie c);
HttpServletRequest 类的方法:
Cookie[] getCookies();//返回Cookie数组,如果请求中没有Cookie,那么该方法返回null。 
Cookie 类的方法: 
public Cookie(String name,String value);//cookie的构造方式 
String getName();//获取cookie的名称 
String getValue();//获取cookie的值 
void setMaxAge(int expiry);//设置cookie有效期
void setPath(String url);//设置有效路径 
void setDomain(String pattern);//设置有效域名
  • 示例:在网页显示用户上次登录时间
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //统一编码,防止出现乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取cookie数组
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (int i = 0; i < cookies.length; i++) {
                if(cookies[i].getName().equals("lastLoginTime")){
                    //将cookie数据写到网页
                    resp.getWriter().write("您上次访问本站时间:"+ new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss E").format(new Date(Long.parseLong(cookies[i].getValue()))));
                    break;
                }
            }
        }else {
            resp.getWriter().write("这是您今天第一次访问本站!");
        }
        //重新创建cookie,将当前时间戳存到cookie中
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        //获取从当前时间到当日24:00:00的秒数     //复习Calendar抽象类用法
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY,0);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);
        calendar.add(Calendar.DAY_OF_MONTH,1);
        long endTime = calendar.getTimeInMillis();
        int effectiveTime = (int) ((endTime - System.currentTimeMillis())/1000);
        System.out.println(effectiveTime);
        //设置cookie有效期为到当日24:00:00
        cookie.setMaxAge(effectiveTime);
        //添加cookie到浏览器
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
         doGet(req, resp);
    }
}
  • 测试访问

    • 第一次访问
      在这里插入图片描述
    • 第二次访问
      在这里插入图片描述

3.2、删除Cookie

  • 不设置有效期(默认maxAge = -1),相当于 cookie.setMaxAge(-1); ,关闭浏览器,自动失效
  • 设置有效期为0,即cookie.setMaxAge(0);

3.3、编码解码

URLEncoder.encode(String s,String enc)  //编码
URLDecoder.decode(String s,String enc)	//解码
/*---------------------示例-----------------------*/
Cookie cookie = new Cookie("hello", URLEncoder.encode("你好", "utf-8"));
URLDecoder.decode(cookie.getValue(),"utf-8");

4、Session

4.1、Session相关API

request.getSession()  //获取session
String getId() //获取sessionId; 
void setMaxInactiveInterval(int interval) //设置session允许的最大不活动时间(秒)
int getMaxInactiveInterval() //获取session可以的最大不活动时间(秒),默认为30分钟。当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session; 
long getCreationTime() //返回session的创建时间,返回值为当前时间的毫秒值; 
long getLastAccessedTime() //返回session的最后活动时间,返回值为当前时间的毫秒值; 
void invalidate() //让session失效,调用这个方法会让session失效,当session失效后,客户端再次请求,服务器会给客户端创建一个新的session,并在响应中给客户端新的sessionId; 
boolean isNew() //查看session是否为新。当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端,这时session的状态为新。
  • 示例:获取设置session,并将其相关信息写到网页
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //统一编码,防止出现乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取session
        HttpSession session = req.getSession();
        //设置session允许的最大不活动时间为60秒,即60秒内无操作,session自动注销
        session.setMaxInactiveInterval(60);
        //session创建时间
        Date creationTime = new Date(session.getCreationTime());
        //将session创建时间存入session
        session.setAttribute("creationTime",creationTime);
        if (session.isNew()) {
            resp.getWriter().write("session创建成功,ID="+session.getId());
        }else {
            resp.getWriter().write("session已经在服务器中存在!<br>ID="+session.getId()+"<br>创建时间:"+session.getAttribute("creationTime"));
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • 移除session中的属性,手动注销session
public class SessionDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        //移除session中的creationTime属性
        session.removeAttribute("creationTime");
        //手动注销Session
        session.invalidate();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  • 测试访问

    • 第一次访问
      在这里插入图片描述
    • 第二次访问
      在这里插入图片描述
    • 手动注销session后,再次访问
      在这里插入图片描述
    • 60秒不活动后再次访问
      在这里插入图片描述

4.2、在web.xml中配置session最大不活动时间

	<session-config>
        <!--15分钟后Session自动失效,以分钟为单位-->
        <session-timeout>15</session-timeout>
	</session-config>

5、Session与Cookie的区别

  • Cookie是把用户的数据写给用户的浏览器,数据保存在客户端;Session技术把用户的数据写到用户独占的session中(服务器端),数据保存在服务器端;
  • Cookie不是很安全,别人可以分析存在本地的Cookie,并进行Cookie欺骗,如果需要考虑安全,则使用Session;
  • Session会在一定时间内保存在服务器上,当访问增多,会占用的服务器的性能,如果主要考虑减轻服务器性能,应当使用Cookie ;
  • Cookie有大小和个数的限制。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值