精华内容
下载资源
问答
  • Cookie和Session的区别(面试必备)

    万次阅读 多人点赞 2019-09-17 20:40:32
    cookie和session都是用来跟踪浏览器用户身份的会话方式。 二、区别: cookie数据保存在客户端,session数据保存在服务端。 session 简单的说,当你登陆一个网站的时候,如果web服务器端使用的是session,那么...

    一、共同之处:
    cookie和session都是用来跟踪浏览器用户身份的会话方式。

    二、工作原理:
    1.Cookie的工作原理
    (1)浏览器端第一次发送请求到服务器端
    (2)服务器端创建Cookie,该Cookie中包含用户的信息,然后将该Cookie发送到浏览器端
    (3)浏览器端再次访问服务器端时会携带服务器端创建的Cookie
    (4)服务器端通过Cookie中携带的数据区分不同的用户
    在这里插入图片描述
    2.Session的工作原理
    (1)浏览器端第一次发送请求到服务器端,服务器端创建一个Session,同时会创建一个特殊的Cookie(name为JSESSIONID的固定值,value为session对象的ID),然后将该Cookie发送至浏览器端
    (2)浏览器端发送第N(N>1)次请求到服务器端,浏览器端访问服务器端时就会携带该name为JSESSIONID的Cookie对象
    (3)服务器端根据name为JSESSIONID的Cookie的value(sessionId),去查询Session对象,从而区分不同用户。
    name为JSESSIONID的Cookie不存在(关闭或更换浏览器),返回1中重新去创建Session与特殊的Cookie
    name为JSESSIONID的Cookie存在,根据value中的SessionId去寻找session对象
    value为SessionId不存在**(Session对象默认存活30分钟)**,返回1中重新去创建Session与特殊的Cookie
    value为SessionId存在,返回session对象
    Session的工作原理图
    在这里插入图片描述
    在这里插入图片描述
    三、区别:

    cookie数据保存在客户端,session数据保存在服务端。

    session
    简单的说,当你登陆一个网站的时候,如果web服务器端使用的是session,那么所有的数据都保存在服务器上,客户端每次请求服务器的时候会发送当前会话sessionid,服务器根据当前sessionid判断相应的用户数据标志,以确定用户是否登陆或具有某种权限。由于数据是存储在服务器上面,所以你不能伪造。

    cookie
    sessionid是服务器和客户端连接时候随机分配的,如果浏览器使用的是cookie,那么所有数据都保存在浏览器端,比如你登陆以后,服务器设置了cookie用户名,那么当你再次请求服务器的时候,浏览器会将用户名一块发送给服务器,这些变量有一定的特殊标记。服务器会解释为cookie变量,所以只要不关闭浏览器,那么cookie变量一直是有效的,所以能够保证长时间不掉线。

    如果你能够截获某个用户的cookie变量,然后伪造一个数据包发送过去,那么服务器还是 认为你是合法的。所以,使用cookie被攻击的可能性比较大。

    如果cookie设置了有效值,那么cookie会保存到客户端的硬盘上,下次在访问网站的时候,浏览器先检查有没有cookie,如果有的话,读取cookie,然后发送给服务器。

    所以你在机器上面保存了某个论坛cookie,有效期是一年,如果有人入侵你的机器,将你的cookie拷走,放在他机器下面,那么他登陆该网站的时候就是用你的身份登陆的。当然,伪造的时候需要注意,直接copy cookie文件到 cookie目录,浏览器是不认的,他有一个index.dat文件,存储了 cookie文件的建立时间,以及是否有修改,所以你必须先要有该网站的 cookie文件,并且要从保证时间上骗过浏览器

    两个都可以用来存私密的东西,session过期与否,取决于服务器的设定。cookie过期与否,可以在cookie生成的时候设置进去。

    四、区别对比:
    (1)cookie数据存放在客户的浏览器上,session数据放在服务器上
    (2)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,如果主要考虑到安全应当使用session
    (3)session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,如果主要考虑到减轻服务器性能方面,应当使用COOKIE
    (4)单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K。
    (5)所以:将登陆信息等重要信息存放为SESSION;其他信息如果需要保留,可以放在COOKIE中

    展开全文
  • Cookie和Session总结

    2019-08-22 15:43:38
    Cookie和Session总结Cookiecookie介绍cookie的简单使用cookie常用API使用cookie发送中文空格cookie共享范围Sessionsession介绍session和cookie的区别session简单原理使用session共享数据延长session存活时间...

    Cookie

    cookie介绍

    Cookie 可以翻译为“小甜品,小饼干” ,Cookie 在网络系统中几乎无处不在,当我们浏览以前访问过的网站时,网页中可能会出现 :你好 XXX,这会让我们感觉很亲切,就好像吃了一个小甜品一样。这其实是通过访问主机中的一个文件来实现的,这个文件就是 Cookie。在 Internet 中,Cookie 实际上是指小量信息,是由 Web 服务器创建的,将信息存储在用户计算机上的文件。一般网络用户习惯用其复数形式 Cookies,指某些网站为了辨别用户身份、进行 Session 跟踪而存储在用户本地终端上的数据,而这些数据通常会经过加密处理。

    cookie的简单使用

    新建一个servlet,创建一个cookie,通过response.addCookie发送到客户端,如果要发送多个cookie可以重复下面两行代码。

    Cookie cookie = new Cookie("name","tom");
    response.addCookie(cookie);
    

    在另一个servlet中获取浏览器中的cookie。

    Cookie[] cs = request.getCookies();
    for (Cookie c : cs) {
          System.out.println(c.getName()+" "+c.getValue());
    }
    

    cookie常用API

    name:名称不能唯一确定一个Cookie。路径可能不同。
    value:不能存中文和空格。
    path:默认值是写Cookie的那个程序的访问路径
    maxAge:cookie的缓存时间。默认是负数(默认存在浏览器的内存中),即浏览器关闭则销毁cookie,单位是秒;设置为0表示删除该cookie ;正数表示缓存(持久化到磁盘上)的时间。
    设置cookie存活时间为30天:

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

    使用cookie发送中文和空格

    cookie是不支持中文的,想要发送中文要使用URL编码。

    Date date = new Date();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    String str_date = sdf.format(date);
    //使用URL编码
    str_date = URLEncoder.encode(str_date,"utf-8");
    Cookie cookie = new Cookie("lastTime",str_date);
    cookie.setMaxAge(60*60*24*30);
    response.addCookie(cookie);
    

    获取浏览器中的cookie,使用URL解码读取。

    response.setContentType("text/html;charset=utf-8");
    Cookie[] cookies = request.getCookies();
    for (Cookie c : cookies) {
    	if ("lastName".equals(c.getName())) {  //这里把"lastTime"放前面是为了防止空指针异常
    		String value = c.getValue();
    		//解码
    		value = URLDecoder.decode(value,"utf-8");
    		response.getWriter.write("<h2>欢迎回来,您上次登录时间为"+value+"</h2>");
    	}
    }
    

    cookie共享范围

    cookie默认只能共享在当前项目。
    如果要共享到整个服务器,要设置Path。

    cookie.setPath("/");
    

    如果要让不同的服务器共享cookie,要使用setDomain(String path),设置一级域名相同,多个服务器之间就能共享cookie。

    cookie.setDomain(".baidu.com");  //tieba.baidu.com和news.baidu.com中cookie就可以共享
    

    Session

    session介绍

    在web开发过程中,服务器给每个用户浏览器会创建一个会话对象(session对象)。一个浏览器独享一个session对象,因此在保存用户数据时,服务器程序可以把用户数据写到用户浏览器独享的session中。当用户使用浏览器访问其他程序时,其他程序可以从用户的session中取出该用户的数据,直接使用。

    session和cookie的区别

    Cookie是把用户的数据写给用户浏览器。
    Session技术把用户的数据写到用户独占的session中。
    Session对象由服务器创建,程序员可以调用request对象中的 getSession()方法得到session对象。
    Cookie安全性不高,因为cookie信息是存储在客户端,其他人很容易存放到cookie中去,容易造成cookie欺骗;而session信息是存储在服务器上,因此比较安全。
    单个Cookie保存的数据时不超过4k,每个浏览器限制每个站点最多存储20个Cookie;而Session不存在这种问题。

    session简单原理

    session的实现是依赖于cookie的。服务器创建Session之后,会把session的ID,以cookie的形式回写给用户机,name属性为JSESSIONID, 只要用户机的浏览器没有关闭,再次去访问服务器时,都会带着session的ID号去,服务器就会发现浏览器带着session的ID号,就会使用内存中与之对应的session位置服务。

    使用session共享数据

    获取session

    HttpSession session = request.getSession();
    session.setAttribute("hello","hello session");
    

    控制台输出session

    HttpSession session = request.getSession();
    Object hello = session.getAttribute("hello");
    System.out.println(hello);
    

    延长session存活时间

    我们期望客户端关闭后,也能使用相同的session。

    HttpSession session = request.getSession();
    Cookie c = new Cookie("JSESSIONID",session.getId());
    c.setMaxAge(60*60*24);
    response.addCookie(c);
    

    当服务器重新启动后,两次获取的session不是同一个,但我们希望数据不丢失。
    session的钝化和活化:如果把项目部署到tomcat服务器上(把项目的war包放到tomcat的webapps文件夹里),tomcat会自动实现这个过程,而IDEA不能实现。

    session的钝化:
    	服务器正常关闭之前,将session对象序列化到硬盘上。
    session的活化:
    	服务器启动后,将session文件转化为内存中的session对象。
    

    session的销毁

    1)服务器关闭,session销毁
    2)调用session的invalidate()方法销毁session
    3)session默认失效时间:30分钟
    我们可以在web.xml中设置session的默认失效时间

    <session-config>
    	<session-timeout>120</session-timeout>
    </session-config>
    
    展开全文
  • cookie和session

    2018-05-03 16:30:24
    cookie和session

    cookie

    cookie:客户端浏览器上的一个文件(键值对方式存储,类似于python中的字典),一般用于记录用户状态、和用户信息的,绝大多数的网站自动登录功能都是基于cookie实现的,下面使用Django实现一个用户登陆作为例子展示。

    首先是最简单的登录页面 login:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <form action="/login/" method="post">
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="password" placeholder="密码">
        <input type="submit" value="提交">
    </form>
    </body>
    </html>
    login请求处理函数
    user_infp ={
        "fml":{"password":"123"}
    }
    
    def login(request):
        if request.method == "GET":
            return  render(request,"login.html")
        if request.method == "POST":
            u = request.POST.get("username")
            p = request.POST.get("password")
            dic = user_infp.get(u)
            if not dic:
                return render(request,"login.html")
            if dic["password"] == p:
                res = redirect('/index')
                res.set_cookie("username",u)
                return res
            else:
                return render(request,"login.html")
    当请求为get方式的时候返回登录页面,为post方式的时候验证表单,这里只使用字典来简化从数据库验证的操作。当验证通过的时候跳转到index页面,并且设置一个cookie,内容为{"username":username},否则任然返回当前页面。

    index页面:仅仅用来显示登录的用户名

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>欢迎{{ user }}</h1>
    </body>
    </html>

    index处理函数:

    def index(request):
        user = request.COOKIES.get("username")
        if not user:
            return redirect('/login')
        else:
            return render(request,'index.html',{"user":user})
    如果上面我们如果登录成功浏览器会存储一个cookie,当我们再次请求index页面的时候,同时发送过去的还有本地的cookie,所以可以从request中的cookie中获取我们已经存储的用户名,如果不存在则跳转到login页面,如果有登录信息则显示登录页面

    以上是最简单的cookie使用,其实cookie还有很多其他的用法

    rep = HttpResponse(...) 或 rep = render(request, ...)
     
    rep.set_cookie(key,value,...)
    rep.set_signed_cookie(key,value,salt='加密盐',...)
        参数:
            key,              键
            value='',         值
            max_age=None,     超时时间
            expires=None,     超时时间(IE requires expires, so set it if hasn't been already.)
            path='/',         Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
            domain=None,      Cookie生效的域名
            secure=False,     https传输
            httponly=False    只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)



    下面再来详细说一说各个参数的作用。
    首先是获取cookie,salt:这个参数的具体作用目前我还是不太清除,猜测是cookie加密操作,等我弄懂了再回来修改。

    接下来是设置cookie,key和value不用再说了,
    max_age:设置超时时间以秒为单位,很多网站上登录页面都有多长时间免登录的功能一般都是通过这个来设置的,当超过了一段时间这个cookie就会失效
    expires: 同样是设置超时时间的,但是和上面的不太一样,这里的单位不是秒,而是datetime,所以就有两种超时时间的设置方法

    #max_age方法
    res.set_cookie("username",u,max_age=10)
    #expires方法
    import datetime
    current_time = datetime.datetime.utcnow()
    end_time = current_time + datetime.timedelta(seconds=10)
    res.set_cookie("username",u,expires=end_time)
    path:是指定cookie生效的路径,参数默认为 ' / ' 可被当前网站任意URL页面访问,下面我们重新写一个页面index1,内容和index相同
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
        <h1>这里是index1欢迎{{ user }}</h1>
    </body>
    </html>
    index1 的处理函数
    def index1(request):
        user = request.COOKIES.get("username")
        if not user:
            return HttpResponse("没有获取到cookie")
        else:
            return render(request,"index1.html",{"user":user})


    这里我们将login函数里面的cookie设置为
    res.set_cookie("username",u,path='/index')
    然后重新运行登录 ,这里就能看出在index可以正常获取到cookie,而index1获取不到,path设置成功。

    domain:设置生效域名,这里只能设置当前域名的子域名,无法给其他域名设置

    session

    和cookie不同的是session是保存在服务器端的键值对,session基于cookie来使用的,一般情况下本地的cookie会存储session中的key名,然后通过cookie中的key去获取服务器上存储的信息。
    下面依然以用户登录作为最简单的示例:
    模板还是上面的那两个,这里只重写对应的处理函数
    user_infp ={
        "fml":{"password":"123"}
    }
    
    def login(request):
        if request.method == "GET":
            return  render(request,"login.html")
        if request.method == "POST":
            u = request.POST.get("username")
            p = request.POST.get("password")
            dic = user_infp.get(u)
            if not dic:
                return render(request,"login.html")
            if dic["password"] == p:
                res = redirect('/index')
                request.session['username'] = u
                request.session["is_login"] = True
                return res
            else:
                return render(request,"login.html")
    
    def index(request):
        print(request.session["is_login"])
        if request.session["is_login"]:
            return render(request, 'index.html', {"user": request.session["username"]})
        else:
            return redirect('/login')
    乍一看和cookie的操作类似,其实这是因为django为我们在后台做了很多工作,例如
    request.session['username'] = u
    request.session["is_login"] = True
    这两句就很简单的完成了session的创建,实际上django首先生成了一串随机字符串用来作为key并将这个随机字符串保存到本地的cookie中,然后在将后面的两个内容以字典的形式存到服务器端,django中默认session存储在数据库中。

    request.session["is_login"]:
    这一步首先从cookie中回去对应的key,然后再从数据库中获取对应的value进行判断
    同样的session和cookie一样也有一些高级功能,例如设置超时时间
    request.session.set_expiry(value)
                * 如果value是个整数,session会在些秒数后失效。
                * 如果value是个datatime或timedelta,session就会在这个时间后失效。
                * 如果value是0,用户关闭浏览器session就会失效。
                * 如果value是None,session会依赖全局session失效策略。

    除了超时时间设置还有一下功能:

            # 获取、设置、删除Session中数据
            request.session['k1']
            request.session.get('k1',None)
            request.session['k1'] = 123
            request.session.setdefault('k1',123) # 存在则不设置
            del request.session['k1']
     
            # 所有 键、值、键值对
            request.session.keys()
            request.session.values()
            request.session.items()
            request.session.iterkeys()
            request.session.itervalues()
            request.session.iteritems()
     
     
            # 用户session的随机字符串
            request.session.session_key
     
            # 将所有Session失效日期小于当前日期的数据删除
            request.session.clear_expired()
     
            # 检查 用户session的随机字符串 在数据库中是否
            request.session.exists("session_key")
     
            # 删除当前用户的所有Session数据
            request.session.delete("session_key")

    在django中session共有5种方式来存储:数据库、缓存、文件、缓存加数据库、加密cookie,但是都需要我们在settings里面设置,下面就是每种的配置方式

    #数据库配置
    
    SESSION_ENGINE = 'django.contrib.sessions.backends.db'  # 引擎(默认)
    
    SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)
    SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径(默认)
    SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名(默认)
    SESSION_COOKIE_SECURE = False  # 是否Https传输cookie(默认)
    SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输(默认)
    SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)(默认)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期(默认)
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存(默认)
    
    #缓存配置
    SESSION_ENGINE = 'django.contrib.sessions.backends.cache'  # 引擎
    SESSION_CACHE_ALIAS = 'default'  # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
    
    SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存
    
    #文件配置
    SESSION_ENGINE = 'django.contrib.sessions.backends.file'  # 引擎
    SESSION_FILE_PATH = None  # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()                                                            # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
    
    SESSION_COOKIE_NAME = "sessionid"  # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
    SESSION_COOKIE_PATH = "/"  # Session的cookie保存的路径
    SESSION_COOKIE_DOMAIN = None  # Session的cookie保存的域名
    SESSION_COOKIE_SECURE = False  # 是否Https传输cookie
    SESSION_COOKIE_HTTPONLY = True  # 是否Session的cookie只支持http传输
    SESSION_COOKIE_AGE = 1209600  # Session的cookie失效日期(2周)
    SESSION_EXPIRE_AT_BROWSER_CLOSE = False  # 是否关闭浏览器使得Session过期
    SESSION_SAVE_EVERY_REQUEST = False  # 是否每次请求都保存Session,默认修改之后才保存
    
    #缓存加数据库(数据库实现持久化,缓存提高效率)
    SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'        # 引擎
    
    #加密Cookie
    SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies'   # 引擎








    展开全文
  • Cookie Session 总结

    2020-08-26 23:21:03
    文章目录Cookie和Session一、会话技术二、Cookie三、Cookie的细节四、Cookie的特点作用五、Cookie案例:记录上一次访问的时间六、Session的介绍七、Session的细节八、Cookie案例:免用户名登录九、谷歌浏览器查看...

    Cookie和Session

    一、会话技术

    1. 会话:一次会话中包含多次请求和响应
      注:一次会话表示浏览器第一次给服务器发送请求,会话建立,直到有一方断开为止
    2. 功能:在一次会话的多次请求间共享数据
    3. 方式:
      (1) 客户端会话技术:Cookie
      (2) 服务器端会话技术:Session

    二、Cookie

    1. 概念:将数据保存到客户端,客户端有了Cookie之后,每次请求都会发送给服务器
    2. 使用步骤:
      (1) 创建Cookie对象,参数中绑定数据(键值对)
      new Cookie(String name, String value);
      (2) 客户端向服务器发送请求后,服务器向客户端发送Cookie对象
      response.addCookie(Cookie cookie);
      (3) 客户端收到Cookie后,再次发送请求时,服务器获取从客户端发来的Cookie对象
      Cookie[] request.getCookies();
      (4) 服务器得到Cookie对象后,使用getName与getValue方法得到Cookie对象的数据

    代码演示:演示Cookie的使用步骤
    (1) 此工程Tomcat的设置:
    在这里插入图片描述
    (2) 在src下创建CookieTest1.java

    @WebServlet("/CookieTest1")
    public class CookieTest1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1. 创建Cookie对象,参数类似键值对
            Cookie cookie = new Cookie("msg", "hello");
            //2. 客户端向浏览器发送Cookie
            response.addCookie(cookie);
        }
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request,response);
        }
    }
    

    (3) 在src下创建CookieTest2.java

    @WebServlet("/CookieTest2")
    public class CookieTest2 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //3. 服务器获取Cookie对象
            Cookie[] cookies = request.getCookies();
            //4. 服务器获取Cookie对象的值
            for (Cookie cookie :
                    cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println("获得的Cookie对象的值:" + name + ":" + value);
            }
        }
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    运行结果:
    在浏览器地址栏先输入:http://localhost:8080/MyTest/CookieTest1
    后输入:http://localhost:8080/MyTest/CookieTest2
    控制台输出:获得的Cookie对象的值:msg:hello

    1. 上述程序原理:基于响应头set-cookie和请求头cookie实现
      在这里插入图片描述

    三、Cookie的细节

    1.一次可以发送多个Cookie对象,使用response调用多次addCookie方法即可

    2.Cookie在浏览器中保存的时间:
    (1) 默认情况下,当浏览器关闭后,Cookie数据被销毁
    (2) 持久化存储:
    使用Cookie对象的setMaxAge(int seconds)方法:
    a. 正数:将Cookie数据写到硬盘中存储,参数指定存活的秒数,时间到后,数据失效, 此时间指的是创建cookie后开始计时,并不是关闭浏览器后才开始计时
    b. 负数:默认情况
    c. 零:删除cookie信息

    3.在Tomcat 8之后Cookie可以存中文,但特殊中文字符仍不支持,建议使用URL编码格式

    4.Cookie的共享问题:
    (1) 一个Tomcat服务器中,部署了多个web项目,这些web项目cookie的共享说明:
    ① 默认情况cookie无法共享
    ② 使用Cookie对象的setPath(String path)方法设置cookie的获取范围:
    a. 默认情况,参数是web工程路径,只有这个工程才可以访问到,其余工程无法访问
    b. 如果要共享,可以设置参数为”/” ( /被浏览器解析得到的地址为http://ip:port/ )
    (2) 不同的Tomcat服务器间cookie的共享说明:
    使用Cookie对象的setDomain(String path)方法,参数设置为一级域名,则一级域名相同的不同服务器之间Cookie可共享
    如:setDomain(“.baidu.com”),则tieba.baidu.com与news.baidu.com等的cookie可共享

    四、Cookie的特点和作用

    1.Cookie在客户端存储数据,客户端有了cookie之后,每次发送请求都会把cookie发送给服务器
    2.浏览器对单个Cookie有大小限制(4KB),对同一个域名下的总cookie数量也有限制(20个)
    3.作用:
    (1)Cookie一般用于存储少量的安全性较低的数据
    (2)在不登陆的情况下,完成服务器对客户端的身份识别,如没有登录百度账号的前提下打开百 度,设置搜索引擎搜索时不提示,以后打开浏览器访问百度时,不会再出现搜索提示框,原 理:百度服务器将设置的Cookie信息保存到浏览器,下次访问百度时,百度服务器获取浏览 器的Cookie,根据Cookie的值决定要不要显示提示框

    五、Cookie案例:记录上一次访问的时间

    1. 需求:访问一个Servlet程序:
      (1) 如果是第一次访问,提示:您好,欢迎您首次访问
      (2) 如果不是第一次访问,提示:欢迎回来,您上次的访问时间是:xxxx
    2. 分析:
      使用Cookie来完成,在服务器判断客户端是否有一个名为lastTime的cookie对象
      (1) 有,不是第一次访问:
      ①在浏览器显示:欢迎回来,您上次的访问时间是:xxxx
      ②将现在的时间写回名为lastTime的cookie中
      (2) 无,是第一次访问:
      ①在浏览器显示:您好,欢迎您首次访问
      ②将现在的时间写回名为lastTime的cookie中

    代码演示:使用jsp页面完成此案例

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>CookieTest</title>
    </head>
    <body>
        <%-- jsp页面通过首行的page标签自动的设置响应的格式,所以向浏览器输出数据不会乱码 --%>
        <%
            //1. 服务器获取客户端的所有cookie
            Cookie[] cookies = request.getCookies();
            //2. 获取的cookie不一定含有lastTime,用一个布尔类型判断
            boolean flag = false;
                    //3. 遍历cookie数组,判断是否有lastTime
            if(cookies != null && cookies.length > 0) {
                for (Cookie cookie :
                        cookies) {
                    String cookieName = cookie.getName();
                    if ("lastTime".equals(cookieName)) {
                        // 有lastTime,不是第一次访问
                        flag = true;
                        // 将现在的时间写回lastTime的cookie中
                        Date date = new Date();
                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                        String format = sdf.format(date);
                        // 防止乱码,向cookie对象中保存的中文数据使用URL编码
                        format = URLEncoder.encode(format, "UTF-8");
                        // 向名为lastTime的cookie中保存此时间
                        cookie.setValue(format);
                        // 设置cookie的存活时间
                        cookie.setMaxAge(60 * 60 * 24 * 30); //一个月
                        // 将cookie写回客户端
                        response.addCookie(cookie);
                        // 获取此cookie的value时间值,用于写出时间到浏览器
                        String cookieValue = cookie.getValue();
                        cookieValue = URLDecoder.decode(cookieValue, "UTF-8");
                        out.write("欢迎回来,您上次的访问时间是:" + cookieValue);
                        break; //找到了需要的cookie,就不需要判断别的cookie了
                    }
                }
            }
        %>
        <%
            if(cookies == null || cookies.length == 0 || flag == false) {
                // 没有lastTime,第一次访问,将当前时间保存至cookie,向客户端传递此cookie
                Date date = new Date();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                String format = sdf.format(date);
                format = URLEncoder.encode(format, "UTF-8");
                Cookie cookie = new Cookie("lastTime", format);
                cookie.setMaxAge(60 * 60 * 24 * 30);
                response.addCookie(cookie);
                out.write("您好,欢迎您首次访问");
            }
        %>
    </body>
    </html>
    

    六、Session的介绍

    1. 概念:Session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存到服务器 端,常用来保存用户登录之后的信息
    2. 快速入门:
      (1) 获取HttpSession对象
      HttpSession session = request.getSession();
      注:①第一次调用表示创建Session会话
      ②之后调用都是获取前面创建好的Session会话对象
      (2) 使用HttpSession对象的方法
      void setAttribute(String name, Object value);
      Object getAttribute(String name);
      void removeAttribute(String name);

    代码演示:演示Session的使用
    (1) 在src下创建SessionDemo1.java

    @WebServlet("/SessionDemo1")
    public class SessionDemo1 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1. 创建Session会话
            HttpSession session = request.getSession();
            //2. 存储数据
            session.setAttribute("msg", "Hello! Session!");
        }
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    (2) 在src下创建SessionDemo2.java

    @WebServlet("/SessionDemo2")
    public class SessionDemo2 extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1. 获取Session
            HttpSession session = request.getSession();
            //2. 获取数据
            Object msg = session.getAttribute("msg");
            System.out.println(msg);
        }
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
    

    运行结果:
    在浏览器地址栏先输入:http://localhost:8080/MyTest/SessionDemo1
    后输入:http://localhost:8080/MyTest/SessionDemo2
    控制台输出:Hello! Session!

    1. 上述程序原理:Session底层是基于Cookie来实现的
      在这里插入图片描述
      注意:每个Session会话都有一个唯一的id值作为标识,getId方法可得到此id值

    七、Session的细节

    1. Session被销毁的方式
      (1)服务器关闭
      (2)Session对象调用invalidate()
      (3)Session默认失效时间:30分钟,可以到web.xml中修改配置文件修改默认失效时间

       <session-config>
           <session-timeout>30</session-timeout>
       </session-config>
      
    2. 客户端关闭之后服务器不关闭,两次获取的Session是否为同一个?
      (1) 默认情况下,不是,Cookie消失,其中的Session自然也消失
      (2) 如果需要相同,进行如下操作:
      在这里插入图片描述

    3. 客户端不关闭,服务器关闭之后,两次获取的Session是否为同一个?
      不是同一个Session,但是为了保证数据的不丢失,Tomcat服务器自动完成:
      (1) Session的钝化:
      在服务器正常关闭之前,将Session对象序列化到硬盘上
      (2) Session的活化:
      在服务器启动之后,将Session文件反序列化成为内存中的Session对象
      注意:也就是说即使获取的不是同一个Session,但是Session中的数据都是相同的

    4. Session的特点
      (1) Session用于存储一次会话的多次请求数据,存在服务器端,一次会话只有一个session对象
      (2) Session可以存储任意类型,任意大小的数据

    5. Session与Cookie的区别:
      (1) Session存储数据在服务器端,Cookie在客户端
      (2) Session没有数据大小的限制,Cookie有(4KB)
      (3) Session数据安全,Cookie相对不安全

    八、Cookie案例:免用户名登录

    说明:成功登录之后,重启浏览器,再次登录时,浏览器记住了上次登录的用户名
    在这里插入图片描述
    代码演示:免用户名登录的使用
    (1) 创建login.jsp

    <body>
        <form action="http://localhost:8080/MyTest/LoginServlet" method="post">
            用户名:<input type="text" name="username" value="${cookie.username.value}"> <br>
            密码:<input type="password" name="password"> <br>
            <input type="submit" value="登录">
        </form>
    </body>
    

    (2) 创建LoginServlet.java

    public class LoginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            //设置正确的用户名为周杰伦,密码是123
            if ("jay".equals(username) && "123".equals(password)) {
                Cookie cookie = new Cookie("username", username);
                cookie.setMaxAge(60 * 60 * 24 * 7); //cookie保存一周
                response.addCookie(cookie);
                System.out.println("登陆成功!");
            } else {
                System.out.println("登陆失败!");
            }
        }
    }
    

    运行结果:
    使用正确的用户名和密码之后,再次访问登陆页面,用户名输入框会自动的填入jay

    九、谷歌浏览器查看Cookie

    在这里插入图片描述

    十、验证码的底层原理

    在这里插入图片描述

    十一、谷歌图片验证码的使用

    谷歌验证码的使用步骤:

    1. 导入谷歌验证码的jar包:
    2. 在web.xml中进行如下的配置(写成一样的即可):
    <servlet>
        <servlet-name>KaptchaServlet</servlet-name>
        <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>KaptchaServlet</servlet-name>
        <url-pattern>/kaptcha.jpg</url-pattern>
    </servlet-mapping>
    
    注:代表访问这个Servlet就会生成验证码及图片,并将此验证码保存到Session域中,每次访问都会生成不同的验证码
    
    1. 在表单中使用img标签显示验证码
    <body>
        <form action="http://localhost:8080/MyTest/Servlet">
            验证码:<input type="text" style="width: 80px;" name="code">
            <img src="http://localhost:8080/MyTest/kaptcha.jpg" alt="验证码没有找到"
                 style="width: 100px; height: 28px;" id="code_img"> <br>
            <input type="submit" value="登录">
        </form>
    </body>
    
    
    1. 在服务器处理获取的验证码
    public class Servlet extends HttpServlet {
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取Session中的验证码
            String attribute = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
            //删除Session中的验证码
            request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
            //获取用户输入的验证码
            String code = request.getParameter("code");
            if (attribute.equalsIgnoreCase(code)) {
                System.out.println("验证码正确!");
            } else {
                System.out.println("验证码错误!");
            }
        }
    }
    

    运行结果:
    在这里插入图片描述

    十二、点击图片切换验证码

    在这里插入图片描述

    代码演示:为上述验证码绑定单击事件(使用script标签)

    window.onload = function () {
        //通过验证码图片的id属性值绑定单击事件
        var elementById = document.getElementById("code_img");
        elementById.onclick = function () {
            //1. 事件响应的function函数中的this对象是当前正在响应事件的标签的dom对象
            //2. src属性可读可写
            this.src = "http://localhost:8080/MyTest/kaptcha.jpg?d=" + new Date();
        }
    } 
    

    运行结果:每次点击验证码的图片都会变成新的验证码,并将新验证码保存到session域中

    展开全文
  • Java Web之Cookie和Session详解

    千次阅读 多人点赞 2018-07-27 17:15:40
    Cookie和Session详解,Cookie和Session之间的联系
  • session存在服务器中,产生一个唯一的session_id 服务器将session_id敏感信息做一个映射存储在session(服务器)中,更加安全 session会有过期时间(如超星 过几天需要重新登录) flask中的session机制 把
  • 前端cookie和session

    千次阅读 2019-05-15 19:38:51
    什么是 Cookie Session ?初级程序员高频面试题。 什么是 Cookie HTTP Cookie(也叫 Web Cookie或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时...
  • Cookie Session 关系详解

    千次阅读 2019-05-17 23:43:35
    什么是 Cookie Session ? Cookie和Session的区别 为什么需要 Cookie Session,他们有什么关联? 如果浏览器中禁止了 Cookie,如何保障整个机制的正常运转。 如何考虑分布式 Session 问题? 如何解决...
  • Cookie和Session详解

    千次阅读 2018-12-01 15:57:30
    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个...本章将系统地讲述CookieSession机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。 1.1 Cookie机制 在程序中,会话跟踪是很重要的...
  • Cookie Session

    千次阅读 2021-01-13 11:17:52
    Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。 Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。Cookie是由...
  • cookie session

    2015-01-30 16:49:07
    cookie session 众所周知,HTTP 是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢? 比如在淘宝的某个页面中,你进行...
  • Cookie和Session

    千次阅读 2016-04-06 18:34:49
    常用的会话跟踪技术是CookieSessionCookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 本章将系统地讲述CookieSession机制,并比较说明什么时候不能用Cookie,什么...
  • cookie和session的详解区别

    千次阅读 多人点赞 2020-02-03 10:10:34
    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。...本章将系统地讲述CookieSession机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。 1.1 Cookie机制 在程序中,会话跟...
  • java cookie和session

    千次阅读 2017-03-06 18:40:45
    常用的会话跟踪技术是CookieSessionCookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 SessionCookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自...
  • Cookie和Session的区别联系

    万次阅读 多人点赞 2019-04-25 19:24:53
    利用session和cookie可以让服务器知道不同的请求是否来自同一个客户端。 1、Cookie定义 Cookie是服务器在本地机器上存储的小段文本并随每一个请求发送至同一服务器。Cookies保存在客户端,主要内容包括:名字,...
  • 关于cookie和session的理论区别网上有很多相关的说明,这里就不再多说了。 本篇主要通过一些实践中的案例大家分享一下踩到坑,重点说明了cookie跨域问题和session服务器共享问题,以php语言为使用语言进行说明...
  • cookie session 区别

    千次阅读 2019-04-25 18:54:15
    目录 保存状态不同: 使用方式不同: 存储内容不同: 存储的大小不同: ...Cookie保存在浏览器端,服务端可以知道其中的信息... 如果不在浏览器中设置过期时间Cookie被保存在内存中,生命周期随浏览器的关闭而...
  • cookie cookie 本意是小甜点, 在web开发中是用来维系状态的一种技术,可以用它实现记住用户名、密码这些参数的操作,就如我们每次登陆页面,跳转到其他页面时我们还是登陆的状态,这就用到了cookie记住用户名密码这...
  • Cookie/Session机制详解

    万次阅读 多人点赞 2011-11-09 17:55:45
    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。...本章将系统地讲述CookieSession机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。 1.1 Cookie机制 在程序中,会话
  • 理解Cookie和Session的区别及使用

    万次阅读 多人点赞 2018-04-25 13:28:58
    Session和Cookie就是为解决这个问题而提出来的两个机制。 应用场景 登录网站,今输入用户名密码登录了,第二天再打开很多情况下就直接打开了。这个时候用到的一个机制就是cookiesession一个场景是购物车...
  • django中cookie和session详解

    千次阅读 2018-11-21 17:45:20
    cookie和session HTTP被设计为”无
  • Java中Cookie的使用(Cookie 和Session的区别)

    万次阅读 多人点赞 2019-01-01 16:08:27
    文章目录web中什么是会话:保存会话Cookie和Session的区别:Java提供的操作Cookie的API实例代码Cookie注意细节删除Cookiecookie中存取中文 web中什么是会话: 用户开一个浏览器,点击多个超链接,访问服务器多个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 88,960
精华内容 35,584
关键字:

cookie和session存在时间