JSP
[JSP] servlet 활용 _ 로그인, 로그아웃 기능만들기
(งᐛ)ว
2023. 11. 4. 21:20
728x90
필요한 파일을 먼저 세팅하자

DBService.java파일은 그대로 사용가능 (캡쳐생략)
VO/DAO

check_login.jsp (로그인 상태여부를 검증하는 jsp)
main_content.jsp (로그인 성공했을때만 접근가능한 페이지)
login_form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src = "js/httpRequest.js"></script> <!-- ajax 사용을 위해 입력 -->
<script type="text/javascript">
function send(f){
var id = f.id.value.trim();
var pwd = f.pwd.value.trim();
if(id==""){
alert("아이디를 입력하세요");
return;
}
if(pwd==""){
alert("비밀번호를 입력하세요");
return;
}
//ajax로보내기
////////////////////////////////////////
//LoginAction.java 생성 후 작성예정
////////////////////////////////////////
</script>
</head>
<body>
<form>
<table border="1" align="center">
<caption>:::로그인:::</caption>
<tr>
<th>아이디</th>
<td><input name = "id"></td>
</tr>
<tr>
<th>비밀번호</th>
<td><input name = "pwd" type="password"></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="button" value="로그인" onclick="send(this.form)">
</td>
</tr>
</table>
</form>
</body>
</html>
LoginAction.java
URL mappings 수정명 : /login.do
package action;
import java.io.IOException;
/**
* Servlet implementation class LoginAction
*/
@WebServlet("/login.do")
public class LoginAction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
String pwd = request.getParameter("pwd"); //우리가 입력한 비밀번호
MemberVO vo = MemberDAO.getInstance().selectOne(id);
DAO 이어서

LoginAction.java 이어서
String param="";
String resultStr="";
if(vo==null) {
param="no_id";
resultStr = String.format("[{'param':'%s'}]",param);
response.getWriter().print(resultStr);
return;
}
if(!vo.getPwd().equals(pwd)) { //getPwd() : DB에 저장된 비밀번호
param="no_pwd";
resultStr = String.format("[{'param':'%s'}]",param);
response.getWriter().print(resultStr);
return;
}
//아이디와 비밀번호 체크에 문제가 없다면 세션에 바인딩한다.
//세션은 서버의 메모리(램)를 사용하기 때문에 세션을 많이 사용할수록 브라우저가 느려진다. 필요한 곳에서만 세션을 쓰도록 하자.
HttpSession session = request.getSession(); //세션객체생성
session.setMaxInactiveInterval(3600); //1시간 -> 3600초. 초단위로 작성해야함
session.setAttribute("vo", vo);
//세션은 브라우저 하나당 객체가 하나가 있기 때문에 별도의 포워딩이 필요없고 어느 jsp에서든지 el표기법으로 사용할 수 있다.
param="clear";
resultStr=String.format("[{'param':'%s'}]",param);
response.getWriter().print(resultStr);
}
}
login_form.jsp 이어서 빗금부분 채우기
//ajax로보내기
////////////////////////////////////////
//LoginAction.java 생성 후 작성예정
////////////////////////////////////////
var url = "login.do";
var param = "id="+id+"&pwd="+encodeURIComponent(pwd);
//encodeURIComponent:특수문자 안깨지게
sendRequest(url,param,myCheck,"POST");
}
//콜백메서드
function myCheck(){
if(xhr.readyState == 4 && xhr.status == 200){
var data = xhr.responseText;
var json = eval(data);
if(json[0].param=="no_id"){
alert("아이디가 존재하지 않습니다.")
}else if(json[0].param=="no_pwd"){
alert("비밀번호가 틀렸습니다.")
}else{
alert("로그인 성공");
location.href="main_content.jsp";
}
}
}

check_login.jsp (로그인상태 검증)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!-- jstl 코어라이브러리 -->
<c:if test="${empty vo}"> <!-- vo가 비어있다는 것은 세션에 저장을 못했다는것 -->
<script>
alert("로그인이 필요합니다");
location.href="login_form.jsp";
</script>
</c:if>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
main_content.jsp (로그인 성공시 접근가능)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<jsp:include page="check_login.jsp"/>
<!-- include 액션태그는 디렉티브태그처럼 jsp페이지의 특정 영역에 외부파일의 내용을 포함하는 태그이다.
jsp 페이지에 포함할 수 있는 외부파일은 html, jsp, 서블렛페이지가 있다.
main_content페이지에 접근하려고 해도 check_login에 먼저 접근해야 한다. -->
메인페이지<br>
${vo.name}님 로그인을 환영합니다.<br>
<input type="button" value="로그아웃" onclick="location.href='logout.do'">
</body>
</html>
**include 액션태그와 디렉티브태그 모두 특정 영역에 외부파일의 내용을 포함하는 공통점이 있다.
차이점은 다음과 같다.

처리과정 차이

액션태그 사용시 흐름이 실제 다른 페이지로 넘어가서 실행한 후 돌아옴

디렉티브태그 사용시 코드 자체를 포함시킨 후 하나의 페이지로 처리
LogoutAction.java
URL mappings 수정명 : /logout.do
package action;
import java.io.IOException;
/**
* Servlet implementation class LogoutAction
*/
@WebServlet("/logout.do")
public class LogoutAction extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
*/
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.getSession()
//session이 있으면 그 객체를 반환
//session이 없으면 새 객체를 반환
HttpSession session = request.getSession();
//세션에 들어있는 모든 속성 제거는 위험할 수 있으므로
//session.invalidate();
//로그아웃을 요청한 사람만 제거
session.removeAttribute("vo");
//세션에서 제거해주고 다시 세션이 필요한곳에서 접근을 못하게하면됨
response.sendRedirect("login_form.jsp");
}
}
확인은 login_form.jsp 에서 실행
결과

위의 include 디렉티브 태그 사용해보기
layout.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table width="500" border="1">
<tr>
<td>
<jsp:include page = "top.jsp"/>
</td>
</tr>
<tr>
<td>
<jsp:include page = "content.jsp"/>
</td>
</tr>
<tr>
<td>
<jsp:include page = "bottom.jsp"/>
</td>
</tr>
</table>
</body>
</html>
top.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>top</title>
</head>
<body>
상단메뉴 :
<a href = "#">HOME</a>
<a href = "#">INFO</a>
</body>
</html>
content.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<br><br>
내용 페이지
<br><br>
</body>
</html>
bottom.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
하단메뉴 :
<a href="#">도움말</a>
<a href="#">약관</a>
<a href="#">사이트맵</a>
</body>
</html>
layout.jsp에서 실행

include 태그로 태그중복을 줄일 수 있는 장점이 있다.
728x90