[Spring Boot 게시판] 12일차

김정현·2022년 10월 12일
0

SPRINGBOOT게시판

목록 보기
11/36

1. NeedLoginInterceptor 구현 및 MyWebMvcConfigurer의 registry 등록

1) NeedLoginInterceptor 구현

  	 @Component
	public class NeedLoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
            System.out.println("실행됨?222");

            return HandlerInterceptor.super.preHandle(req, resp, handler);
        }

2) MyWebMvcConfigurer의 registry 등록

	public void addInterceptors(InterceptorRegistry registry) {
			~~ 생략 ~~
		registry.addInterceptor(needLoginInterceptor).addPathPatterns("/usr/article/write")
				.addPathPatterns("/usr/article/doAdd").addPathPatterns("/usr/article/modify")
				.addPathPatterns("/usr/article/doModify").addPathPatterns("/usr/article/doDelete");
	}
  • addPathPatterns의 uri에 해당하는 요청이 올때 NeedLoginInterceptor 인터셉터 실행

2. NeedLoginInterceptor가 각 액션이 실행되기 전 로그인 체크를 앞단에서 실행

1) Rq클래스의 메소드(printHistoryBackJs,print)

  	public void printHistoryBackJs(String msg) {
		resp.setContentType("text/html; charset=UTF-8");
        print("<script>");
		if (msg.length() != 0) {
			print("alert('" + msg + "');");
		}
		print("history.back();");
		print("</script>");
	}

	public void print(String msg) {
		try {
			resp.getWriter().append(msg);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    public void println(String str) {
		print(str + "\n");
	}    
  • resp.getWriter().append()으로 요청에 대한 응답을 해줄수있지만 history.back()를 메소드를 통해 여러곳에서 활용하기 위함
  • print() 메소드는 내부적으로 resp.getWriter().append();를 이용해 요청에 대한 응답을 추가

2) 각 액션이 실행되기 전 로그인 체크를 앞단에서 실행

	if (rq.isLogined() == false) {
			return Ut.jsHistoryBack("로그인 후 이용해주세요");
		}
  • 위의 코드는 컨트롤러에서 로그인 관련 체크를 하는 코드로 컨트롤러 실행 전 수행하기 위해 NeedLoginInterceptor 구현
    public class NeedLoginInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
            Rq rq = (Rq)req.getAttribute("rq");		
            if(!rq.isLogined()) {
                rq.printHistoryBackJs("로그인 후 이용 가능합니다.");
                return false;
            }
            return HandlerInterceptor.super.preHandle(req, resp, handler);
        }
  • 컨트롤러가 실행되기 이전에 NeedLoginInterceptor를 통해 로그인 체크
  • Rq rq = (Rq)req.getAttribute("rq"); 는 NeedLoginInterceptor 실행되기 이전에
  • BeforeActionInterceptor 에서 req.setAttribute("rq", rq)했기 때문에 새로 new하지않아도 됨
  • preHandle메소드는 컨트롤러 실행 전 수행한다. 반환 값이 true일 경우 컨트롤러로 진입하고 false일 경우 진입하지 않는다.
  • 만약 로그인이 되있지 않다면, printHistoryBackJs() 메소드를 통해 요청에대한 응답을 한다.

3. 로그인 폼 구현 및 로그인 처리

1) 로그인 페이지 이동

@RequestMapping("/usr/member/login")
	public String showLogin() {
		return "usr/member/login";
	}
  • /usr/member/login 로그인 요청이 오면 로그인 페이지(jsp)로 이동

2) login.jsp

	<form class="table-box-type-1" method="post" action="doLogin">				
				<table class="min mx-auto">
                    <colgroup>
                    <col width ="80" />
                    <col width ="100"/>				
                    </colgroup>					
                   <tbody>						
                    <tr>
                      <td>아이디 </td>
                      <td><input type="text" name="loginId" autocomplete="off" placeholder="아이디를 입력해주세요." /></td>
                    </tr>
                    <tr>
                      <td>비밀번호 </td>
                      <td><input type="password" name="loginPw" autocomplete="off" placeholder="비밀번호를 입력해주세요." /></td>
                    </tr>						
                   </tbody>
				</table>
			
			<div class= "btns btns-box-type-1">
				<button type="submit" >로그인</button>
				<button type="button" onclick="history.back()">뒤로가기</button>
			</div>	
			</form>			
		</div>
  • form태그안에 테이블로 로그인 페이지 구현
  • action="doLogin"으로 데이터 전송

3) 로그인 처리

        @RequestMapping("/usr/member/doLogin")
        @ResponseBody
        public String doLogin(HttpSession httpSession, String loginId, String loginPw) {
				
            ~~ 생략 ~~

        if (Ut.empty(loginId)) {
            return Ut.jsHistoryBack("아이디를 입력 해주세요.");
        }

        if (Ut.empty(loginPw)) {
            return Ut.jsHistoryBack("비밀번호를 입력 해주세요.");
        }
        return Ut.jsReplace(Ut.f("%s님 환영합니다.", member.getName()), "/");
  • 이전에는 로그인 후 결과를 ResultData로 반환하여 브라우저에서 보여짐
  • 로그인 결과는 페이지로 구현하지 않아도 되기 때문에
  • Ut.jsHistoryBack(), Ut.jsReplace() 메소드로 로그인 시도후 결과에 따른 페이지 이동

0개의 댓글