유디의 공간정보·개발일기
9. 0913_ 필터와 인터셉터(계속), java web application 본문
* 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도 바뀐 것을 볼 수 있다.
'Spring, Mybatis' 카테고리의 다른 글
8. 0910_ 형상관리도구(계속), (0) | 2021.09.10 |
---|---|
7-1. 0909_ Spring AOP, logger의 패턴과 level(info, debug) (0) | 2021.09.09 |
6. 0908_ Spring MVC(계속) (0) | 2021.09.09 |
5. 0907_Spring MVC(계속), Spring까지 같이 사용하기 (0) | 2021.09.07 |
4. 0906_Spring MVC (0) | 2021.09.06 |