• 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+"登录成功");
        }
    }
    

      

  • 相关阅读:
    栈· 用一个栈实现另一个栈的排序
    Array+DP leetcode-11.装更多的水
    string+DP leetcode-4.最长回文子串
    leetcode-3 最长无重复字串
    栈 · 有getMin功能的栈O(1)
    VS OpenCV imread imwrite nameWindow等相关报错问题
    socket字符流循环截取
    jsp:set/getProperty底层实现的探究
    关于C++11右值引用和移动语义的探究
    VS fopen sprinft ... unsafe 问题
  • 原文地址:https://www.cnblogs.com/yanxiaoge/p/13803575.html
Copyright © 2020-2023  润新知