본문 바로가기
study/Spring

[Spring] 24. Spring (로그인[login.jsp, main.jsp, UserLoginAspect.java, LoginException.java, exception.jsp, message.properties])

by 금이패런츠 2022. 5. 9.
728x90
반응형

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%-- /WEB-INF/view/user/login.jsp --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<!DOCTYPE html><html><head><meta charset="UTF-8">
<title>로그인화면</title>
<script type="text/javascript">
function win_open(page) {
	   var op = "width=500, height=350, left=50,top=150";
	   open(page,"",op);
}
</script>
</head><body>
<h2>사용자 로그인</h2>
<form:form modelAttribute="user" method="post" action="login" name="loginform">
<input type="hidden" name="username" value="유효성검증을위한 파라미터" >
<input type="hidden" name="email" value="valid@aaa.bbb" >
  <spring:hasBindErrors name="user">
    <font color="red"><c:forEach items="${errors.globalErrors}" var="error">
         <spring:message code="${error.code}" />
      </c:forEach></font></spring:hasBindErrors>
  <table border="1" style="border-collapse: collapse;">
   <tr height="40px"><td>아이디</td><td><form:input path="userid" />
     <font color="red"><form:errors path="userid" /></font></td></tr>
<tr height="40px"><td>비밀번호</td><td><form:password path="password" />
<font color="red"><form:errors path="password" /></font></td></tr>
<tr height="40px"><td colspan="2" align="center">
<input type="submit" value="로그인">
<input type="button" value="회원가입"  onclick="location.href='userEntry'">
<input type="button" value="아이디찾기" onclick="win_open('idsearch')">
<input type="button" value="비밀번호찾기" onclick="win_open('pwsearch')">
   </td></tr></table>
</form:form></body></html>

main.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 페이지</title>
</head>
<body>
<h2>환영합니다. ${sessionScope.loginUser.username}님</h2>
<a href="mypage?id=${loginUser.userid}">mypage</a><br>
<a href="logout">로그아웃</a>
</body>
</html>

UserLoginAspect.java 

package aop;

import javax.servlet.http.HttpSession;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import exception.LoginException;
import logic.User;

@Component //객체화. 
@Aspect	   //AOP 기능 객체.
public class UserLoginAspect {
	/*
	 * Pointcut : 핵심메서드를 선택 방식 결정 =>
	 * 		execution(* controller.User*.loginCheck*(..)) && args(..,session): 
	 * 			* controller.User* : controller패키지의 클래스 중 이름이 User로 시작하는 모든 클래스
	 * 			loginCheck*(..)	   : 메서드 중 이름이 loginCheck로 시작하는 모든 메서드
	 * 			args(..,session)   : 메서드의 매개변수의 자료형이 session인 메서드
	 * 
	 * .. : 갯수에 상관없음
	 * 
	 * Advice : aop메서드의 실행 시점 설정
	 * 		@Around : Pointcut 메서드의 호출 전 userLoginCheck 메서드 먼저 호출
	 * 				  핵심 메서드 실행 전, 후에 aop 메서드의 실행
	 * 		@Before : 핵심 메서드 실행 전 aop 메서드의 실행
	 * 		@AfterRetuning : 핵심 메서드 정상 종료 후 aop 메서드의 실행
	 * 			
	 */			
	@Around("execution(* controller.User*.loginCheck*(..)) && args(..,session)")
	public Object userLoginCheck(ProceedingJoinPoint joinPoint, HttpSession session) throws Throwable {
		//joinpoPoint : 실행되는 메서드들의 순서 관리하는 객체
		//session : 핵심 메서드의 매개변수 중 session 객체
		User loginUser = (User)session.getAttribute("loginUser");
		if(loginUser ==  null) { //로그인이 안된 상태
			throw new LoginException("[userlogin]로그인 후 거래하세요", "login");
		}
		return joinPoint.proceed(); //다음 메서드 호출
	}
	@Around("execution(* controller.User*.idCheck*(..)) && args(..,id,session)")
	public Object useridCheck(ProceedingJoinPoint joinPoint, String id, HttpSession session) throws Throwable {
		User loginUser = (User)session.getAttribute("loginUser");
		if(loginUser ==  null) { //로그인이 안된 상태
			throw new LoginException("[idChenk]로그인 후 거래하세요", "login");
		} else if (!loginUser.getUserid().equals(id) && !loginUser.getUserid().equals("admin")) {
			throw new LoginException("[idChenk]본인 정보만 거래 가능합니다.", "main");
		}
		return joinPoint.proceed(); //다음 메서드 호출
	}
}

LoginException.java

package exception;

public class LoginException extends RuntimeException {
	private String url;
	public LoginException(String msg, String url) {
		super(msg);
		this.url = url;
	}
	public String getUrl() {
		return url;
	}
}

exception.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true" %>
<%-- /springmvc1/src/main/webapp/WEB-INF/view/exception.jsp --%>
<%--
	isErrorPage="true" : 현재 페이지가 예외 페이지.
		=> exception(LoginException 객체) 내장 객체 전달.
 --%>
<script>
	alert("${exception.message}")
	location.href="${exception.url}"
</script>

message.properties

## src/main/resources/messages.txt => src/main/resources/messages.properties \uBCC0\uACBD
error.login.password=\uBE44\uBC00\uBC88\uD638\uB97C \uD655\uC778\uD558\uC138\uC694.
error.input.user=\uD68C\uC6D0\uAC00\uC785 \uC785\uB825\uD56D\uBAA9\uC744 \uD655\uC778\uD558\uC138\uC694
error.input.login=\uB85C\uADF8\uC778 \uC785\uB825\uD56D\uBAA9\uC744 \uD655\uC778\uD558\uC138\uC694
typeMismatch.birthday=\uC0DD\uB144\uC6D4\uC77C\uC740 YYYY-MM-DD \uD615\uC2DD\uC73C\uB85C \uC785\uB825\uD574 \uC8FC\uC138\uC694
error.duplicate.user=\uC911\uBCF5\uB41C \uC544\uC774\uB514 \uC785\uB2C8\uB2E4.
error.login.password=\uBE44\uBC00\uBC88\uD638 \uC624\uB958 \uC785\uB2C8\uB2E4.
error.login.id=\uC544\uC774\uB514\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4.

error.userid.search=\uC544\uC774\uB514\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
error.password.search=\uBE44\uBC00\uBC88\uD638\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4.
error.required.userid=\uC544\uC774\uB514\uB97C \uC785\uB825\uD558\uC138\uC694
error.required.email=EMAIL\uC744 \uC785\uB825\uD558\uC138\uC694
error.required.phoneno=\uC804\uD654\uBC88\uD638\uB97C \uC785\uB825\uD558\uC138\uC694

messages.txt
0.00MB

 

728x90
반응형