4 Cookie(从Servlet学到JSP)

Session解决数据转发问题,但是Session依赖于Cookie

Cookie是浏览器端保存少量数据的一种技术。

1 问题:

HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?
解决:
使用 Cookie 技术,

解释:

Cookie 技术其实是浏览器端的数据存储技术,解决了不同请求需要使用相同的请求数据的问题。我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。但是哪些数据需要使用 Cookie 技术存储起来是一个主观问题,需要在后台进行响应的时候来告诉浏览器,有些数据其他请求还会使用,需要存储起来。

浏览器帮忙把用户名存起来,下次请求的时候,浏览器写好了就帮带上了,相当于自己写过了。可以指定让浏览器存什么,即在响应的时候告诉浏览器存什么,其他请求的时候帮忙带上。

特点:

浏览器端的数据存储技术

适合少量数据

键值对

不安全

使用:

2 创建Cookie

//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息.

//处理请求信息
//响应处理结果
//使用Cookie进行浏览器端的数据存储
//创建Cookie对象
Cookie c=new Cookie("mouse", "thinkpad");
Cookie c2=new Cookie("key", "bjsxt");
//设置Cookie
//设置Cookie的有效期
c2.setMaxAge(3*24*3600);
//设置有效路径
c2.setPath("/cookie/gc");
//响应Cookie信息
resp.addCookie(c);
resp.addCookie(c2);
//直接响应
resp.getWriter().write("Cookie学习");
//请求转发
//重定向

3 Cookie 数据存储时长分类:

  • 临时存储:

不设置 cookie 信息的存储时间,周期为一次会话,存储在浏览器内存中

  • 定时存储:

    设置存储时间,周期为时间设置,存储在用户电脑中。(存在硬盘中,可以理解为存在键盘中)。在有效期内符合路径要求的请求都会附带该信息。

4 Cookie有效路径

默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径。

c2.setPath("/cookie/abc");//只访问abc才带

5 Cookie 数据获取

Cookie[] cks=req.getCookies();//获取本站在客户端上保留的所有Cookie
if(cks!=null){
    for(Cookie c:cks){//null不能遍历
        String name=c.getName();//Cookie的getName方法
        String value=c.getValue();
        System.out.println(name+":"+value);
    }
}

6 Cookie编码

默认情况下,Cookie值不允许出现中文字符,如果我们需要值为中文内容的Cookie怎么办呢?同样可以借助于java.net.URLEncoder先对中文字符串进行编码,将编码后的结果设为Cookie值。当程序要读取Cookie时,则应该先读取,然后使用java.net.URLDecoder对其进行解码。

总结:

Cookie 技术解决了不同请求发送之间的数据共享问题。

案例:三天免登录

原来我们访问page,第一次输入的时候需要输入密码,然后跳转到了main页面。第二次访问page的时候,我们想让他直接进入main,而不经过page页面。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUPhd0xC-1592218380016)(https://raw.githubusercontent.com/FermHan/tuchuang/master/20191016223412.png)]

新建CookieServlet

Cookie信息校验

  •  判断请求中是否携带正确的Cookie信息
    
  •  如果有则校验Cookie信息是否正确
    
  •  如果校验正确则直接响应主页面给用户
    
  •  如果校验不正确则响应登录页面给用户
    
  •  没有则请求转发给登录页面
    

在登录页面设置cookie,以后再来访问登录页面的时候,服务器检测带过来的cookie里有没有想要的cookie信息,没有就重新设置,有就免登录

------login/CookieServlet.java--------;
public class CookieServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp)
        throws ServletException, IOException {
        //设置请求编码格式
        req.setCharacterEncoding("utf-8");
        //设置响应编码格式
        resp.setContentType("text/html;charset=utf-8");
        //获取请求信息
        //获取Cookie信息
        Cookie[] cks=req.getCookies();
        //处理请求信息
        if(cks!=null){
            //遍历Cookie信息
            String uid="";//不要直接存用户密码,而是存uid
            for(Cookie c:cks){
                if("uid".equals(c.getName())){
                    uid=c.getValue();
                }
            }
            //校验UID是否存在
            if("".equals(uid)){//uid为空,
                //请求转发
                req.getRequestDispatcher("page").forward(req, resp);
                return;
            }else{//有uid
                //校验UID用户信息
                //获取业务层对象
                LoginService ls=new LoginServiceImpl();
                User u=ls.checkUidService(uid);
                if(u!=null){//uid正确,成功登录
                    //重定向
                    resp.sendRedirect("/login/main");
                    return;
                }else{//uid不正确,转发到登录页面
                    //请求转发
                    req.getRequestDispatcher("page").forward(req, resp);
                    return;
                }
            }

        }else{//没有cookie,去登录页面
            //响应处理结果
            //请求转发
            req.getRequestDispatcher("page").forward(req, resp);
            return;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值