cookie

‍‍‍‍1:Session回顾

2:Cookie,生命周期,四大属性、记录用户信息、保存中文信息、与Session的关系、自动登录。

3:ServletContext对象  域对象  》request,session,servletcontext

4:JSP技术- 开始。 - 在JSP里面使用Java代码块

 

 

 

1:回顾

1:Session保存在服务器上的。由服务器创建

2:创建时间:request.getSession(true | 默认就是true)

3:域对象都有:setAttribute -- /getAttribute - /removeAttriubte  

4:过期时间:

     1:超时 超出了maxInactive - > 最后一次活动时间到当前时间

     2:session.invaliate();

 

 

2:Cookie

定义;

   Creates a cookie, a small amount of information sent by a servlet to a Web browser, saved by the browser, and later sent back to the server

 

Cookie是保存到浏览器上的。即客户端来维护。

 

如何创建cookie如何让浏览来保存cookie

1:创建 :cookie cookie= new Cookie(name,value);

2:发给浏览器:response.addCookie(cookie) ; 以响应头的形式,接收cookie来保存cookie。

 

 

1:服务器保存一个cookie

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

//创建一个随机值,保存到cookie中去

int a  = new Random().nextInt(100);

//创建cookie对象

Cookie c  = new Cookie("random", "rand-is-"+a);

//保存cookie

response.addCookie(c);

}

 

2:请求这个servlet,观察它的请求头+响应头

 

第一次:

第一次请求时,由于之前这个浏览器没有保存过这个服务器的cookie,所以在请求头中没有任意的cookie信息:

 


第一次请求时,由于请求到的servlet创建一个 cookie回发送回了浏览器,所以可在响应头中查看到cookie头的信息,浏览器在接收到这个cookie以后,就会保存这个cookie默认到浏览器的内存中:

 

 

 

第二次请示这个地址:

浏览器再次请示这个地址时,会带这个cookie去访问服务器:

 

 

由于又一次执行了保存cookie的代码,于是又创建一个新的cookie,但这是个cookie的信息,与上一个cookie的信息完全 样,浏览器在收到这样的信息以后,会覆盖之前的cookie:

 

 

 

关闭浏览器以后再次打开请求:观察有没有cookie的信息: - 没有

因为,默认的cookie在没有设置生命周期-maxAge,默认的值为 -1 , 即只缓存到浏览器的内存中。所以关闭了浏览器,这个maxAge=-1的 cookie就从内存中消失了。

 

 

 

 

3:cookie限制

The servlet sends cookies to the browser by using the HttpServletResponse.addCookie(javax.servlet.http.Cookie) method, which adds fields to HTTP response headers to send cookies to the browser, one at a time. The browser is expected to support 20 cookies for each Web server, 300 cookies total, and may limit cookie size to 4 KB each.

 

 

 

4:cookie的属性

A cookie has a name, a single value, and optional attributes such as a comment, path and domain qualifiers, a maximum age, and a version number.

 

1: a name, a single value 名称和值 必须要成对出现。

   

2:path :默认的path是当前这个servlet所在的目录:

http://localhost:8080/20160424/one 

则这个Serlvet保存的cookie path = http://localhost:8080/20160424

 

如果http://localhost:8080/20160424/abc/one

则这个Serlvet保存的cookie path = http://localhost:8080/20160424/abc

 

Path就类似于java包,用于权限控制的

 

3:domain 域名

      默认的为 null。

      如果设置以以后,则可以在多个平台子站中共享cookie。

      Cookie.setDomain(.baidu.com);

      则在baidu的其他的网点的也可以读取这个cookie:

      www.tieba.baidu.com

      www.news.baidu.com

      www.map.baidu.com

 

4: a maximum age, - 过期时间  cookie.setMaxAge(秒)

      - 1  默认值。只缓存到浏览器的内存中。

      +N  保存到客户的文件中。保存多长时间 +N秒

让这个cookie在文件中,和在内存中失效。

 

 

 

 

5:关于maxAge

A positive value indicates that the cookie will expire after that many seconds have passed. Note that the value is the maximum age when the cookie will expire, not the cookie's current age.

A negative value means that the cookie is not stored persistently and will be deleted when the Web browser exits. A zero value causes the cookie to be deleted.

 

 

1:创建一个cooke. Name=Jack

   保存10分种。

2:检查cookie是否存在 ,如果存在 修改value = Mary

   如何读取cookie是否存在:

   通过请求头的形式,带回到服务器上来。Request读取请求信息

 Cookie[]

getCookies() 
          Returns an array containing all of the Cookie objects the client sent with this request.


 

3 检查 cookie是否存在,如果存在,且值是mary 则删除这个 cookie。

 

 

     

 

1:当设置了maxAge以后

 

 

如果还没有过期,关闭了浏览器以后再去查看 存在;

 

 

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

boolean boo = false;

//先检查是否存在cookie(name,Jack)

Cookie[] cs = request.getCookies();

if(cs!=null){

//遍历所有cookie-查询key=name

for(Cookie c:cs){

if(c.getName().equals("name")){//存在name的cookie

if(c.getValue().equals("Jack")){

//修改它的值

c.setValue("Mary");

c.setMaxAge(60*60);

response.addCookie(c);

}else{

c.setMaxAge(0);//删除这个cookie

response.addCookie(c);

}

boo = true;

break;

}

}

}

if(!boo){

//如果没有就创建cookie

Cookie c = new Cookie("name", "Jack");

c.setMaxAge(60*60);

response.addCookie(c);

}

}

 

 

 

 

6:path进行权限控制的

如果cookie

   Path与domin不同,name不同,则就是不同的cookie :

 以下是两个全不同的cookie:

Cookie c = new cookie(name,jack);

c.setPath(/);

 

Cookie c2 = new Cookie(name,jack);

c2.setPath(/20160424);

 

Cookie c2 = new Cookie(name,jack);

c2.setDomain(.baidu.com);

 

Cookie c2 = new Cookie(name,jack);

c2.setDomain(.58.com);

 

 

 

 

 

是否当前请求的地址,可以读取这个cookie:

Path的值

是否可以读取

/20160424

/20160424/one

/20160424/*

/20160424/abc

/20160424/one读取不到这个cookie

/20160424/abc/*

/

所有都可以读取到

 

 

 

设置 path=/(必须选择这个) 或是设置path= 项目的名称 = /20160424

 

www.58.com 虚拟主机

 

 

 

 

7:domain

两个网点:
   
www.58.com

   www.news.58.com

 

www.58.com保存一个cookie:

Cookie c = new Cookie(xxx,xxx);

c.setPath(/);

c.setDomain(.58.com);

response.addCookie(c);

 

 

则在www.news.58.com中也可以读取到上面的cookie - 成功。

 

 

 

 

8:在cookie中保存中文

%E5%B1%B1%E4%B8%9C%E6%B5%8E%E5%8D%97

转回以后的值是:山东济南

 

// 如果保存的信息,有中文,空格,必须要进行编码 Base64,Url

String val = URLEncoder.encode("山东济南", "UTF-8");// %a2

System.err.println(val);

 

// 如果读取值的话,则应该转回来

String val2 = URLDecoder.decode(val, "UTF-8");

System.err.println("转回以后的值是:" + val2);

 

Cookie c = new Cookie("addr", val);

 

 

 

9:用cookie记录用户的名称

 

 

 

思想:

   1:当用户登录成功以后,保存cookie到客户端。保存30天。

 

//---1:登录成功以后,保存 cookie

String nm = URLEncoder.encode(u.getName(),"UTF-8");

Cookie c = new Cookie("loginName",nm);

c.setMaxAge(60*60*24*30);

c.setPath("/");

response.addCookie(c);

 

   2:当打开页面时来读取cookie.

读取 cookie : request.getCookies();

可以使用JS脚本 来读取 cookie.

 

//读取 cookie

var cs = document.cookie;//name=Jack; loginName=%ad

//使用; 侵害字符串

cs = cs.split("; ");//[name=Jack,loginName=%aa]

for(var i=0;i<cs.length;i++){

         //获取每一个 cookie

        var ck = cs[i];//name=Jack

        //判断是否是loginName

        ck = ck.split("=");

        if(ck[0]=='loginName'){

var val = ck[1];

//转码回来

val =decodeURI(val);

$("#nm").val(val);

break;

         }

}

 

 

 

也可以用js脚本来保存cookie:

 

 

点登录时,直接保存cookie:

$("#btnLogin").click(function(){

var nm = $("#nm").val();//获取用户的姓名

nm = encodeURI(nm);

var date = new Date();

var month = date.getMonth()+2;

date = new Date(date.getFullYear(),month,date.getDate());

var vvv = "loginName="+nm+"; expires="+date.toUTCString()+"; path=/";

//保存cookie

document.cookie=vvv;

//表单提交

$("#f1")[0].submit();

});

 

 

 

 

10:Cookie与Sesson的关系

作业:请实现自动登录。

 

 

Cookie相当于你去银行开户,银行给你的卡片。

Session就是你在银行的账户信息。

 

器的做法是:

   1:创建Session以后同时创建一个cookie,这个cookie的key=JSESSIONID value=session.geID();

   2:且通知浏览器来保存。

 

 

当第一次调用req.getSession()时,自动的创建一个cookie:

 

 

 

如何时才可以找回服务没有死的session:

 

思想:

  模拟一个 Cookie(jsessionid,id);

\  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//创建Sesion

HttpSession s = request.getSession();

//判断在sessoin中是否有随机值

if(s.getAttribute("random")==null){

//如果没有随机值放一个随机值

s.setAttribute("random",""+Math.random());

//保存一个cookie

Cookie c  = new Cookie("JSESSIONID", s.getId());

c.setPath(request.getContextPath());

c.setMaxAge(60*60);

response.addCookie(c);

}

response.setContentType("text/html;charset=UTF-8");

response.getWriter().print("<Br>Session的id:"+s.getId());

response.getWriter().print("<br>随机值是:"+s.getAttribute("random"));

}

 

 

11:通过重写url找回之前的session

http://192.168.0.234/20160424/three;jsessionid=4894CAFD4581468B111233A14B3D4F39

 

 

String url = "three";

url = response.encodeRedirectURL(url);

response.getWriter().print("<br><a href='"+url+"'>Go</a>");

 

 

 

 

有一个 cookie 叫jssessoinid保存的是session的id值,用于访问服务器时,找回来原来的ssession。

 

 

 

12:实现自动登录

 

如果用户选择了自动登录。

     如果用户选择了aotuloing > 则应该保存cookie(autoLogin,name,pwd);

 

则一次:

   1:服务器没有关闭。但Sesion已经过期。要求可以自动登录成功。

         读取cookie中的值,查询数据库, name,pwd 查询数据。

          如何用户名+密码正确,则用户信息的信息放到session。 - 去

   2:服务器没有关闭,且session没有过期,要求可以自动登录成功。

          jsessionid

   3:服务器已经关闭了,当然session也已经消失了,要求只要再次启动服务器,用户再打开这个网页  要求也可以自动登录成功。\

      同1

 

 

 

自动登录成功以后,直接显示:

 

 

   4:用户如果点退出,下次则不再帮助它做自动登录。

 

 

Cookie的综合使用

 

一、cookie的作用

在我们平常写的B/S程序中,会经常用到cookie,主要有以下一些作用:

1 记录用户名和密码

以及该用户需要保存的一些信息,如购物购站,使用cookie,可以让用户自动登录到站点等。

2 定制站点

可以使用cookie来记录用户的偏好。

3 定向广告

可以使用cookie来记录用记经常访问的主题,并向他们显示与这些主题相关的广告。

 

二、向客户程序发送cookie

1 创建cookie对象

Cookie c = new Cookie(“userId”,”landril”);

2 设置最大时效,默认该cookie是存储在浏览器的内在中,用户关闭浏览器则被删除,下面的方法是将cookie存储在硬盘上。

c.setMaxAge(60*60*24);//一天,如果设置为0则是删除该cookie

3 cookie放入到HTTP响应报头,可以使用HttpServletResponseaddCookie方法,此方法不修改之前指定的Set-Cookie报头,而是创建新的报头。

response.addCookie(c);

       注意:设置cookie的步骤为创建cookie对象,设置最大时效,将cookie放入响应报头,即发送到客户程序,记住一定要将cookie发送到客户程序

 

三、从客户端读取cookie

1 调用HttpServletRequestgetCookies得到一个Cookie对象的数组

2 对数组进行循环,调用cookiegetName方法,获取具体的cookie的值

Cookie[] cookies = request.getCookies();

if(cookies != null){

for(int i=0;i<cookies.length;i++){

        Cookie c = cookies[i];

        if(“userId”.equals(c.getName())){

        System.out.println(c.getValue());

}

}

}

 

四、cookie的常用方法

1 setComment()/getComment():指定或查找与该cookie相关的注释

2 setDomain()/getDomain():设置或读取该cookie适用的域

3 setMaxAge()/getMaxAge():操作cookie保留的时间,多长时间后过期

4 getName():读取cookie的名称

5 setPath()/getPath():设置或取得cookie适用的路径

cookie.setPath(“/”);指定服务器的所有页面都应该收到该cookie

6 setSource()/getSource():指定cookie是否只能通过加密连接(SSL

默认false,表示cookie适用所有连接

7 setValue()/getValue():指定或获取cookie的值

 

 

 

     

 

 

 

1:MD5 单项加密

 

此 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。

 

目前加密的算法有:MD5,RSA,SHA-1,MD4

 

 

 

 

1:修改表结构

CREATE TABLE users(

   id VARCHAR(32) PRIMARY KEY,

   NAME VARCHAR(30),

   pwd VARCHAR(32),

   sex CHAR(1),

   mail VARCHAR(50),

   salt VARCHAR(32)

);  

 

 

2:用户在注册时,应该将用户md5以后保存到表中去

public int reg(User usr) {

// 设置id

usr.setId(UUID.randomUUID().toString().replace("-", ""));

usr.setSalt(UUID.randomUUID().toString().replace("-", ""));

usr.setPwd(MeetingUtils.md5(usr.getPwd(), usr.getSalt()));

// 声明sql语句

String sql = "insert into users(id,name,pwd,mail,sex,salt) values(?,?,?,?,?,?)";

int effect = run.update(sql, usr.getId(), usr.getName(), usr.getPwd(), usr.getMail(), usr.getSex(),

usr.getSalt());

return effect;

}

 

3:实现登录

 

核心思想:

再用用户的密码 1234 根据用户的名称,查询出它的salt = > kekekdkd3993 与数据库中比较。

public User login(User user) {

String sql = "select * from users where name=?";

QueryRunner run = new QueryRunner(DSUtils.getDataSource());

User user2 = run.query(sql, new BeanHandler<User>(User.class), user.getName(), user.getPwd());

if (user2 != null) {

// 获取salt

String salt = user2.getSalt();

// 对用户输入的密码进行再加密码

String pwd = MeetingUtils.md5(user.getPwd(), salt);

if (pwd.equals(user2.getPwd())) {

return user;

} else {

return null;

}

} else {

return null;

}

}

 

转载于:https://my.oschina.net/dtz/blog/666108

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值