유디의 공간정보·개발일기

9. 0913_ 필터와 인터셉터(계속), java web application 본문

Spring, Mybatis

9. 0913_ 필터와 인터셉터(계속), java web application

55yudi 2021. 9. 13. 14:33

   * Filter

   * Dispatcher Servlet -> web.xml에 있다.

   * Controller

   * JSP(views 폴더 밑에)

   * Service는 우리는 안해봤다.

   * VO, DAO

   * Mapper

 

   * 어떤 컨트롤러가 어떤 url에 연결되려는지

     --> @RequestMapping의 value를 보고 알 수 있다.

     --> 또는 실행 후 콘솔창에 나오는 ✨Mapped url 부분을 보고 알 수 있다.

          (예 : RequestMappingHandlerMapping - Mapped "{[/emp-list.do]}" onto public java.lang.String

                lx.edu.team8.controller.EmpController ... )

 


[필터]

 

[인터셉터]

인터셉터는 중간에서 가로챈다는 의미를 가진다. 스프링에서도 말 그대로 중간에 요청을 가로채서 어떠한 일을 하는 것을 말한다. 인터셉터의 정식 명칭은 핸들러 인터셉터(Handler Interceptor)이다.  -구글-

 

- 로그인을 하지 않은 채로 목록값을 불러오는 것에 대해 인터셉터가 필요해짐

- 서버를 요청하면 컨트롤러에 매핑되어 있는 url로 메서드가 실행된다

- 특정 URI로 요청시 Controller로 가는 요청을 가로채는 역할

 

기존<EmpController.java>에서

@RequestMapping("emp-list.do")//url
	public String getForm(int deptId, HttpServletRequest req) throws Exception {
		//이 메서드에서 무엇을 해야하나?
		//요청을 받아 세션 속에서 꺼내온 정보를 가지고~~ -> 매개변수에 HttpSession 넣어줄 수도 있지만
		//가로채서 인터셉트 사용해보기

 

- Filter vs. Interceptor

  * 공통점 : 둘 다 Controller로 들어가는 요청을 가로채 특정 작업을 하기 위한 용도로 사용된다.

  * 차이점 : 케어할 수 있는 영역(범위)이 다르다.

               Filter는 같은 웹 어플리케이션 내에서만 접근이 가능하며,

               Interceptor의 경우 스프링에서 관리되기 때문에 스프링내의 모든 객체에 접근이 가능하다.

               --> JSP Filter의 경우 주로 한글처리에 이용되고

               --> Interceptor의 경우 "로그인 처리"에 이용이 된다.

 

- 인터셉터를 사용하면 어떤 이점이 있는지

  왜 로그인 처리에 이용??

  : 만약 인터셉터를 이용하지 않고 로그인 처리를 한다면, 게시물을 작성, 게시물 수정, 게시물 삭제 등

   모든 요청마다 Controller에서 session을 통해 로그인 정보가 남아 있는지 확인하는 코드를 중복해서 입력해야 할 것임

 

   그러나 인터셉터를 이용하면, A, B, C 작업(A,B,C 경로로 요청)을 할 경우에 ~~Interceptor를 먼저 수행해 session에서

   로그인 정보가 있는지 확인해 주는 역할을 하기 때문에 중복 코드를 줄일 수 있다. 이러한 장점 때문에 사용함

출처: https://rongscodinghistory.tistory.com/2

 

 

- 어떤 형식으로 쓰는지

 

<servlet-context.xml>에 코드 작성

<!-- 인터셉터를 처리하기 위함 -->
	<interceptors>
		<interceptor>
			<mapping path="/emp-list.do"/>
			<beans:bean class="lx.edu.team8.interceptor.LoginCheckInterceptor"></beans:bean>
		</interceptor>
	</interceptors>

 

- LoginCheckInterceptor 클래스 생성하기

package lx.edu.team8.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LoginCheckInterceptor extends HandlerInterceptorAdapter {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("LoginCheckInterceptor");
		logger.debug("preHandler");
		return true;
	}
}

- 코드 수정

package lx.edu.team8.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LoginCheckInterceptor extends HandlerInterceptorAdapter {
	
	private Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println("LoginCheckInterceptor");
		//여기에서 뭘 해야하나?
		//세션에 로그인이 된 채로 요청을 한건지 체크해야 한다.
		//세션에 id라는 키로 저장되어 있나 보기
		HttpSession session = request.getSession();
		String id = (String) session.getAttribute("id"); //id입력창에 넣은 값을 가져온다.
		if(id == null || id.length() == 0) { //로그인이 제대로 안됐다면
			response.sendRedirect("login-form.do"); //로그인하는 곳으로 리다이렉트시킨다.
			return false;
		}
		return true;
	}
}

 

- 다음의 url로 입력하고 이동하면

  로그인 화면으로 바뀌어(=인터셉터 당하여) 로그인화면이 보여지게 되고 url도 바뀐 것을 볼 수 있다.