cookie免登陆案例及cookie保存session

主要内容:

假如我们在csdn上登陆账号,登陆之后,关闭浏览器。隔一段时间我们再次打开csdn时,我们会发现我们的账号已经被登陆了。那么这个是怎么实现的呢?接下来我们来实现一下。

思路及代码分析:

  1. 首先我们需要先登陆账号,登陆账号之后我们的用户信息用session存储起来。(用session存储的目的是为了之后你进行写blog或者收藏blog时,确定你是已经登陆了账号了)。
   HttpSession session = request.getSession();
   User user = userService.loginUser(username, password);
       session.setAttribute("user",user);
    
   
  1. 我们用cookie将用户的session信息储存起来,这样关闭浏览器后再次访问session的时候,此时的session和关闭前的session内容一样,就可以获取原来的session信息了。(我们知道,session是存储到服务器的,cookie是存储到浏览器的。session是依赖cookie的,当我们创建一个session之后,此时浏览器会生成一个键名为JSESSIONID的cookie来存放这一整次会话的session信息,但是当我们关闭浏览器后JSESSIONID的值就会重新赋予,就不能获取关闭浏览器前的session信息了)。
//session.getId();此处的session就是对应上方的session
//获取登录账户的session  
//session是服务器储存,但是当浏览器关闭,服务器不关闭时重新打开浏览器。两次的session不是同一个。所以需要通过cookie保留原来的session数据
   			   Cookie userCookie = new Cookie("JSESSIONID",session.getId());
         	   userCookie.setMaxAge(60*60);//我这里设置的存活时间为一个小时
                 response.addCookie(userCookie);
  				   //获取用户名            
 				  Cookie usernameCookie= new Cookie("username",user.getUsername());
  				 //获取密码
                 Cookie passwordCookie = new Cookie("password",user.getPassword());

                 //设置cookie存活一小时
                 usernameCookie.setMaxAge(60*60);
                 passwordCookie.setMaxAge(60*60);
               
				//将cookie响应回去	
                 response.addCookie(usernameCookie);
                 response.addCookie(passwordCookie);
       
我们这时候已经登陆了(第一次登录)。
我们把账号和密码也存到cookie里面,用于之后每次打开浏览器后的用户判断,判断浏览器是否存在我们的信息,从而决定我们是否需要重新登录账号
                 
  1. 此时,当我们关闭浏览器后再打开浏览器,两次获取的session的值就一样了,并且我们已经把之前用户的账户信息存到了cookie里面。接下来我们就可以进行登陆判断了。(以我的项目的代码为例)
 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        request.setCharacterEncoding("utf-8");
        //存放cookie信息的map集合
        Map<String,String> cookieMap = new HashMap<>();
      
        //获取之前存放的cookies的信息
          Cookie[] cookies = request.getCookies();

          //获取cookie
            //1.先判断是否有cookie
          if (cookies!=null&&cookies.length!=0){
    
    
              System.out.println("有cookie信息,判断该用户");
              for (Cookie cookie:cookies){
    
    
              //2.往集合中存入用于用户名和密码判断的cookie值
                  if (cookie.getName().contains("username")||cookie.getName().contains("password")){
    
    
                      cookieMap.put(cookie.getName(),cookie.getValue());
                  }

              }
              //3.分别获取cookie存放的用户名和密码,用于验证(万一我要是修改了用户名密码,浏览器保存的是之前的,所以要先验证)
              String username = cookieMap.get("username");
              String password = cookieMap.get("password");
               //进行数据库访问
              User user =userService.loginUser(username, password);
               //判断是否存在
              if (user!=null){
    
    
                  //验证成功,直接登陆查看blog
                  System.out.println("用户信息已经存在,可以直接登陆了");
                 //既然数据库中有信息,说明验证成功,我就可以直接跳转到我的blog的页面了。
                  response.sendRedirect("/aishangboke/pageSearchServlet");
              }
              if (user==null){
    
    
                  //验证失败,重新登陆查看blog
                         //既然数据库中没有,说明验证失败,我就直接跳转到登陆页面重新登陆了。response.sendRedirect("/aishangboke/view/login.jsp");
              }
          } else{
    
    
          //如果cookie的长度为0,说明浏览器中没有存放cookie或者存放的cookie信息已经过期,跳转到重新登陆页面
              System.out.println("没有cookie信息,进行登陆");
              response.sendRedirect("/aishangboke/view/login.jsp");
          }
    }

小结

核心登陆案例的代码转换就是上方这些。

服务器运行时,你可以先写一个接口,进行cookie的判断:1、如果cookie不存在,说明你还没有登陆过,你可以跳转到登陆页面,进行账号登陆。2、如果cookie存在,你就可以直接跳转到登陆者信息的我的blog页面(以csdnblog为例),直接进行blog的查看。

后续的代码与cookie无关了,cookie等于说在这里发挥了两个功能:1、存放之前登陆者的session信息。2、进行账号登陆的判断。

问题:

我们是直接将登陆者的用户密码存到了cookie里面,这样是不安全的,用户的账号和密码很容易被窃取,所以我们还要进行响应的加密操作。加密操作日后更新。

猜你喜欢

转载自blog.csdn.net/zhang19903848257/article/details/107818861
今日推荐