zoukankan      html  css  js  c++  java
  • java web----cookie/session

    Cookie使用

    作用:解决了发送的不同请求的数据共享间题

    使用:
        #创建Cookie对象
        Cookie c=new Cookie(string name,String value);
        #设置cookie(可选)
            #设置有效期(默认存放在内存中,随着浏览器关闭而关闭)
            c.setMaxAge(int seconds);
            #设置有效路径(只有访问该路径,cookie才会附带上)
            c.setPath(string uri)
        #响应Cookie信息给客户端
        resp.addCookie(c);
    注意:
        一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
    特点:
        浏览器端的数据存储技术。存储的数据声明在服务器端。
        临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。
        定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
        默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径     

    cookie获取

    //获取Cookie信息数组
        Cookie[]cks=req.getcookies();
    //遍历数组获取Cookie信息
        使用for循环遍历即可,示例:
            if(cks!=nul1){
                For(Cookie c:cks){
                    String name=c.getName();
                    String value=c.getValue();            
                    system.out.print1n(name+":"+value);
            }}      
    

    Session使用

    sessionid生命周期

    1、浏览器第一次请求服务器时,服务器会生成一个sessionId,并返回给浏览器,这个sessionId会被保存在浏览器的会话cookie中。

    2、在浏览器不关闭的情况下,之后的每次请求请求头都会携带这个sessionId到服务器(一般会设置更新服务器session时间)

    3、如果浏览器一直到30分钟后,才发起第二次请求,此时的服务器session已经清空,服务器就会生成一个新的sessionId给浏览器(伴随着一个新的session存在服务器),替代之前的浏览器的sessionid

    4、第三次请求,就带上的新的sessionid(cookie中保存着sessionId,如果禁用了cookie,cookie就存不了sessionId,但是我们可以使用url重写技术,将sessionId当作参数放到url后面)。

      默认情况,session在服务器上储存为30分钟,保存了用户的一些信息,一旦session清除,用户这次登陆的所有的数据都全部清除。那我们是不是又要手动重新登陆了?我们是需要重新登陆的,只是cookie帮我们自动登录了,一般服务器会给我们浏览器上保存一个cookie,用来验证身份登陆的。每次都会默默的帮我们登陆,其实每次我们打开浏览器,打开某一个网址,这时候,cookie就会帮我们默默等登陆,只是我们感受不到而已。

      所以,我们一般验证用户信息的时候(拦截器),一般先看session中是否保存了user对象,如果没有,获取cookie中的账号和密码看看是否可以登录,如果还是不行,直接跳转到登录页面;

    关于session存储问题

      我们知道session是服务器保存用户的基本信息。

      对于单独服务器,我们可以将session保存到本地服务器。

      对于多台服务器,多个服务器共享session,我们就必须把session放到一个公共地方(比如redis),或者使用jwt

    基本使用流程

    请求login.html-->将需要的数据存放到session中,或者将后续反复使用的数据存放到session中

    请求home.html-->获取session,取出我们之前存入到session中的数据。

    使用:
        创建session对象/获取session对象
            HttpSession hs=req.getSession();如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象,
                              如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存放到浏览器上。
                                              如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
    

    session配置

    设置session存储时间(单位:秒),默认30分钟,每一个请求都会重新设置失效时间
      hs.setMaxInactiveInterval(5);
    获取sessionid
      hs.getId():
    设置session强制失效
      hs.invalidate();l
    存储数据
      hs.setAttribute("name",name);
    获取数据
      hs.getAttribute("name")
    使用时机:
    一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
    

    直接配置session过期时间

    1、在tomcat中的web.xml(conf目录下)修改这个时间

    <session-config>
            <session-timeout>30</session-timeout>
    </session-config>
    

     

    cookie免登陆和session综合使用

    关于token:https://www.cnblogs.com/minsons/p/7058837.html

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.*;
    import java.io.IOException;
    
    @WebServlet("/login")
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            Cookie[] cookies = req.getCookies();
            for (Cookie cookie:cookies){
                if ("username".equals(cookie.getName())){
                    String value = cookie.getValue();
                    //判断用户是否存在(查数据库,验证用户是否存在)
                    if ("admin".equals(value)){
                        //设置session,存放会话
                        HttpSession session = req.getSession();
                        session.setAttribute("username",value);
                        resp.sendRedirect("/home");
                        return;
                    }
                }
            }
            resp.sendRedirect("/login.jsp");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
            String pwd = req.getParameter("pwd");
            //查询数据库,如果有用户,就设置session
            if (true){
                //设置cookie,免登陆
                Cookie cookie = new Cookie("username",username);
                cookie.setMaxAge(60*5);
                cookie.setPath("/");
                resp.addCookie(cookie);
                //设置session,存放会话
                HttpSession session = req.getSession();
                session.setAttribute("username",username);
                session.setAttribute("pwd",pwd);
                resp.sendRedirect("/home");
            }
        }
    }
    

      

    @WebServlet("/home")
    public class ServletDemo extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            HttpSession session = req.getSession();
            Object username = session.getAttribute("username");
            if(username==null){
                resp.sendRedirect("/login");
                return;
            }
            resp.setHeader("content-type","text/html;charset=utf-8");
            resp.getWriter().write((String)username+"登录成功");
        }
    }
    

      

  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/13803575.html
Copyright © 2011-2022 走看看