Cookie and Session笔记

Cookie

1.简单流程


//1.创建Cookie对象
Cookie c = new Cookie(“msg”,“hello”);
//2.发送Cookie对象
response.addCookie©;

//3.获取Cookie
Cookie[] cs = request.getCookies();
//获取数据,遍历Cookies
if(cs != null){
for(Cookie c : cs){
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}

2.共享问题

//不同项目
setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
* 如果要共享,则可以将path设置为"/"
//不同tomcat浏览器

  • setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
    * setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

3.案例-用户登陆
//设置响应的消息体的数据格式以及编码
response.setContentType(“text/html;charset=utf-8”);

        //1.获取所有Cookie
        Cookie[] cookies = request.getCookies();
        boolean flag = false;//没有cookie为lastTime
        //2.遍历cookie数组
        if(cookies != null && cookies.length > 0){
            for (Cookie cookie : cookies) {
                //3.获取cookie的名称
                String name = cookie.getName();
                //4.判断名称是否是:lastTime
                if("lastTime".equals(name)){
                    //有该Cookie,不是第一次访问

                    flag = true;//有lastTime的cookie

                    //设置Cookie的value
                    //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
                    Date date  = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    System.out.println("编码前:"+str_date);
                    //URL编码
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    System.out.println("编码后:"+str_date);
                    cookie.setValue(str_date);
                    //设置cookie的存活时间
                    cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
                    response.addCookie(cookie);


                    //响应数据
                    //获取Cookie的value,时间
                    String value = cookie.getValue();
                    System.out.println("解码前:"+value);
                    //URL解码:
                    value = URLDecoder.decode(value,"utf-8");
                    System.out.println("解码后:"+value);
                    response.getWriter().write("<h1>欢迎回来,您上次访问时间为:"+value+"</h1>");

                    break;

                }
            }
        }


        if(cookies == null || cookies.length == 0 || flag == false){
            //没有,第一次访问

            //设置Cookie的value
            //获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
            Date date  = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String str_date = sdf.format(date);
            System.out.println("编码前:"+str_date);
            //URL编码
            str_date = URLEncoder.encode(str_date,"utf-8");
            System.out.println("编码后:"+str_date);

            Cookie cookie = new Cookie("lastTime",str_date);
            //设置cookie的存活时间
            cookie.setMaxAge(60 * 60 * 24 * 30);//一个月
            response.addCookie(cookie);

            response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
        }

Session:

1. 获取HttpSession对象:

    	HttpSession session = request.getSession();

2. 使用HttpSession对象:

	Object getAttribute(String name)  
	void setAttribute(String name, Object value)
	void removeAttribute(String name)  

3.细节

1) 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
	* 默认情况下。不是。
	* 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
		 Cookie c = new Cookie("JSESSIONID",session.getId());
         c.setMaxAge(60*60);
         response.addCookie(c);

2) 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
	* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
		* session的钝化:
			* 在服务器正常关闭之前,将session对象系列化到硬盘上
		* session的活化:
			* 在服务器启动后,将session文件转化为内存中的session对象即可。
		
3) session什么时候被销毁?
	1. 服务器关闭
	2. session对象调用invalidate() 。
	3. session默认失效时间 30分钟
		选择性配置修改	
		<session-config>
	        <session-timeout>30</session-timeout>
	    </session-config>

4.session与Cookie的区别:

   1. session存储数据在服务器端,Cookie在客户端
	2. session没有数据大小限制,Cookie有
	3. session数据安全,Cookie相对于不安全

5.验证码的Servlet处理

//验证码存入session
request.getSession().setAttribute(“checkCode_session”,checkCode_session);

//1.设置request编码
request.setCharacterEncoding(“utf-8);
//2.获取参数
String username = request.getParameter(“username”);
String password = request.getParameter(“password”);
String checkCode = request.getParameter(“checkCode”);
//3.先获取生成的验证码
HttpSession session = request.getSession();
String checkCode_session = (String) session.getAttribute(“checkCode_session”);
//删除session中存储的验证码
session.removeAttribute(“checkCode_session”);
//3.先判断验证码是否正确
if(checkCode_session!= null && checkCode_session.equalsIgnoreCase(checkCode)){
//忽略大小写比较
//验证码正确
//判断用户名和密码是否一致
if(“zhangsan”.equals(username) &&123.equals(password)){//需要调用UserDao查询数据库
//登录成功
//存储信息,用户信息
session.setAttribute(“user”,username);
//重定向到success.jsp
response.sendRedirect(request.getContextPath()+"/success.jsp");
}else{
//登录失败
//存储提示信息到request
request.setAttribute(“login_error”,“用户名或密码错误”);
//转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
}else{
//验证码不一致
//存储提示信息到request
request.setAttribute(“cc_error”,“验证码错误”);
//转发到登录页面
request.getRequestDispatcher("/login.jsp").forward(request,response);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值