User Login

Let's Just Go·2022년 8월 5일
0

Spring

목록 보기
20/26

Spring

User Login

HTML

  • 화면

    • 로그인 처리 화면

    • 회원가입된 Database에 저장된 회원인지 여부 확인

    • interceptor를 통해서 통과된 사용자 session 등록

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      
      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
      <!-- el 태그르 사용하기 위해서 사용 -->
      
      <%@ include file="../include/header.jsp"%>
          <section>
              <div class="container">
                  <div class="row">
                      <div class="col-lg-6 col-md-7 col-xs-10 login-form">
                          <div class="titlebox">
                              로그인
                          </div>
                          <form id = "formObj" action="<c:url value='/user/userLogin' />" method="post">
                              <div class="form-group"><!--사용자클래스선언-->
                                  <label for="id">아이디</label>
                                  <input type="text" class="form-control" id="id" name="id" placeholder="아이디">
                               </div>
                               <div class="form-group"><!--사용자클래스선언-->
                                  <label for="pw">비밀번호</label>
                                  <input type="password" class="form-control" id="pw" name ="pw" placeholder="비밀번호">
                               </div>
                               <div class="form-group">
                                  <button type="button" id = "loginBtn" class="btn btn-info btn-block">로그인</button>
                                  <button type="button" id = "registBtn" class="btn btn-primary btn-block">회원가입</button>
                               </div>
                               
                          </form>                
                      </div>
                  </div>
              </div>
          </section>
          
      <%@ include file="../include/header.jsp"%>
      
      <script>
      	const msg = '$(msg)';
      	if (msg === 'joinSuccess'){
      		// 회원가입한 후 login으로 화면이동 할 때 msg의 값도 같이 보내기 때문에 
      		// alert창도 이렇게 작성 
      		alert('회원 가입 정상 처리 되었습니다.');
      	} else if(msg ==="loginFail"){
      		alert('로그인 실패입니다.');
      		
      	}
      	$(function(){
      		$('#loginBtn').click(function() {
      			if ($('#id').val() === '' || $('#pw').val() === ''){
      				alert('아이디 혹은 비밀번호는 필수 값입니다.');
      				return;
      			}
      			$('#formObj').submit();
      			
      		}); // 로그인 전송 끄읏~
      		
      		$('#registBtn').click(function() {
      			location.href='<c:url value="/user/userJoin" />';
      		});
      	
      	}); // end jquery
      	
      	
      </script>

Controller

  • Controller
    • Login 처리를 수행하기 위해 클라이언트에서 입력한 데이터를 controller가 받아서 service와 mapper를 통해 db에 전달해서 Login 검증 처리

    • Interceptor 활용하여 session 정보 저장하는 로직 수행

      // 로그인 페이지 이동 
      	@GetMapping("/userLogin")
      	public String moveLogin() {
      		System.out.println("/user/userLogin : GET");
      		
      		return "/user/userLogin";
      	}
      	
      	// 로그인 검증 
      	@PostMapping("/userLogin")
      	public String Login(@RequestParam("id") String id, @RequestParam("pw") String pw, Model model) {
      		System.out.println("/user/userLogin : POST");
      		
      		UserVO loginUser = service.login(id, pw);
      
      		/* user 정보를 model에 담아서 리턴은 /user/userLogin으로 셋팅 
      		 util 패키지 안에 인터셉터(UserLoginSuccessHandler)를 생성해서 
      		 UserLoginSuccessHandler는 로그인 처리 이후 실행되는 핸들러를 오버라이딩 해서 
      		  모델의 객체의 값이 null인지 아닌지 확인하고 null이라면 msg라는 이름으로 loginFail이라는 문자를 담아서 
      		 userLogin.jsp 파일로 응답하도록 viewName을 세팅하고 null이 아니라면 세션 만들어서 홈 화면으로 이동
      		 */
      		model.addAttribute("loginUser", loginUser);
      		
      		
      		return "/user/userLogin";
      	}

Interceptor

  • Interceptor
    • controller 요청 전 후에 값을 가지고 와서 검증

      • session을 만들어 주거나 이상한 값이 controller에 들어오지 못하게 하거나, 디스패처로 못가게 하는 역할을 할 듯?
    • interceptor를 bean으로 등록하기 위해서는 root-context.xml에 작성했는데 이제는 파일로 생성해서 따로 관리

    • Spring bean configuration file로 생성해서 namespace에 mvc 체크

    • interceptor-config.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
      	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      	xmlns:mvc="http://www.springframework.org/schema/mvc"
      	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
      		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
      	
      	<!-- namespaces 탭에서 mvc 기능 추가 -->
      	<!-- web.xml에 초기 설정 파일로 이 파일을 추가  -->
      	
      	<bean id="userLoginSuccessHandler" class="com.spring.myweb.util.interceptor.UserLoginSuccessHandler" />
      	
      	<mvc:interceptors>
      		<!-- root-context.xml에 등록하는 거랑 똑같음  -->
      		<!-- 로그인 이후에 실행되는 postHandler -->
      		
      		<mvc:interceptor>
      			<mvc:mapping path="/user/login"/>
      			<ref bean="userLoginSuccessHandler" />
      			<!-- 참조하는 bean 지정  -->
      		</mvc:interceptor>	
      			
      	</mvc:interceptors>
      
      </beans>
    • web.xml에 생성한 파일도 추가

    • web.xml

      <!-- Processes application requests -->
      	<servlet>
      	<!-- 디스패처 서플릿이 실행될 때 같이 실행되는 파일들  -->
      		<servlet-name>appServlet</servlet-name>
      		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      		<init-param>
      			<param-name>contextConfigLocation</param-name>
      			<param-value>
      				/WEB-INF/spring/appServlet/servlet-context.xml
      				/WEB-INF/spring/email-config.xml
      				/WEB-INF/spring/interceptor-config.xml			
      			</param-value>
      		</init-param>
      		<load-on-startup>1</load-on-startup>
      	</servlet>
      
      	<servlet-mapping>
      		<servlet-name>appServlet</servlet-name>
      		<url-pattern>/</url-pattern>
      	</servlet-mapping>

  • interceptor 클래스
    • 로그인을 성공했다면 정보를 유지하기 위해 session에 해당 정보를 저장하는 로직 수행

      package com.spring.myweb.util.interceptor;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      
      import org.springframework.ui.ModelMap;
      import org.springframework.web.servlet.HandlerInterceptor;
      import org.springframework.web.servlet.ModelAndView;
      
      import com.spring.myweb.command.UserVO;
      
      // controller의 login 요청 전과 후의 데이터를 가로채서 정제 
      // interceptor class를 만들려면 HandlerInterceptor 인터페이스 구현 
      public class UserLoginSuccessHandler implements HandlerInterceptor{
      
      	
      	@Override
      	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      			throws Exception {
      		
      		System.out.println("로그인 요청이 들어가기 전 인터셉터 발동");
      		// System.out.println("파라미터 값 가져오는지 확인 " +  request.getParameter("id"));
      		// 될려나
      	  // 되넴
      		return true;		
      	}
      	
      	// controller에서 데이터 처리 후 디스패처에 보내기 전 가져와서 확인 
      	@Override
      	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
      			ModelAndView modelAndView) throws Exception {
      		
      		HttpSession session = request.getSession();
      
      		System.out.println("로그인 요청 후 디스패처에게 가기 전 인터셉터 발동");
      //		Object user = modelAndView.getModel().get("loginUser");
      		ModelMap mv = modelAndView.getModelMap();
      		// model 객체에 있는 것을 ModelMap 타입으로 반환해줌
      		
      		UserVO user = (UserVO) mv.get("loginUser");
      		// ModelMap객체에서 값을 가져올 수 있음
      		
      		System.out.println("인터셉터에서 불러온 유저 데이터 : " + user);
      		if (user == null) {
      			modelAndView.addObject("msg", "loginFail");
      			modelAndView.setViewName("/user/userLogin");
      		} else {
      			System.out.println("로그인 성공 로직");
      			// 로그인을 성공했으면 session을 생성해서 로그인 유지할 수 있는 수단으로 사용 
      			session.setAttribute("login", user);
      			// 세션 저장 
      			response.sendRedirect("/myweb/");
      		}
      
      	}
      }
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글