Spring 쇼핑몰 만들기 -5 로그인

레오나·2021년 10월 18일
0

로그인 구현

세션과 쿠키를 이용한 로그인을 구현할 것입니다.

login.jsp를 만들어 기존에 만들었던 join.jsp에서 일부만 가져오고 Controller에서 GetMapping을 작성합니다.

	@GetMapping("/member/login")
	public String login(@ModelAttribute("loginMemberBean") MemberDto loginMemberBean) {
		return "member/login";
	}

파라미터는 세션 로그인을 할 것이기 때문에 HttpSession을 넣어주고, modelAttribute는 회원가입을 할 때 사용했던 동일한 MemberDto이기 때문에 유효성 검증을 추가할 것 없이 이름만 loginMemberBean으로 변경합니다 그리고 유효성 검증을 위한 @Valid와 BindingResult를 추가합니다.

	@PostMapping("/member/login")
	public String login_pro(HttpSession session, @Valid 
    				@ModelAttribute("loginMemberBean") MemberDto loginMemberBean, 
    				BindingResult result) {
		
		if(result.hasErrors()) {
			return "member/login";
		}
		
		memberService.loginMember(session, loginMemberBean);
		
		if(session.getAttribute(MemberDto.MEMBER_LOGIN) != null) {
			return "member/login_success";
		}else {
			return "member/login";
		}
		
	}

Service에서는 입력한 회원의 아이디와 비밀번호를 DB에서 조회하고 해당 컬럼이 있다면 세션에 저장합니다.

	public void loginMember(HttpSession session, MemberDto loginMemberBean) {
		MemberDto findMember = memberDao.findMember(loginMemberBean);
		
		
		if(findMember != null) {
			session.setAttribute(MemberDto.MEMBER_LOGIN, findMember);
		}
	}

그리고 다시 Controller에서 유저의 세션을 찾아보고 loginDto라는 이름의 세션이 없다면 login화면으로 다시 돌아가고 있다면 login_success화면으로 이동하게 합니다.

login_success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var='root' value="${pageContext.request.contextPath}" />

<script>
	alert("로그인 되었습니다")
	location.href= "${root}/";
</script>

Interceptor를 이용하여 화면 처리하기

화면에서 로그인에 성공하면 로그아웃만 나타나고, 로그인을 하지 않은 상태라면 로그인 표시만 나타나게 하고 싶기 때문에 Interceptor를 이용합니다.

로그인을 하지 않았을 때

로그인을 했을 때

Interceptor를 상속받은 클래스를 하나 만들어줍니다.

public class CheckLoginInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		MemberDto memberVO = (MemberDto)request.getSession().
        						getAttribute(MemberDto.MEMBER_LOGIN);
		 
		request.setAttribute("loginMember", memberVO);
		return true;
	}

}

preHandle은 지정된 컨트롤러의 동작 이전에 수행할 동작을 먼저 수행합니다.

여기서는 특정 컨트롤러가 동작하기 전에 세션에서 회원 정보를 가져오고 회원 정보를 화면에 전달합니다.

그래서 jsp로 넘어온 객체가 null이라면 회원가입 혹은 로그인을 하도록 화면에 나타나게 하고 null이 아니라면 주문목록과 로그아웃이 화면에 나타나도록 합니다.

이제 경로를 지정해주어야 합니다. servlet-context.xml에 bean으로 인터셉터를 등록해주면 됩니다.

<beans:bean id="checkLoginInterceptor" class="sloth.shop.interceptor.CheckLoginInterceptor" />
	<interceptors>
		<interceptor>
			<mapping path="/**" />
			<beans:ref bean="checkLoginInterceptor" />
		</interceptor>
     	 </interceptors>

이렇게 하면 정상적으로 Interceptor가 작동되는 것을 확인 할 수 있습니다.

profile
공부한 것을 기록

0개의 댓글