Cookie

程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。

例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

Web应用程序是使用HTTP协议传输数据的,HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。

要跟踪该会话,必须引入一种机制,Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。

 

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

Cookie是不能跨域的。

1.-1:负值表示不会存储cookie,浏览器退出就会清除cookie。

正值表示存储多少秒。

2.访问资源的路径:/(所有资源都可以访问) 如果是/a/b,则/a不能访问cookie,/a/b/c可以访问(向下访问)。

3.访问域:www.jd.com下产生的cookie,www.taobao.com不能访问其cookie。cookie无法设置除当前域名或其父域名之外的domain,因为cookie无法进行跨域访问,这是浏览器对于cookie的保护。

如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。

domain为空,默认为当前域名。

<%@ page import="java.net.URLDecoder" %><%--
  Created by IntelliJ IDEA.
  User: lenovo
  Date: 2019/9/10
  Time: 9:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆界面</title>
</head>
<body>
    <h3>用户登录</h3>
    <%
        String value01="";
        String value02="";
        String value03="";
        //获取请求的Cookie
        Cookie[] cookies = request.getCookies();
        //cookies不为null,表示已经存储了数据
        if(cookies!=null){
            for (int i = 0; i <cookies.length ; i++) {
                if("ga01".equals(cookies[i].getName())){
                    //对数据进行解码
                    value01 = URLDecoder.decode(cookies[i].getValue(),"utf-8");
                }
                if("ga02".equals(cookies[i].getName())){
                    value02 = cookies[i].getValue();
                    value03="checked";
                }
            }
        }
    %>

    <form action="servlet/LoginServlet01" method="post">
        <p>
            账号:<input type="text" name="username" value="<%=value01%>" />
        </p>
        <p>
            密码:<input type="password" name="pwd" value="<%=value02%>" />
        </p>
        <p>
            <input type="checkbox" name="ch" value="yes"  <%=value03%>/>10天免登录
        </p>
           ${message}
        <p>
            <input type="submit" value="提交" />
        </p>
    </form>
</body>
</html>
//该注解相当于在web.xml中编写的servlet路径
@WebServlet(urlPatterns = "/servlet/LoginServlet01")
public class LoginServlet01 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        //(1)根据name获取前台页面中的数据
        String zh=request.getParameter("username");
        String pwd=request.getParameter("pwd");
        String ch=request.getParameter("ch");

        //(2)处理数据(进行判断)
        boolean flag=false;
        if("嘎".equals(zh)&&"smile".equals(pwd)){
           flag=true;
        }

        //(3)做出响应
        if(flag){
            //对相应的数据进行编码
            String encode = URLEncoder.encode(zh, "utf-8");

            //申请Cookie
            Cookie cookie01=new Cookie("ga01",encode);
            Cookie cookie02=new Cookie("ga02",pwd);
            
            //如果复选框已勾选
            if("yes".equals(ch)){
                //持续时间-->单位s
                cookie01.setMaxAge(60*60*24*10);
                cookie02.setMaxAge(60*60*24*10);
            }else {
                cookie01.setMaxAge(0);
                cookie02.setMaxAge(0);
            }
            //适用范围
            cookie01.setPath("/jsp01");
            cookie02.setPath("/jsp01");
            //响应给客户
            resp.addCookie(cookie01);
            resp.addCookie(cookie02);
            //重定向
            resp.sendRedirect("../success.jsp");
        }else {
            request.setAttribute("message","登录失败");
            //转发
            request.getRequestDispatcher("/Login.jsp").forward(request,resp);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值