Interceptor

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

Spring

목록 보기
22/26

Spring

Interceptor

User Authorization Interceptor

  • UserAuthHandler
    • 로그인을 하지 않은 사용자는 특정 서비스를 이용하지 못하도록 interceptor 생성

    • Client의 요청이 Controller에 들어가기 전 요청을 가로채서 Client가 로그인을 했는지 저장된 session으로 검증 진행

    • interceptor

      package com.spring.myweb.util.interceptor;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      
      import org.springframework.web.servlet.HandlerInterceptor;
      
      public class UserAuthHandler implements HandlerInterceptor{
      	
      	// 회원 권한이 필요한 페이지 요청이 들어왔을 때 요청을 가로채서 확인할 인터셉터 
      	// 글쓰기 화면과, 마이페이지 화면에 들어가는 요청을 가로채 검사
      	// 권한이 없다면 로그인 페이지로 이동 
      	
      	// 유저 인증은 controller로 요청이 들어가기 전 체크하는 것이 좋으므로 preHandle 사용 
      	
      	@Override
      	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      			throws Exception {
      		
      		// 세션에서 로그인 데이터를 얻은 후 확인 진행 
      		HttpSession session = request.getSession();
      		
      		// 세션이 있는지 체크 (없다면 다른 곳으로 보냄)
      		if(session.getAttribute("login") == null) {
      			// 로그인을 안했으면 session이 없으므로 null이 됨 
      			response.sendRedirect(request.getContextPath() + "/user/userLogin");
      			// 로그인을 안했으므로 userLogin으로 보냄
      			
      			return false;
      		}
      		else {
      			return true;
      			// 로그인을 한 사람은 interceptor를 통과 
      		}
      	}
      }

    • 생성한 interceptor를 bean 등록

    • interceptor가 어디에 있는지 알려주고 어떤 요청에 반응해야 하는지 알려줌

      <?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" />
      	
      	<!-- 생성한 interceptor bean 등록  -->
      	<bean id="UserAuth" class="com.spring.myweb.util.interceptor.UserAuthHandler" />
      	
      	<mvc:interceptors>
      		<!-- root-context.xml에 등록하는 거랑 똑같음  -->
      		<!-- 로그인 이후에 실행되는 postHandler -->
      		
      		<mvc:interceptor>
      			<mvc:mapping path="/user/userLogin"/>
      			<ref bean="UserLoginSuccessHandler" />
      			<!-- 참조하는 bean 지정  -->
      		</mvc:interceptor>	
      		
      		<!-- 로그인 권한을 체크하는 핸들러  -->
      		<mvc:interceptor>
      			<!-- 로그인 권한을 체크하기 위해 해당 요청을 interceptor가 먼저 체크  -->
      			<mvc:mapping path="/freeBoard/freeRegist" />
      			<mvc:mapping path="/user/userMypage"/>
      			<ref bean="UserAuth" />
      		</mvc:interceptor>
      			
      	</mvc:interceptors>
      	
      
      </beans>

Board Authorization Interceptor

  • BoardAuthHandler

    • 특정 게시판을 작성한 사용자가 아니거나 로그인을 하지 않은 사용자가 게시물을 변경 및 수정을 진행하지 못하는 로직 작성

    • 현재 로그인한 사용자의 정보를 session으로 가지고 와서 해당 게시글의 작성 id와 비교를 통해 사용자 검증

    • Interceptor를 통해 위의 내용을 Controller에 가기 전 차단

      package com.spring.myweb.util.interceptor;
      
      import java.io.PrintWriter;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;
      
      import org.springframework.web.servlet.HandlerInterceptor;
      
      import com.spring.myweb.command.UserVO;
      
      public class BoardAuthHandler implements HandlerInterceptor {
      	//화면에서 변경, 수정, 삭제가 일어날 때, writer값을 넘겨주도록 처리
      	   //게시글 수정, 삭제에 대한 권한 처리 핸들러
      	   //세션값과 writer(작성자) 정보가 같다면 컨트롤러를 실행,
      	   //그렇지 않다면 '권한이 없습니다.' 경고창 출력 후 뒤로가기.
      	   //권한이 없습니다 경고창은 jsp에서 했었던 PrintWriter 객체를 이용하
      	   //PrintWriter 객체는 response 객체에게 받아옴
      
      	@Override
      	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
      			throws Exception {
      		
      		HttpSession session = request.getSession();
      		UserVO user = (UserVO) session.getAttribute("login");
      		System.out.println("session에 있는 유저 객체 가져오는지 확인 : " + user);;
      		// login이라는 이름의 유저의 session 가져옴 
      		String writer = request.getParameter("writer");
      		System.out.println("인터셉터 파라미터 가져오는지 확인 : " + writer);
      		// 특정 요청으로 Controller로 가는 데이터를 가져와서 확인 
      		
      		if (user != null) {
      			if (user.getUserId().equals(writer)) {
      				// 파라미터에서 가져온 값과 session에 저장된 값이 같으면 controller로 이동하도록 
      				return true;
      			}
      		}
      		
      		response.setContentType("text/html charset=UTF-8");
      		PrintWriter out = response.getWriter();
      		
      		String html = "<script>\r\n"
      				 +"alert('권한이 없습니다.'); \r\n"
      				 +"history.back(); \r\n"
      				 +"</script>";
      		out.print(html);
      		out.flush();
      		
      		return false;
      	}
      }

  • 생성한 interceptor를 bean 등록

    • interceptor가 어디에 있는지 알려주고 어떤 요청에 반응해야 하는지 알려줌

      <?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" />
      
       <!-- 생성한 interceptor bean 등록  -->
       <bean id="UserAuth" class="com.spring.myweb.util.interceptor.UserAuthHandler" />
      
       <bean id="UserAuthBoard" class="com.spring.myweb.util.interceptor.BoardAuthHandler" />
      
       <mvc:interceptors>
           <!-- root-context.xml에 등록하는 거랑 똑같음  -->
           <!-- 로그인 이후에 실행되는 postHandler -->
      
           <mvc:interceptor>
               <mvc:mapping path="/user/userLogin"/>
               <ref bean="UserLoginSuccessHandler" />
               <!-- 참조하는 bean 지정  -->
           </mvc:interceptor>	
      
           <!-- 로그인 권한을 체크하는 핸들러  -->
           <mvc:interceptor>
               <!-- 로그인 권한을 체크하기 위해 해당 요청을 interceptor가 먼저 체크  -->
               <mvc:mapping path="/freeBoard/freeRegist" />
               <mvc:mapping path="/user/userMypage"/>
               <ref bean="UserAuth" />
           </mvc:interceptor>
      
           <mvc:interceptor>
               <mvc:mapping path="/freeBoard/freeModify"/>
               <mvc:mapping path="/freeBoard/freeDelete"/>
               <!-- 수정 및 삭제 페이지 요청이 들어오면 interceptor가 먼저 가로채도록 -->
               <ref bean="UserAuthBoard" />
      
           </mvc:interceptor>
      
       </mvc:interceptors>
profile
안녕하세요! 공부한 내용을 기록하는 공간입니다.

0개의 댓글