로그인 관련 기능을 구현할 때는 크게 로그인 로그아웃 상태로 나누어 폼을 구성한다. 로그인 시 넘겨받아온 아이디, 패스워드 파라메타를 db와 일치하는지 체크 후 일치하면 세션에 저장한다. 그 후 로그인 상태에서만 볼 수 있는 창들을 조건문을 통해 구현한다. 로그아웃시 세션을 제거한다.
@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";
}
}
}
<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값을 준다.
<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>
로그아웃폼은 로그아웃이 가능한 버튼이 있는 폼. 기본적으로 로그인 상태를 표현한다.
public String getName(String id); //id에 해당하는 이름반환
public int getIdPassCheck(String id,String pass); //서비스에서는 매퍼인터의 map값을 더 풀어서 나타내기
public String getName(String id); //id에 해당하는 이름반환
public int getIdPassCheck(Map<String, String> map); //id와 비번을 파라메타로 넘겨서 반환 <키값,벨류값> 키값은 무조건 스트링... 벨류값은 둘 다 스트링이면 스트링 섞여있으면 object
<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>