쿠키없는 로그인 케이스 및 쿠키 저장 세션

메인 콘텐츠:

csdn에서 계정에 로그인하면 로그인 후 브라우저를 닫습니다. 잠시 후 csdn을 다시 열면 계정이 로그인 된 것을 알 수 있습니다. 그렇다면 어떻게 이룰 수 있습니까? 다음에 구현해 보겠습니다.

아이디어 및 코드 분석 :

  1. 먼저 계정에 먼저 로그인해야하며 로그인 후 사용자 정보가 세션에 저장됩니다. (세션 스토리지를 사용하는 목적은 나중에 블로그를 작성하거나 블로그를 북마크 할 때 계정에 로그인했는지 확인하는 것입니다.)
   HttpSession session = request.getSession();
   User user = userService.loginUser(username, password);
       session.setAttribute("user",user);
    
   
  1. 우리는 쿠키를 사용하여 사용자의 세션 정보를 저장하므로 브라우저를 닫고 세션에 다시 액세스하면 현재 세션이 닫기 전 세션과 동일하며 원래 세션 정보를 얻을 수 있습니다. (세션이 서버에 저장되고 쿠키가 브라우저에 저장된다는 것을 알고 있습니다. 세션은 쿠키에 의존합니다. 세션을 생성 할 때 브라우저는이 전체를 저장하기 위해 JSESSIONID라는 키 이름으로 쿠키를 생성합니다. 두 번째 세션의 정보가 있지만 브라우저를 닫으면 JSESSIONID 값이 다시 할당되며 브라우저를 닫기 전 세션 정보를 얻을 수 없습니다.
//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. 이때 브라우저를 닫고 브라우저를 열면 두 번 획득 한 세션의 값은 동일하며 이전 사용자의 계정 정보를 쿠키에 저장했습니다. 다음으로 로그인 판단을 할 수 있습니다. (내 프로젝트 코드를 예로 들어)
 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");
          }
    }

요약

핵심 로그인 케이스의 코드 변환은 위와 같습니다.

서버가 실행 중일 때 쿠키를 판단하기위한 인터페이스를 작성할 수 있습니다. 1. 쿠키가 존재하지 않으면 로그인하지 않은 것입니다. 로그인 페이지로 이동하여 계정에 로그인 할 수 있습니다. 2. 쿠키가있는 경우 로그인 정보의 내 블로그 페이지 (예 : csdnblog)로 직접 이동하여 블로그를 직접 볼 수 있습니다.

후속 코드는 쿠키와 관련이 없으며 쿠키는 여기에서 두 가지 기능을 수행한다고 말하는 것과 같습니다. 1. 이전 로그인의 세션 정보를 저장합니다. 2. 계정 로그인을 판단합니다.

문제:

안전하지 않은 쿠키에 로그인 한 사용자의 비밀번호를 직접 저장하고 있으며, 사용자의 계정과 비밀번호는 쉽게 도난 당할 수 있으므로 응답을 암호화해야합니다. 암호화 작업은 향후 업데이트 될 예정입니다.

추천

출처blog.csdn.net/zhang19903848257/article/details/107818861