본문으로 바로가기

2019-01-08

category 수업내용 정리/정리안된 메모 2019. 6. 16. 21:03

2019-01-08

[컨트롤러 기본 값 설정하기]

public String userDetail(Model model, @RequestParam(value="id",defaultValue="testid")String userid)​​

이미지 처럼 파라미터에 코드를 작성하게 되면 값이 넘어오지 않았을 때의 기본 값을 설정 할 수 있다.

[깨지는 한글처리 하기]

좋은 블로그 : https://dololak.tistory.com/123

클라이언트에서 post로 서블릿으로 한글파일을 보내게 될 경우 한글이 깨질 수 있다. 이러한 문제는 utf-8로 하더라도, http 통신 규약에 의해서 기본 인코딩이 다른 것으로 바뀌기 때문에 일어나는 문제인데.

이러한 문제를 해결하기 위해서는 서블릿이 요청을 받을 때 UTF-8을 받겠다는 선언(작업)을 해주어야 한다.

org.springframework.web.filter.CharacterEncodingFilter

스프링에서는 필터를 통해서 요청의 인코딩을 바꿀 수 있다. 필터는 web.xml에 추가한다.

[welcome-file-list는 뭘까?]

좋은 블로그 : https://dololak.tistory.com/54

index 페이지를 설정할 수 있는 태그

[Interceptor 공부하기]

[참고하면 좋은 블로그 목록]

1.인터셉터(Interceptor)란? + 인터셉터를 이용한 로그인 처리

└ http://rongscodinghistory.tistory.com/2

2. 필터와 인터셉터의 차이점 

└ https://lalwr.blogspot.com/2016/02/spring-aop-interceptor-filter.html

3. 필터와 인터셉터의 차이점

└ http://javannspring.tistory.com/86

[Interceptor] : 요청을 처리하기전에 요청을 가로채서 먼저 확인하고 처리를 한다.

이미지0) 필터의 동작방식

이미지1) 인터셉터의 동작방식

인터셉터는 필터와 다르게 스프링 내부에 존재해서 스프링 구성요소에 접근 할 수 있다.

[실습하기]

(인터셉터 등록)

1. 요청을 가로채서 동작을 수행할 인터셉터 클래스 작성 : bean 등록 및 필요메서드 재정의

인터셉터클래스 작성하기 : HandlerInterceptorAdapter를 상속받아 구현 

인터셉터 클래스는 HandlerInterceptorAdapter 클래스를 상속받아서 preHandle()와 postHandle() 를 재정의 해야 한다.

preHandle을 보면 반환값이 boolean 인데, 반환값이 true이면 요청처리 진행 false이면 요청처리 중단이다.

테스트를 위한 sysout 작성

2. 생성한 인터셉터가 가로챌 요청에 대해서 정의
공용이 아니라 특정 요청에 동작하는 클래스이기 때문에 app-context.xml에 요청에 대한 정의를 해주게 된다.

app-context.xml의 Namespaces 탭에 있는 MVC를 체크해준다.

이미지 주석을 참고하여, 작성 하고 서버를 다시 로딩 하게 되면 

테스트를 위해서 작성해였던 sysout을 확인 할 수 있다. 즉, 인터셉터가 member의 요청을 가로챘다는 것을 확인할 수 있는 부분.

[인터셉터 mapping 여러개 하기]

테스트를 위해서 컨트롤러에 2개의 test ()를 추가했다.

그리고 인터셉터의 mapping에는 test1 만 등록했을 떄 

test1 요청을 한 경우

test2 요청을 한 경우 

위의 결과를 통해 우리는 특정 요청에만 인터셉터를 이용할 수 있다는 것을 확인 할 수 있다.

[인터셉터는 언제 많이 사용 될 까?]

인터셉터는 요청의 유효성을 처리하기 위해서 사용된다. 즉, 권한을 가진 사람만 할 수 있는 요청했을 때, 현재 사용자가 권한이 있는지 없는지 확인하는 용도로 사용이 가능하며, 실무에서도 많이 사용한다.

여기서 말하는 권한을 쉽게 말하면, '로그인 유/무'로 말할 수 있다.

pre와 post Handle()를 살펴보면 파라미터로 리퀘스트와 리스폰스 객체를 받는 것을 확인 할 수 있다. 즉, 이 두 객체를 이용해서 여러가지 유효성 검사를 할 수 있음.

[몇가지 실험?]

인터셉터의 preHandle()를 위에 보이는 것 처럼 response 객체를 이용해서 요청이 들어왔을 때 바로 test2로 요청을 보내고 return값을 false(진행안함)으로 하면 어떻게 될 까 

콘솔창을 살펴보면 요청이 분명 memberList로 들어왔지만, (기본설정 값임) preHandle()에 있는 response 객체의 sendRedirect를 만나 test2로 리다이렉트를 하여 

컨트롤러에 테스트를 위해 만들었던 test2() 메서드가 요청을 받은 것을 콘솔창에 찍힌 '테스트 핸들러2' 라는 문구를 통해 확인 할 수 있다.

실제로 인터넷 창에도 요청이 바로 test2로 들어간 것을 볼 수 있으며, 테스트 핸들러2 라는 문구 아래 postHandle()에 작성했던 sysout은 찍히지 않은 것을 볼 수 있는데.

이는 우리가 return 값을 false로 두었기 때문이다.


[실습예제] 인터셉터를 이용한 로그인 처리하기

LoginCheckInterceptor 작성

  - 로그인이 되어있지 않으면 지정한 요청을 처리하지 않고, 로그인 화면으로 돌려보낸다.

작성해야할 기능

- 로그인 : sessiong에 'userid'라는 속성이 있으면 로그인 

- 회원목록 보기

- 로그아웃 

- 회원정보 수정 

- 회원가입 

화면목록

- 로그인 화면 : login.jsp

- 메인화면 : main.jsp = "누구누구 회원닙 반갑습니다.", 목록보기, 정보수정

- 회원가입 : join.jsp

- 회원수정 : memberUpdate.jsp

- 회원목록 : memberList.jsp

요청(/member/*)

/loginForm : 로그인 페이지 요청

/login : 로그인 요청, 성공 : 메인으로 이동, 실패 : 로그인페이지

/joinForm : 회원가입 페이지 요청

/join : 회원가입 요청, 성공 : 로그인페이지 이동, 실패 : 로그인페이지 이동 

/modifyForm : 로그인이 되어 있는 회원 수정 페이지 요청 *비밀번호 확인없이 바로 수정

/modify : 회원 수정 요청, 성공 : 메인으로 이동, 실패 : 메인 

/memberList : 회원 목록 페이지 요청

/logout : 로그아웃, 로그인 페이지로 이동 

인터셉터가 걸려야 되는 요청
/main

/modifyForm

/modify

/memberList

/logout