Session&Cookie详解

一、Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户的浏览器,当用户使用浏览器去访问服务器中的web资源时,就会带着各自的数据去。这样web资源处理的就是用户各自的数据。Cookie叫客户端技术,是因为数据存储在客户端。原理逻辑如图:
这里写图片描述
用户点击超链接购买了一个商品。保存用户购买的商品,以便于用户点击结账servlet时,结账的servlet可以得到用户商品为用户结账。
图解:当浏览器去访问服务器时,第一次访问不会携带cookie信息,当访问完servlet1后,servlet1会回写一个cookie,在cookie中存入用户购买的物品,然后服务器将cookie回送给浏览器,浏览器将这个cookie进行缓存,在浏览器再去访问servlet2时,会携带cookie信息到服务器,这样就可以知道用户购买了什么物品。

Cookie API:
javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类方法:

1.Cookie(String name,String value):通过这个构造函数可以指定一个键值对,将信息存入到Cookie中,相同的name的值是会被覆盖的。

2.setValue:给当前cookie重新赋值。
getValue:这个方法是获取Cookie中字段的值,就是我们在Cookie的构造函数中的第二个参数Value,我们通过getName()方法检测到我们想要的Cookie,然后就可以通过这个方法获取Cookie中的信息。

3.setMaxAge:这个方法是设置Cookie的有效时间(单位是秒),也就是Cookie在浏览器中的缓存时间。
getMaxAge:获取对应的值

4.setPath:设置Cookie的使用路径。这个方法是设置当访问路径为path的资源的时候携带Cookie信息,比如:setPath("/ServletDemo")这样设置之后就是说在访问应用/ServletDemo中的所有资源的时候都会携带Cookie信息数据,如果不进行设置的话,默认是访问路径会携带Cookie,比如:/ServletDemo/ServletCookieDemo,其中ServletCookieDemo是一个Servlet,ServletDemo是当前的应用的映射路径。。
getPath:获取对应值

5.setDomain:这个方法是设置我们在访问domain域的时候会携带Cookie信息数据,这个可以做到第三方Cookie和跨域Cookie的信息访问操作,如:在我们的应用中设置新浪域名sina.com,这个就是第三方Cookie技术,在我的应用中设置Cookie信息,并将这个Cookie的域设置成其他的域名,同时如果我将这个域设置成sina.com,来攻击新浪网站因为cookie也是数据的,如果每次都携带cookie的话,server需要处理cookie,增加server的负担,所以会禁止第三方cookie,所以这个方法是没有效果的。当然我们可以在浏览器中禁止Cookie和第三方Cookie的信息。
getDomain:获取对应值。

6.getName:这个方法是获取Cookie中字段的名称,就是我们在Cookie的构造函数中的第一个参数Name,这样我们就可以找到我们想要的Cookie信息

添加Cookie示例:

  获取客户端的Cookie时,只能获取name与value属性,其它属性都不会被提交。如果cookie.setPath("/")同一服务器内所有应用都可访问到该Cookie
  public void servletTest(HttpServletRequest request,HttpServletResponse response){  
        Cookie cookie = new Cookie("username","user"); // 新建一个Cookie对象
        cookie.setMaxAge(24*60*60);                    // 设置过期时间1天,以秒为单位
        cookie.setPath("/ServletTestDemo");            // 设置路径。
        response.addCookie(cookie);                    // 保存cookie到客户端
    } 

删除Cookie示例:

 删除某个Cookie时,只需要新建一个只有MaxAge和value不一样的同名Cookie,然后添加到response中覆盖原来的Cookie
 public void servletTest(HttpServletRequest request,HttpServletResponse response){  
        Cookie cookie = new Cookie("username","user"); // 新建Cookie
        cookie.setMaxAge(0);                           // 设置生命周期为0,表示将要删除
        cookie.setPath("/ServletTestDemo");            //设置的路径必须要和之前的一样,否则是删除不了的 
        response.addCookie(cookie);                    // 执行添加后就从response里删除了
    } 

修改Cookie示例:

 修改某个Cookie时,只需要新建一个只有value属性不一样的同名Cookie,然后添加到response中覆盖原来的Cookie。比如刚是      user这次我们value修改成name。
 public void servletTest(HttpServletRequest request,HttpServletResponse response){  
        Cookie cookie = new Cookie("username","name"); // 新建Cookie
        cookie.setMaxAge(24*60*60);                    // 设置生命周期
        cookie.setPath("/ServletTestDemo");            //设置的路径必须要和之前的一样,否则是删除不了的 
        response.addCookie(cookie);                    // 执行添加后就从response里删除了
    } 

JS操作Cookie。Cookie是保存在客户端的,所以浏览器可以使用JS脚本等操作Cookie。

<script language=javascript> 
    //添加cookie
    function setCookie(name,value,time){ 
        var date= new Date(); 
        date.setDate(date.getDate()+time); 
        document.cookie = name+"="+value+";expires="+date; 
    } 

    //获得cookie
    function getCookie(name){ 
        var arr = document.cookie.split(";"); 
        for(var i=0; i<arr.length; i++){ 
        var arr2 = arr[i].split("="); 
            if(arr2[0] == name){ 
                return arr2[1]; 
            } 
        } 
        return null; 
    } 

    //删除cookie
    function removeCookie(name){ 
        setCookie(name,"",0) 
    } 
</script>

常见的浏览器记住密码。直接把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中。 把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
加密

String userName = request.getParameter("userName");//获取用户名
Md5Hash psw = new Md5Hash(userName, "peter.com", 2);//以peter.com为密钥加密

//将用户名添加进cookie并发送给客户端
Cookie userCookie = new Cookie("userName",userName);
userCookie.setMaxAge(7*24*60*60);
response.addCookie(userCookie);

//将密钥生成的密文加进cookie并发送给客户端
Cookie c = new Cookie("key",psw.toString());
c.setMaxAge(7*24*60*60);
response.addCookie(c);

解密

String usreName = null;
String key = null;
Cookie[] cookie = request.getCookies();
if(cookie !=null){              
    for(Cookie c:cookie){  // 遍历Cookie
       if("userName".equals(c.getName()) 
           userName = c.getValue();      
       if("key".equals(c.getName()) 
           key= cookie.getValue();       
    }
}
if(userName != null && key != null){   
    String secrect = new Md5Hash(userName, "peter.com", 2);
    if(key.equals(secrect )){//加密规则正确,说明已经登录
        //...此处可以进行后续处理
    }
}

二、Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他的web资源再从用户各自的session中取出数据为用户服务。Session叫服务器端技术,是因为数据存储在服务器。原理逻辑如图:
这里写图片描述
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。

Session API:
1.getAttributeNames():获取session中所有的键值
2.setAttribute(String name):设置session范围内attName属性的值为attValue。
3.getAttribute(String name):返回session范围内attName属性的值。
4.removeAttribute(String name):清除指定的session的值。
5.getCreationTime():获取Session的创建时间
6.getId():获取session的id
7.getServletContext():获取ServletContext对象
8.invalidate():删除session的方法,就是将session设置成无效的
9.setMaxInactiveInterval(int interval):这个方法设置session的最大有效时间

session对象的创建

 public class SessionTest extends HttpServlet { 
     public void doGet(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         response.setCharacterEncoding("UTF=8");
         response.setContentType("text/html;charset=UTF-8");
         //使用request对象的getSession()获取session,如果session不存在就创建一个
         HttpSession session = request.getSession();
         session.setAttribute("data", "haoaoo"); //将数据存储到session中
         String sessionId = session.getId(); //获取session的Id
         //判断session是不是新创建的
         if (session.isNew()) {
             response.getWriter().print("session创建成功,session的id是:"+sessionId);
         }else {
             response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
         }
     }

     public void doPost(HttpServletRequest request, HttpServletResponse response)
             throws ServletException, IOException {
         doGet(request, response);
     }
 }

session对象的销毁
session对象默认30分钟,如果没有使用则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间,示例:

</web-app>
    <session-config>
        <session-timeout>15</session-timeout>      //以分钟为单位
    </session-config>
</web-app>

如果需要在程序中手动设置Session失效时,可以调用session.invalidate方法销毁session。

 HttpSession session = request.getSession();
 session.invalidate();

三、Session和Cookie的主要区别
1.Cookie是把用户的数据写给用户的浏览器。
2.Session技术把用户的数据写到用户独占的session中。
3.Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值