Cookie与Session操作

一、会话的概念

  会话: 把同一个浏览器与WEB服务器的一次一系列的各种交互活动称之为"会话"。

       对会话过程进行跟踪:每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,我们需要对用户的会话进行跟踪,需要记录用户的状态时,程序要想办法为每个用户保存这些数据。

       存会话数据的两种技术:Cookie 和 Session

Session与Cookie的区别:session与cookie都可以用来跟踪用户   

      1)session是保存在服务器端;cookie是保存在客户端

      2)一个网站能够写入到客户端的cookie数据是有限制;session的保存数据量是无限制

      3)session相对安全;cookie不安全

二、Cookie

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

Java提供的操作Cookie的API:

  Java中把Cookie封装成了 javax.servlet.http.Cookie 类。每个Cookie都是该Cookie类的对象。

       服务器通过操作Cookie类对象对客户端Cookie进行操作。      

Cookie类的主要方法

No.

方法

类型

描述

1

Cookie(String name, String value)

构造方法

实例化Cookie对象,传入cooke名称和cookie的值

2

public String getName()

普通方法

取得Cookie的名字

3

public String getValue()

普通方法

取得Cookie的值

4

public void setValue(String newValue)

普通方法

设置Cookie的值

5

public void setMaxAge(int expiry)

普通方法

设置Cookie的最大保存时间,即cookie的有效期,如果为正数,则该Cookie在>maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

6

public int getMaxAge()

普通方法

获取Cookies的有效期

7

public void setPath(String uri)

普通方法

设置cookie的有效路径,

8

public String getPath()

普通方法

获取cookie的有效路径

9

public void setDomain(String pattern)

普通方法

 设置cookie的有效域

10

public String getDomain()

普通方法

 获取cookie的有效域

1、Cookie操作

    1)创建Cookie,并存储数据:通过构造器

    2)把Cookie存放到响应中,响应给浏览器,即把共享的数据存储到浏览器中:通过response.addCookie(cookie);

    3)获取Cookie以及Cookie中的数据:通过 request.getCookie() 获取客户端提交的所有Cookie(以Cookie[]数组形式返回)

    4)修改Cookie中的属性值

          方式一:创建一个属性名相同的Cookie,之前的值会被覆盖掉

          方式二:获取该Cookie对象,通过setValue方法重新设置value值。

        注意:不管哪种方式,修改之后都必须重新把该Cookie存放到响应中,通过response.addCookie(cookie);。

    5)Cookie的分类

       (1)会话Cookie(默认):关闭浏览器之后,Cookie就销毁了。

       (2)持久化Cookie:可设置Cookie可以保存指定的时间段(一天,一周,一月等)。

        通过setMaxAge(int seconds)方法设置Cookie的最大存活时间:

    6)删除Cookie:通过 cookie对象.setMaxAge(0)方法

    7)Cookie的中文问题:在Cookie中属性名和属性值都不能使用中文。

          解决方案:使用URLEncodor解密和URLDecoder解密

 2、简单demo

      需求:登录页面,登录之后设置Cookie,然后跳转在获取Cookie值

登录页面:

<h4>登录页面 </h4>
<form action="/DemoServlet/ck/login" method="get" id="loginForm">
        用户名: <input type="text" id="username" name="username" required="required"/><br/>
        密    码: <input type="password" id="password" name="password"/><br/>     
        <input type="submit" value="登录"/>
</form>>

LoginServlet:

// 注意:必须以  / 打头
@WebServlet(value= {"/ck/login"})
public class LoginServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
      
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req, resp);
    }
    
    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");   
        PrintWriter out = resp.getWriter();
        
       
        String username = req.getParameter("username") ;
        
        // 创建Cookie,并存储数据,处理中文乱码
        Cookie cookie = new  Cookie("username",URLEncoder.encode(username, "UTF-8"));
        // 设置Cookie的最大保存时间
        cookie.setMaxAge(15);//单位秒
        // 把Cookie响应给浏览器
        resp.addCookie(cookie);
        
        
        out.write("<html><head><title>this is tilte</title></head><body>");
        out.write("欢迎:" + username +"<br/>");
        out.write("<a href='/DemoServlet/ck/get'>获取Cookie</a>");
        out.write("</body></html>");
    } 
}

CkGetServlet:

// 注意:必须以  / 打头
@WebServlet(value = { "/ck/get" })
public class CkGetServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPut(req, resp);
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();

        String username = "";

        //获取浏览器传递过来的Cookie数组
        Cookie[] cookies = req.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                if ("username".equals(name)) {
                    username = URLDecoder.decode(cookie.getValue(), "utf-8"); // 解码                  
                }
            }
        }

        out.write("<html><head><title>this is tilte</title></head><body>");
        out.write("username Cookie值:" + username + "<br/>");
        out.write("</body></html>");
    }
}

   

 

   

 

 

         

3、Cookie的缺陷

(1)不安全,多个人使用同一台电脑时,可以查看浏览器的Cookie信息

(2)Cookie存储中文比较麻烦,需要编码和解码

(3)Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据是,就得创建N个Cookie。

(4)一个站点对Cookie存储是有限制的

 

三、Session

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

  Java中把Session封装成了 javax.servlet.http.HttpSession 接口。

      Session 其本质就是一个会话Cookie(浏览器关闭之后,Session就失效了)

Session 主要方法:

1、public void setAttribute(String name,String value)
    设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性是会话范围内存在,则更改该属性的值。  
2、public Object getAttribute(String name)
    在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。  
3、public void removeAttribute(String name),
    删除指定名字的session属性,若该属性不存在,则出现异常。  
4、public void invalidate(),使session失效。
    可以立即使当前会话失效,原来会话中存储的所有对象都不能再被访问。  
5、public String getId( ),
    获取当前的会话ID。每个会话在服务器端都存在一个唯一的标示sessionID,session对象发送到浏览器的唯一数据就是sessionID,它一般存储在cookie中。  
6、public void setMaxInactiveInterval(int interval) 
    设置会话的最大持续时间,单位是秒,负数表明会话永不失效。  
7、public int getMaxInActiveInterval(),
    获取会话的最大持续时间。  
8、使用session对象的getCreationTime()和getLastAccessedTime()方法可以获取会话创建的时间和最后访问的时间,但其返回值是毫秒,一般需要使用下面的转换来获取具体日期和时间。  

     

1、Session操作

     1)获取Session对象

     2)在Session中存储数据,与获取数据

     3)删除Session(用户注销登录)

        (1)删除Session中指定属性名的值:removeAttribute(String name)

         (2)销毁Session对象(Session中所有的数据都不存在):invalidate()

     4)Session的超时管理

           Tomcat中Session的默认超时时间为20分钟。

           java通过 session.setMaxInactiveInterval(int seconds) 修改超时时间。

           也可以修改web.xml 配置超时时间。例如修改为15分钟:

  <session-config>
  	<session-timeout>15</session-timeout> <!-- 单位: 分钟 -->
  </session-config>
</web-app>

     5)在Session中存储多个数据,就得调用多次方法

          一般会把需要存储的数据封装成一个对象,然后再存储到Session中

     6)如果多台服务器之间需要共享Session,此时Session中存储的对象,必须实现 java.io.Serializable接口

      2、简单demo

public class User implements Serializable{
    private String usernmae;
    private String password;
    ...
}

     LoginServlet:      

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");   
        PrintWriter out = resp.getWriter();
        
        String username = req.getParameter("username") ;
        
        User user = new User();
        user.setUsernmae(username);
        
        // 获取Session对象
        HttpSession session = req.getSession();
        System.out.println(session.getId());
        // 在Session中存储数据
        session.setAttribute("user", user);
        session.setMaxInactiveInterval(60 * 1);//单位秒
        
        out.write("<html><head><title>this is tilte</title></head><body>");
        out.write("欢迎:" + username +"<br/>");
        out.write("<a href='/DemoServlet/ck/get'>获取Session</a>");
        out.write("</body></html>");
    } 

     CkGetServlet:

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out = resp.getWriter();


        //获取Session对象
        HttpSession session = req.getSession();
        // 获取session中存储的数据
        User user =  (User) session.getAttribute("user");
        String username = user.getUsernmae();

        out.write("<html><head><title>this is tilte</title></head><body>");
        out.write("username session值:" + username + "<br/>");
        out.write("</body></html>");
    }

  

   

 

四、JavaScript操作Cookie

<script>
    document.write(document.cookie);//获取cookie的键值对的字符串
</script>

      JavaScript是运行在客户端的脚本,因此一般是不能够设置Session的,因为Session是运行在服务器端的。

而cookie是运行在客户端的,所以可以用JS来设置cookie.

       浏览器中的cookie信息,注意这里的cookie的expire/Max-Age过期时间,这个时间是格林尼治标准时间GMT,世界统一的时间,GMT+8小时就是北京时间。

1、设置cookie

<script type="text/javascript">
	//设置cookie
	function setCookie(c_name, c_value, c_expiredays){ //c_expiredays: 天 ,key-value 存储数据
		var expires = "";
		if(c_expiredays != null){
			var  sysDate = new Date();
			sysDate.setDate(sysDate.getDate() + c_expiredays);
			expires = ";expires=" + sysDate.toUTCString();
		}
		document.cookie = c_name + "=" + escape(c_value) + expires;
	}
	setCookie("admin","admin123",1);
	setCookie("aaa","v123",1); 
	alert(document.cookie); 
</script>

     

2、获取cookie

	//获取cookie方法1
	function getCookie1(c_name){
		if(document.cookie.length > 0){
			//通过字符串截取
			var start = document.cookie.indexOf(c_name + "=");
			start = start + c_name.length + 1;
			var end = document.cookie.indexOf(";", start);
			if(end == -1){
				end = document.cookie.length;
			}
			
			var c_value = document.cookie.substring(start,end);
			return unescape(c_value);
		}
	}
	
	//获取cookie方法2
	function  getCookie2(key){
        var cookies = document.cookie.replace(/[ ]/g,"");  //获取cookie,并且将获得的cookie格式化,去掉空格字符
        var cookiesArr = cookies.split(";")  
        var c_value = '';
        for(var i=0; i<cookiesArr.length; i++){ 
            var arr=cookiesArr[i].split("=");   //单个cookie:key-value
            if(key==arr[0]){  //匹配key名
            	c_value = arr[1];
            	break;
            } 
        } 
        return unescape(c_value); //返回value
	}
	alert("getCookie1 = " + getCookie1("aaa") + " ;getCookie2 = " + getCookie2("admin"));

    

3、删除cookie

	//删除cookie
	function deleteCookie(c_name){
		var sysDate = new Date();
		sysDate.setDate(sysDate.getDate() - 1); //将date设置为过去的时间
		var time = ";expires=" + sysDate.toUTCString();
		var c_value = getCookie2(c_name);
		if(c_value != null || c_value != ''){
			document.cookie = c_name + "=" + escape(c_value) + time;
		}
	}
	deleteCookie("aaa");
	deleteCookie("bbb");
	alert("删除后 " + document.cookie);

   

数据的编码和解码

   某些字符不能在cookie里使用,包括分号,逗号以及空白符号(比如空格和制表符)。在把数据存储到cookie之前,需要对数据进行编码,以便于实现正确的存储。

   在存储信息之前,使用JavaScript的escape()函数进行编码,而获得原始的cookie数据时就使用相应的unescape()函数进行解码。

   excape()函数把字符串里任何非ASCII字符都转换为相应的2位或4为十六进制格式,比如空格转换为%20,&转换为%26。
 

ends

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值