Spring Login Session

kangjuju·2023년 3월 21일
0

Spring

목록 보기
12/13

AOP를 사용하지 않은 방법.

로그인

Controller

  • 파라미터 HttpSession을 사용하여 세션유무를 확인함
	@GetMapping("login")
	public String login(HttpSession session) {
		//세션에 id키가 없을경우 로그인화면.
		if(session.getAttribute("id") == null) {
			return "redirect:/login.html";
		}else {
			return "redirect:/buserlist";
		}
	}
<form action="login" method="post">
아이디 : <input type="text" name="id"><br/>
비밀번호 : <input type="text" name="pwd"><br/>
<input type="submit">
	@PostMapping("login")
	public String login(HttpSession session,
			@RequestParam("id")String id,
			@RequestParam("pwd")String pwd) {
		
		if(id.equals("kor") && pwd.equals("111")) {
			//로그인 성공시 세션설정 후 자료목록 이동
			session.setAttribute("idKey", id); 
			return "redirect:/buserlist";
		}else {
			return "redirect:/err.html";
		}
	}
${sessionScope.idkey }님 반갑습니다.<br>
<a href="logout">로그아웃</a>
<hr>

로그아웃

	@RequestMapping(value="logout", method=RequestMethod.GET)
	public String logout(HttpSession session) {
//		session.invalidate(); 전부삭제
		session.removeAttribute("idkey");
 		return "redirect:/index.html";
	}

AOP사용

  • 직원자료 출력에 관한 코드는 생략한다.

  • 해당 DB를 출력하는 코드에 로그인 관심사항을 추가해보자.
    포인트 컷의 대상은 컨트롤러이다.

로그인 페이지

<form action="login" method="post">
직원 번호 : <input type="text" name="no"><br>
직원 이름 : <input type="text" name="name"><br>
<input type="submit" value="로그인">
</form>

LoginController

  • dao.jikwonLogin :
    직원번호를 파라미터로 받아 직원번호,직원이름을 dto형으로 반환한다.
  • 로그인 form을 체크하는 매핑메소드
@Controller
public class LoginController {
	
	@Autowired
	private DataDao dao;
	
	//로그인 화면 이동
	@GetMapping("login")
	public String getLogin() {
		return "login";
	}
	//로그인 체크
	@PostMapping("login")
	public String postLogin(HttpSession session,
			@RequestParam("no")String no,
			@RequestParam("name")String name) {
		JikwonDto dto = dao.jikwonLogin(no);
		if(dto != null) {
			//사용자가 입력한 이름과 DB내 이름이 같은경우.
			String retName = dto.getJikwon_name();
			if(retName.equals(name)) { 
				session.setAttribute("name", retName);
			}
		} 
		return "redirect:/jikwonlist"; //로그인 성공시 핵심로직 메소드 처리 Controller
	}
	@GetMapping("logout")
	public String logout(HttpSession session) {
		session.removeAttribute("name");
		return "redirect:/index.html";
	}
}
  • DB내 이름과 사용자가 입력한 이름을 비교하여 세션을 생성할지 말지 결정한다.

aspect package

  • MyAdvice (Advice) : Aspect들을 관리한다. execution으로 포인트컷을 지정.
  • LoginClass (Aspect) : 등록된 세션을 확인하고 없으면 로그인페이지로 보낸다.
//Advice
@Component
@Aspect
public class MyAdvice {
	
	@Autowired
	private LoginClass loginClass;
	
	//패키지 무관. jikwonProcess의 이름을 가진 포인트
	@Around("execution(* jikwonProcess*(..))")
	public Object aopProcess(ProceedingJoinPoint joinPoint) throws Throwable{
		HttpServletRequest request = null;
		HttpServletResponse response = null;
		
		//joinPoint(jikwonProcess)의 argument를 찾는다. 
		//HttpServlet.. 가 있다면 request에 해당 obj를 삽입
		for(Object obj: joinPoint.getArgs()) {
			if(obj instanceof HttpServletRequest) {
				request = (HttpServletRequest)obj;
			}
			if(obj instanceof HttpServletResponse) {
				response = (HttpServletResponse)obj;
			}
		}
        //session이 없어 null값 반환시 aop수행을 취소
		if(loginClass.loginCheck(request, response)) {
			return null;
		}
		Object object = joinPoint.proceed();
		return object;
	}
}
//Aspect
@Component
public class LoginClass {
	public boolean loginCheck(HttpServletRequest request,HttpServletResponse response) 
    throws Exception {
		//등록 세션을 얻는다.
		HttpSession session = request.getSession();
		
		//세션에 name키가 없으면 login페이지로.
		if(session.getAttribute("name") == null) {
			response.sendRedirect("login"); //GET
			return true;
		}else return false;
	}
}

JikwonController

  • 직원자료를 출력한다.
  • execution으로 해당 메소드를 포인트컷 대상으로 지정했다.
@Controller
public class JikwonController {

	@Autowired
	private DataDao dataDao;
	
	@GetMapping("jikwonlist")
	public String jikwonProcess(Model model) { //pointcut 대상
		ArrayList<JikwonDto> list = dataDao.jikwonList();
		model.addAttribute("list",list);
		return "list";
	}
}

직원자료 출력중 조건부 로그아웃버튼

<body>
<h3>직원자료</h3>
<%
<!--세션이 있을때만(로그인중) 로그아웃 버튼 활성화-->
if(session.getAttribute("name") != null){
	out.println("<a href='logout'>로그아웃</a>")
}
%>
<table border="1">
	<tr>
    ..
    .
  • 참고로 AOP가 필요없을땐 Advice의 두 Annotation만 지우면 된다.

0개의 댓글