[Spring boot] 로그인 관련 기능 구현

백준호·2022년 11월 9일
0

스프링 부트

목록 보기
5/9
post-thumbnail

로그인 관련 기능을 구현할 때는 크게 로그인 로그아웃 상태로 나누어 폼을 구성한다. 로그인 시 넘겨받아온 아이디, 패스워드 파라메타를 db와 일치하는지 체크 후 일치하면 세션에 저장한다. 그 후 로그인 상태에서만 볼 수 있는 창들을 조건문을 통해 구현한다. 로그아웃시 세션을 제거한다.

controller.java

    @Autowired
	MemberService service;
	
    //로그인 메서드
	@PostMapping("/login/loginproc")
	public String loginProc(@RequestParam String id,
			@RequestParam String pass,
			@RequestParam (required = false) String cbsave, //널값 때문에 오류가 발생 할 수 있는것들은 모두 리콰이어 펄스나 체크값 체크드해놓기
			HttpSession session) {
		
        //아이디 비밀번호가 일치하는지 확인하는 메서드 호출
		int check=service.getIdPassCheck(id, pass);
		
        //참일 경우 세션에 저장
		if(check==1) {
			session.setMaxInactiveInterval(60*60*8); //세션 8시간 저장
		
			session.setAttribute("myid", id); //아이디 세션에저장
			session.setAttribute("loginok", "yes"); //로그인상태 세션에저장
			session.setAttribute("saveok", cbsave); //아이디저장 여부
		
			return "redirect:main";
		}else {
			return "/member/passfail";
            //alert로 로그인 실패를 알리는 jsp로 이동
		}
		
	}
	
    로그아웃 메서드
	@GetMapping("/login/logoutproc")
	public String logoutProc(HttpSession session) {
		
        //세션제거 
		session.removeAttribute("loginok");

		return "redirect:main";
	}
	
    로그인 시 아이디를 저장해 남길 수 있도록 하는 메서드
	@GetMapping("/login/main")
	public String form(HttpSession session,Model model)
	{
		
		//로그인상태인지 아닌지
		String loginok=(String)session.getAttribute("loginok");
		
		//폼에 아이디 얻어오기
		String myid=(String) session.getAttribute("myid");
		
		
		if(loginok==null) //한번도 실행을 안했다면
			return "/login/loginform";
		else {
		
			//로그인중에는 로그인한 이름저장
			String name=service.getName(myid);
			
			//request저장
			model.addAttribute("name",name);
			
			return "/login/logoutform";
		}
	}
}

loginform.jsp

<body>
  <div class="loginform" style="margin: 50px 50px;">
     <form action="loginproc" method="post">
       <table class="table table-bordered" style="width: 400px;">
          <caption><b>회원로그인</b></caption>
            <tr>
              <th style="width: 120px; background-color: #ffffff">아이디</th>
                <td>
                  <input type="text" name="id" class="form-control" required="required"
                  placeholder="아이디" style="width: 150px;" value="${sessionScope.saveok==null?"":sessionScope.myid }">  <!-- //세션 스코프로 벨류값을 줘 세션에 저장하는 값 남기기 -->
                </td>
            </tr>
            <tr>
              <th style="width: 120px; background-color: #fff0f5">비밀번호</th>
                <td>
                  <input type="password" name="pass" class="form-control" required="required"
                  placeholder="비밀번호" style="width: 150px;">
                </td>
            </tr>
            <tr>
              <td colspan="2" align="center">
                <input type="checkbox" name="cbsave" ${sessionScope.saveok==null?"":"checked" }>아이디 저장 <!-- 아이디 저장 세이브 ok가 비어있다면 공란 아니면 check -->
                   <button type="submit" class="btn btn-info" style="width: 150px;">회원로그인</button>
              </td>
            </tr>
       </table>
     </form>
  </div>
</body>

loginform은 post로 전송해 파라메타를 전송하며, 로그인을 성공한 이력(세션이 저장된 이력)이 있을 경우 세션에서 myid를 sessionScope로 불러와 삼항연산자를 이용해 밸류값을 저장한다. 아이디저장 checkbox역시 saveok의 세션값 저장여부에 따라 check값을 준다.


logoutform

<body>
<div style="margin-left: 100px; margin-top: 50px;">
	<b>${name }님 로그인되었습니다</b><br><br>
	<button type="button" class="btn btn-danger" style="width: 100px"
	onclick="location.href='logoutproc'">로그아웃</button>
</div>
</body>

로그아웃폼은 로그아웃이 가능한 버튼이 있는 폼. 기본적으로 로그인 상태를 표현한다.


service

public String getName(String id); //id에 해당하는 이름반환
public int getIdPassCheck(String id,String pass); //서비스에서는 매퍼인터의 map값을 더 풀어서 나타내기

MapperInter

public String getName(String id); //id에 해당하는 이름반환
public int getIdPassCheck(Map<String, String> map); //id와 비번을 파라메타로 넘겨서 반환 <키값,벨류값> 키값은 무조건 스트링... 벨류값은 둘 다 스트링이면 스트링 섞여있으면 object

sql.xml(mapper)

 <select id="getName" parameterType="String" resultType="String">
    select name from bootmember where id=#{id}
 </select>
 
 <select id="getIdPassCheck" parameterType="Hashmap" resultType="int">
     select count(*) from bootmember where id=#{id} and pass=#{pass}
 </select>
 

콘트롤러에 사용된 sql문

profile
남들이 다 아는 걸 모를 수는 없지!

0개의 댓글