Cookie 和 Session

1Cookie:是浏览器在本地持久化的一种机制,

1.Cookie的数据从哪里来?

服务器返回给浏览器的

2.Cookie的数据长啥样?

Cookie中是键值对结构的数据,并且这里的键值对都是程序员自定义的

3.Cookie有啥作用:

Cookie就可以在浏览器这边存储一些“临时性的文件”,其中最经典的一种使用方法,就是用来存储“身份标识”--》涉及到Session与Cookie联动(Session在服务器中存储数据,存储用户的详细信息,同时给这个用户分配一个SessionID,进一步服务器就知道是哪一个用户在操作了。)

4.Cookie到哪里去?

Cookie的内容会在下次访问该网站的时候,自动的被带到HTTP请求中去。

5.Cookie咋存的?

浏览器按照不同的“域名”分别存储Cookie域名和域名之间的Cookie互不干扰,Cookie存储在有硬盘中,重启不消失,但是Cookie 也不会一直存储下去,会有超时时间,不同的网站的超时时间是不同的,比如中国银行app几分钟可能就会出现让你重新登录的消息。

会话机制(Session)

服务器同一时刻收到的请求是很多的,服务器需要清楚的知道是哪一个用户访问的,就需要在服务器这边记录每个用户的SessionID和用户的信息的对应关系。

Cookie和Session的区别:

1.Cookie是存储在浏览器上的,Session是存储在服务器上的。

2.Cookie和Session经常是一起配合使用的,但也不是必须配合,

  • 完全可以用Cookie来保存一些客户端的信息,这些数据不一定是用户的信息,也不一定是token/SessionID。
  • Session中的token/sessionID也不一定非要set-Cookie/cookie传递

Cookie的操作:

cookie[] getCookie() 就是获取请求中的所有cookie内容,返回值是一个数组,每个cookie都是有键也有值
String getValue() 获取cookie值
String getName()

获取cookie的名称

void setValue(String newValue) 设置新值
void addCookie(Cookie cookie) 把cookie添加到响应zhong,在HTTP响应报文中添加一个set-Cookie header

session的操作:

HttoSession getSession()

1.若果当前用户没有session,就会创建session

2.如果已经有了session,就能够查询到这个session

httpsession类中的核心方法

object getAttribute(String name) 返回该方法中的session指定名称的对象,如果没有指定名称,该方法会指定名称绑定一个对象的session会话
void setAttribute(String name,Object value) 使用指定的名称绑定一个对象到该session会话
boolean isNew() 判定当前是否是新创建出的会话

session更像一个map里面存储的是键值对,此时程序员可以自定义设置键值对

session,在一个服务器上是存在多份的,每个用户都有自己的session,一个服务器同时会有多个用户, 每个Session对象,youkeyi存储键值对,此处我们称这个为attribute,主要是区分key,这个键值对也是程序员自定义的。

下面是实现是实现一个用户登录的栗子(没连上数据库)

登录页面(在webapp目录下)




    
    
    登录
    


登陆页面

用户名:
密码:

登录响应的servlet程序(main目录下)

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.TreeMap;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取用户名,和密码
        String userName= req.getParameter("username");
        String Password=req.getParameter("password");
        if(userName==null || Password==null || userName.equals("") || Password.equals(""))
        {
            resp.getWriter().write("当前请求不完整");
            return;
        }
        //2.验证用户名和密码是否正确,正常的是从数据库中验证,密码和用户名是不是匹配
        if(!userName.equals("zhangsan"))
        {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("用户名错误");
            return;
        }
        if(!Password.equals("123456"))
        {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("密码错误");
            return;
        }
        ServletContext context=getServletContext();
        Integer times=(Integer)(context).getAttribute("times");
        if(times==null)
        {
            times=1;
        }
        else
        {
            times=times+1;
        }
        context.setAttribute("times",times);
        //3.创建会话
        HttpSession session=req.getSession(true);
        //true:不存在会话创建会话,存在则查询->查询Cookie
        //false:不存在返回null,存在则查询
        //getSession()
        //1.先读取请求的cookie,看cookie里是否有JSESSIONIN属性,
        //2.如果确实想要创建session对象,就会创建,同时生成一个唯一的SessionID,以sessionID为key的对象为value的键值对,插入到服务器的hashmap中
        //3.isessionid又会通过addCookie方法加入到响应,相依就会带有Set-code字段,就会jseesionid这个键值对,然后返回浏览器
        //会话中可以存在一些数据
        session.setAttribute("username",userName);
        session.setAttribute("time",System.currentTimeMillis());
        session.setAttribute("times",times);
        //自动跳转页面
        //此时约定主页的路径是index(一会会生成一个servlet程序员显示页面)
        resp.sendRedirect("index");
    }
}

跳转页面(main目录下)

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.rmi.server.UID;

@WebServlet("/index")
public class IndexServlet extends HttpServlet {
    private static final long UID=1L;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //验证登录,如果未登录,这显示让用户登录
        HttpSession session=req.getSession(false);
        if(session==null)
        {
            resp.setContentType("text/html;charset=utf8");
            resp.getWriter().write("请先登录");
            return;
        }
        String username=(String) session.getAttribute("username");
        Long time=(Long)session.getAttribute("time");
        Integer times=(Integer) session.getAttribute("times");
        System.out.println("username"+username+",time"+time);
        //显示一个页面
        resp.setContentType("text/html;charset=utf8");
        resp.getWriter().write("欢迎"+username+"!您上次登录的时间是"+time+"这是第"+times+"访问页面");
    }
}

 运行结果:

登录进去:

 Cookie 和 Session_第1张图片

你可能感兴趣的:(java,前端,服务器)