5월 ~ 7월) 웹/jsp

59Day - [홈페이지 만들기 2일차] admin_check.jspf/ login_check.jspf /login_returnUrl.jspf / $$ header_admin/ member_login.jsp /member_modify_action.jsp/ member_remove.jsp/ member_remove_action.jsp/ password_confirm.jsp/ search_id.jsp/ search_id..

첼로그 2023. 7. 3. 02:17

6월 28일 59day 
** 페이지 권한처리 중요! 판단해서 에러페이지로 보내야할지 이런것

아이디 중복 검사 / 회원변경 및 회원 탈퇴 / 로그인 값 입력받기

회원정보 저장 등


(sql)
select * from member;
update member set member_status=1 where id = 'xyz789';
commit;

-------------

webapp > security )
admin_check.jspf

<%@page import="xyz.itwill.dto.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 비로그인 상태의 사용자이거나 로그인 상태의 사용자가 관리자가 아닌 경우 에러메세지를 
출력하기 위한 JSP 문서로 이동하도록 URL 주소를 전달하여 응답하는 소스코드를 저장한 JSPF 파일 --%>
<%
	MemberDTO loginMember=(MemberDTO)session.getAttribute("loginMember");

	if(loginMember==null || loginMember.getMemberStatus()!=9) {
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()+"/index.jsp?group=error&worker=error_400'");
		out.println("</script>");
		return;
	}
%>


login_check/jspf

<%@page import="xyz.itwill.dto.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 비로그인 상태의 사용자가 JSP 문서를 요청한 경우 에러메세지를 출력하기 위한 JSP 문서로
이동하도록 URL 주소를 전달하여 응답하는 소스코드를 저장한 JSPF 파일 --%>
<%-- => include Directive에서 사용하기 위한 파일 --%>    
<%
	MemberDTO loginMember=(MemberDTO)session.getAttribute("loginMember");

	if(loginMember==null) {
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()+"/index.jsp?group=error&worker=error_400'");
		out.println("</script>");
		return;
	}
%>


login_returnUrl.jspf

<%@page import="java.net.URLEncoder"%>
<%@page import="xyz.itwill.dto.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 비로그인 상태의 사용자가 JSP 문서를 요청한 경우 로그인 기능을 제공하는 JSP 문서로
이동하도록 URL 주소를 전달하여 응답하는 소스코드를 저장한 JSPF 파일 --%>
<%-- => 로그인 후 요청할 JSP 문서의 URL 주소를 질의문자열로 전달 --%>
<%
	//바인딩된 세션에서 권한 관련 정보의 속성값을 객체(로그인 상태의 사용자정보)로 반환받아 저장
	MemberDTO loginMember=(MemberDTO)session.getAttribute("loginMember");
	
	//비로그인 상태의 사용자가 JSP 문서를 요청한 경우 [member/member_login.jsp] 문서로 이동하기
	//위한 URL 주소를 클라이언트에게 전달하여 응답
	// => 로그인 후 기존 요청 JSP 문서로 이동되도록 설정
	if(loginMember==null) {
		//request.getRequestURI() : 요청 URL 주소에서 JSP 문서의 경로를 반환하는 메소드 
		String requestURI=request.getRequestURI();
		//System.out.println("requestURI = "+requestURI);//requestURI = /jsp/index.jsp
				
		//request.getQueryString() : 요청 URL 주소에서 질의문자열(QueryString)을 반환하는 메소드 
		String queryString=request.getQueryString();		
		//System.out.println("queryString = "+queryString);//requestURI = /jsp/index.jsp
		
		String returnUrl="";
		if(queryString!=null) {
			returnUrl=requestURI+"?"+queryString;
		} else {
			returnUrl=requestURI;
		}
		//System.out.println("returnUrl = "+returnUrl);
		
		//로그인 후 요청할 JSP 문서의 URL 주소를 부호화 처리하여 저장
		returnUrl=URLEncoder.encode(returnUrl, "utf-8");
		
		//로그인 후 요청할 JSP 문서의 URL 주소를 질의문자열로 전달
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()
				+"/index.jsp?group=member&worker=member_login&returnUrl="+returnUrl+"';");
		out.println("</script>");
		return;
	}
%>


webapp )
header_admin

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<div id="profile">
	관리자님, 환영합니다.&nbsp;&nbsp;
	<a href="<%=request.getContextPath() %>/member/member_logout_action.jsp">로그아웃</a>&nbsp;&nbsp;
	<a href="<%=request.getContextPath() %>/index.jsp?group=main&worker=main_page">쇼핑몰 이동</a>&nbsp;&nbsp;
</div>
<div id="logo"><a href="<%=request.getContextPath() %>/index.jsp">관리자</a></div>
<div id="menu">
	<a href="#">회원관리</a>
	<a href="#">게시글관리</a>
	<a href="#">제품관리</a>
	<a href="#">구매관리</a>
</div>
</html>

 



webapp > member)
member_login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 사용자로부터 로그인정보(아이디와 비밀번호)를 입력받기 위한 JSP 문서 --%>
<%-- => [로그인] 태그를 클릭한 경우 [member/member_login_action.jsp] 문서를 요청하여 이동 - 입력값(로그인정보) 전달 --%>
<%
	//전달값(로그인 후 요청할 JSP 문서의 URL 주소)을 반환받아 저장
	String returnUrl=request.getParameter("returnUrl");
	if(returnUrl==null) {
		returnUrl="";
	}

	//인증 실패시 세션에 저장되어 제공된 속성값을 객체로 반환받아 사용
	// => [member_login.jsp] 문서에서만 사용 가능하도록 속성값을 객체로 반환받은 후 반드시 삭제 
	String message=(String)session.getAttribute("message");
	if(message==null) {
		message="";
	} else {
		session.removeAttribute("message");
	}
	
	String id=(String)session.getAttribute("id");
	if(id==null) {
		id="";
	} else {
		session.removeAttribute("id");
	}
%>    
<style type="text/css">
#space {
	height: 50px;
}    
.login_tag {
	margin: 5px auto;
	width: 300px;
}    

#loginForm label {
	text-align: right;
	width: 100px;
	float: left;
}

#loginForm ul li {
	list-style-type: none;
	margin-bottom: 10px;
}

#loginForm input:focus {
	border: 2px solid aqua;
}

#login_btn {
	margin: 0 auto;
	padding: 5px;
	width: 300px;
	background-color: black;
	color: white;
	font-size: 1.2em;
	cursor: pointer;
	letter-spacing: 20px;
	font-weight: bold; 	 
}

#search {
	margin-top: 10px;	
	margin-bottom: 20px;	
}

#message {
	color: red;	
	font-weight: bold;
}

a:hover {
	color: blue;
	text-decoration: underline;
}
</style>
<div id="space"></div>
<form id="loginForm" name="loginForm" action="<%=request.getContextPath() %>/member/member_login_action.jsp" method="post">
	<input type="hidden" name="returnUrl" value="<%=returnUrl%>">
	<ul class="login_tag">
		<li>
			<label for="id">아이디</label>
			<input type="text" name="id" id="id" value="<%=id%>">
		</li>
		<li>
			<label for="id">비밀번호</label>
			<input type="password" name="passwd" id="passwd">
		</li>
	</ul>
	<div id="login_btn">로그인</div>
	<div id="search">
		<a href="<%=request.getContextPath() %>/index.jsp?group=member&worker=search_id">아이디 찾기</a> |
		<a href="#">비밀번호 찾기</a> 
	</div>
	<div id="message"><%=message %></div>
</form>
<script type="text/javascript">
$("#id").focus();

$("#login_btn").click(function() {
	if($("#id").val()=="") {
		$("#message").text("아이디를 입력해 주세요.");
		$("#id").focus();
		return;
	}
	
	if($("#passwd").val()=="") {
		$("#message").text("비밀번호를 입력해 주세요.");
		$("#passwd").focus();
		return;
	}
	
	$("#loginForm").submit();
});

</script>


member_modify_action.jsp

<%@page import="xyz.itwill.dao.MemberDAO"%>
<%@page import="xyz.itwill.util.Utility"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 회원정보를 전달받아 MEMBER 테이블에 저장된 회원정보를 변경하고 [member/member_mypage.jsp]
문서를 요청하기 위한 URL 주소를 전달하여 응답하는 JSP 문서 --%>    
<%-- => 로그인 상태의 사용자만 요청 가능한 JSP 문서 --%>
<%@include file="/security/login_check.jspf" %>
<%
	if(request.getMethod().equals("GET")) {
		response.sendRedirect(request.getContextPath()+"/index.jsp?group=error&worker=error_400");
		return;
	}

	//POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋 변경
	request.setCharacterEncoding("utf-8");
	
	//전달값을 반환받아 저장
	String id=request.getParameter("id");
	String passwd=request.getParameter("passwd");
	if(passwd==null || passwd.equals("")) {//비밀번호 전달값이 없는 경우
		//현재 로그인 사용자의 비밀번호를 변수에 저장 - 기존 비밀번호 유지
		passwd=loginMember.getPasswd();
	} else {//비밀번호 전달값이 있는 경우
		//전달값을 암호화 처리하여 변수에 저장 - 새로운 비밀번호 변경
		passwd=Utility.encrypt(passwd);
	}
	String name=request.getParameter("name");
	String email=request.getParameter("email");
	String mobile=request.getParameter("mobile1")+"-"
		+request.getParameter("mobile2")+"-"+request.getParameter("mobile3");
	String zipcode=request.getParameter("zipcode");
	String address1=request.getParameter("address1");
	String address2=request.getParameter("address2");
	
	//DTO 객체를 생성하여 전달값으로 필드값 변경
	MemberDTO member=new MemberDTO();
	member.setId(id);
	member.setPasswd(passwd);
	member.setName(name);
	member.setEmail(email);
	member.setMobile(mobile);
	member.setZipcode(zipcode);
	member.setAddress1(address1);
	member.setAddress2(address2);	
	
	//회원정보를 전달받아 MEMBER 테이블에 저장된 회원정보를 변경하는 DAO 클래스의 메소드 호출
	MemberDAO.getDAO().updateMember(member);

	//바인딩 세션에 저장된 권한 관련 정보의 속성값 변경
	session.setAttribute("loginMember", MemberDAO.getDAO().selectMember(id));
	
	//페이지 이동
	response.sendRedirect(request.getContextPath()+"/index.jsp?group=member&worker=member_mypage");
%>


member_remove.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>회원탈퇴 성공</h1>


member_remove_action.jsp

<%@page import="xyz.itwill.dao.MemberDAO"%>
<%@page import="xyz.itwill.util.Utility"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 비밀번호를 전달받아 MEMBER 테이블에 저장된 회원정보의 비밀번호와 비교하여 같은 경우
MEMBER 테이블에 저장된 회원정보의 회원상태를 [0]으로 변경하여 탈퇴 처리하고 [main/main_page.jsp] 문서를
요청하기 위한 URL 주소를 전달하여 응답하는 JSP 문서 --%>   
<%-- => 로그인 상태의 사용자만 요청 가능한 JSP 문서 --%>
<%@include file="/security/login_check.jspf" %>
<%
	if(request.getMethod().equals("GET")) {
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()+"/index.jsp?group=error&worker=error_400'");
		out.println("</script>");
		return;
	}
	
	//전달값을 반환받아 저장 - 암호화 처리
	String passwd=Utility.encrypt(request.getParameter("passwd"));
	
	//로그인 상태의 사용자 비밀번호와 전달받은 비밀번호를 비교하여 같지 않은 경우
	if(!loginMember.getPasswd().equals(passwd)) {
		session.setAttribute("message", "입력하신 비밀번호가 맞지 않습니다.");
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()+"/index.jsp?group=member&worker=password_confirm&action=remove'");
		out.println("</script>");
		return;
	}
	
	//아이디와 회원상태를 전달받아 MEMBER 테이블에 저장된 회원정보의 회원상태를 변경하는 DAO 클래스의 메소드 호출
	MemberDAO.getDAO().updateMemberStatus(loginMember.getId(), 0);

	//세션 무효화 처리
	session.invalidate();
	
	//페이지 이동	
	response.sendRedirect(request.getContextPath()+"/index.jsp?group=member&worker=member_remove");
%>


password_confirm.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 회원정보변경 또는 회원탈퇴를 위한 비밀번호를 입력받기 위한 JSP 문서 --%>
<%-- => 로그인 상태의 사용자만 요청 가능한 JSP 문서 --%>
<%@include file="/security/login_check.jspf" %>
<%
	//전달값(페이지 이동 관련 정보)을 반환받아 저장
	// => 비밀번호를 입력받은 후 페이지 이동 관련 정보 반환 
	String action=request.getParameter("action");
	
	//전달값이 없거나 잘못된 경우 - 비정상적인 요청
	if(action==null || !action.equals("modify") && !action.equals("remove")) {
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()+"/index.jsp?group=error&worker=error_400'");
		out.println("</script>");
		return;
	}
	
	String message=(String)session.getAttribute("message");
	if(message==null) {
		message="";
	} else {
		session.removeAttribute("message");
	}
%> 
<% if(action.equals("modify")) { %>
	<p>회원정보변경을 위해 회원의 비밀번호를 입력 주세요.</p>
<% } else { %>
	<p>회원탈퇴를 위해 회원의 비밀번호를 입력 주세요.</p>
<% } %>
<form method="post" name="passwordForm">
	<input type="password" name="passwd">
	<button type="button" onclick="submitCheck();">입력완료</button>
</form>
<p id="message" style="color: red;"><%=message %></p>

<script type="text/javascript">
passwordForm.passwd.focus();

function submitCheck() {
	if(passwordForm.passwd.value=="") {
		document.getElementById("message").innerHTML="비밀번호를 반드시 입력해 주세요.";
		passwordForm.passwd.focus();
		return;
	}
	
	<%-- 전달값에 의해 form 태그로 요청하는 JSP 문서를 구분하여 실행 --%>
	<% if(action.equals("modify")) {//[회원정보변경]인 경우 %>
		passwordForm.action="<%=request.getContextPath()%>/index.jsp?group=member&worker=member_modify";
	<% } else {//[회원탈퇴]인 경우 %>
		passwordForm.action="<%=request.getContextPath()%>/member/member_remove_action.jsp";
	<% } %>
	
	passwordForm.submit();
}
</script>


search_id.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 아이디를 검색하기 위한 정보(이름,이메일)를 입력받기 위한 JSP 문서 --%>
<%-- => [아이디 검색] 태그를 클릭한 경우 [member/search_id_display.jsp] 문서 요청 - 입력값 전달 --%>    
<style type="text/css">
.search_tag {
	margin: 5px auto;
	width: 300px;
}    

#searchForm label {
	text-align: right;
	width: 100px;
	float: left;
}

#searchForm ul li {
	list-style-type: none;
	margin-bottom: 10px;
}

#searchForm input:focus {
	border: 2px solid aqua;
}

#search_btn {
	margin: 0 auto;
	padding: 5px;
	width: 200px;
	background-color: black;
	color: white;
	font-size: 1.2em;
	cursor: pointer;
	font-weight: bold; 	 
}

#message {
	color: red;	
	font-weight: bold;
}
</style>
<h1>아이디 찾기</h1>
<form id="searchForm" name="loginForm" action="<%=request.getContextPath() %>/index.jsp?group=member&worker=search_id_display" method="post">
	<ul class="search_tag">
		<li>
			<label for="name">이름</label>
			<input type="text" name="name" id="name">
		</li>
		<li>
			<label for="email">이메일</label>
			<input type="text" name="email" id="email">
		</li>
	</ul>
	<div id="search_btn">아이디 검색</div>
	<div id="message"></div>
</form>
<script type="text/javascript">
$("#name").focus();

$("#search_btn").click(function() {
	if($("#name").val()=="") {
		$("#message").text("이름을 입력해 주세요.");
		$("#name").focus();
		return;
	}
	
	if($("#email").val()=="") {
		$("#message").text("이메일을 입력해 주세요.");
		$("#email").focus();
		return;
	}
	
	$("#searchForm").submit();
});

</script>


search_id_display.jsp

<%@page import="xyz.itwill.dao.MemberDAO"%>
<%@page import="xyz.itwill.dto.MemberDTO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- 아이디 검색 관련 정보를 전달받아 MEMBER 테이블에 저장된 회원정보의 아이디를 검색하여
클라이언트에게 전달하여 응답하는 JSP 문서 --%>
<%
	if(request.getMethod().equals("GET")) {
		out.println("<script type='text/javascript'>");
		out.println("location.href='"+request.getContextPath()+"/index.jsp?group=error&worker=error_400'");
		out.println("</script>");
		return;
	}

	//POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋 변경
	// => 템플릿 페이지 몸체부에 포함되는 JSP 문서에서는 request 객체의 정보 변경 불가능
	// => 템플릿 페이지(index.jsp)에서 request 객체의 정보 변경
	//request.setCharacterEncoding("utf-8");

	//전달값을 반환받아 저장
	String name=request.getParameter("name");
	String email=request.getParameter("email");
	
	//DTO 객체를 생성하여 전달값으로 필드값 변경
	MemberDTO member=new MemberDTO();
	member.setName(name);
	member.setEmail(email);
	
	//회원정보(아이디와 이름)를 전달받아 MEMBER 테이블에 저장된 회원정보의 아이디를 검색하여 
	//문자열(String 객체)로 반환하는 DAO 클래스의 메소드 호출
	String id=MemberDAO.getDAO().selectMemberId(member);
%>
<h1>아이디 검색 결과</h1>
<% if(id!=null) {//검색 결과가 있는 경우 %>
	<p style="font-size: 1.5em;"><%=name %>님의 아이디는 [<%=id %>]입니다.</p>
<% } else { %>
	<p style="font-size: 1.5em;"><%=name %>님의 아이디를 찾을 수 없습니다.</p>
<% } %>