判断客户端是否是第一次访问服务器

package cn.itcast.cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 在服务器中的Servlet判断是否有一个名为lastTime的cookie

        1. 有:不是第一次访问
        2. 没有:是第一次访问
           1.  响应数据:您好,欢迎您首次访问
           2. 协会Cookie:lastTime=2018年6月10日11:50:01
* */
@WebServlet("/cookieTest")
public class CookieTest extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置响应体的数据格式和编码,防止中文乱码
        resp.setContentType("text/html;charset=utf-8");
        //接收浏览器发送的cookie对象
        Cookie[] cookies = req.getCookies();

        boolean flag = false;//此标记代表客户端是否是第一次访问服务器端

        //遍历Cookie判断其中是否有名为lastTime的cookie
        if(cookies != null && cookies.length > 0){
            for(Cookie cookie:cookies ){
                String name = cookie.getName();
                if("lastTime".equals(name)){
                    flag = true;
                    //不是第一次访问,向浏览器输出   "欢迎回来,您上次的访问时间是XXXX年xx月xx日 xx:xx:xx"

                    //设置该cookie的值
                    Date date = new Date();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年-MM月-dd日 HH:mm:ss");
                    String str_date = sdf.format(date);
                    //当中有空格,tomcat不支持特殊字符,会报错,用URL编解码解决这个问题
                    str_date = URLEncoder.encode(str_date,"utf-8");
                    cookie.setValue(str_date);
                    //重新设置完value的值后,重新向浏览器发送cookie
                    //设置cookie存活时间
                    cookie.setMaxAge(10000000);
                    resp.addCookie(cookie);

                    //取出lastTime的值
                    String value = cookie.getValue();
                    //使用URL解码
                    value = URLDecoder.decode(value,"utf-8");
                    resp.getWriter().write("<h1>欢迎回来,您上次的访问时间是" + value + "</h1>");
                    break;
                }
            }
        }
        //cookies中没有lastTime代表第一次访问
        if(cookies == null || cookies.length == 0 || flag == false){
            //第一次访问
            SimpleDateFormat sif = new SimpleDateFormat("yyyy年-MM月-dd日 HH:mm:ss");
            String str_date = sif.format(System.currentTimeMillis());
            str_date = URLEncoder.encode(str_date,"utf-8");
            //是第一次访问,创建一个名为lastTime的Cookie并相应到浏览器
            Cookie cookie = new Cookie("lastTime",str_date);
            //设置cookie存活时间
            cookie.setMaxAge(1000000);
            resp.addCookie(cookie);

            resp.getWriter().write("欢迎您首次访问");

        }
    }

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

好的,根据您提供的信息,我来回答您的问题。 (1)根据 TCP 报文首部格式,前 4 个字节是源端口号,紧接着 4 个字节是目标端口号,再往后 4 个字节是序列号,接下来 4 个字节是确认号,再往后 4 个字节是首部长度和保留位,最后 2 个字节是窗口大小。根据题目所给的报文段首部信息,可以得出源端口号为 0050,目标端口号为 04eb,因此可以判断这是 TCP 连接建立过程中的第二次握手。因为在第二次握手中,客户端会向服务器端发送一个带有 SYN 标志位的 TCP 报文段,用来请求建立连接。 (2)根据题目所给的报文段首部信息,序列号为 eb70eb26,确认号为 916f94bf,因此可以判断客户端初始序号为 916f94bf,服务器端初始序号为 eb70eb27。需要注意的是,因为在 TCP 报文段中,序列号指的是报文段中第一个字节的序列号,所以服务器端初始序号需要加 1。 (3)根据题目所给的报文段首部信息,可以看到在首部长度和保留位字段中,标志位中的第 12 位被置为 1,表示在 TCP 报文段中有选项字段。在选项字段中,第一个字节是 0x02,表示这是一个最大报文段长度选项。接下来的两个字节 0x0405 表示最大报文段长度为 1024 字节。因此,可以判断客户端想要访问的应用服务需要传输大量数据,需要使用大报文段,最大报文段长度为 1024 字节。但是无法确定具体是什么应用服务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值