[Spring] Interceptor 사용시 경로가 꼬이는 문제(Model or RequestAttributes 활용)
데이터를 넘겨주는 방식에는
Model (= ModelAndView), RedirectAttributes(addFlash, add)
주로 두가지 방법이 있다.
코드의 목적 : 장바구니 도착 => 데이터 뿌려줌 => 새로고침해도 유지
=> 다른 페이지 이동시 오류 안나게
문제 상황))
Model,(ModelAndView)에 담아서 forward방식으로 페이지 이동
url = http://localhost:8079/loginCheck/cartList
(loginCheck/cartList)
데이터 성공적으로 넘어감
새로고침 가능
but 다른 페이지로 이동할때(ex)myPage => loginCheck/loginCheck/myPage이동)
url = http://localhost:8079/loginCheck/loginCheck/myPage
그래서 return을 ../cartList로 해줬더니 못찾음 /WEB-INF/../cartList.jsp로 처리 된것 같음
고민 : 이거때문에 session에 담아주기는 사용자가 많아졌을 때 서버자원을 많이 잡아먹기 때문에
효율적이지 못한것 같음
문제 상황 2 : addFlashAttribute에 담아 넘겨주면 302 redirect로 넘겨주는데, 새로고침시에 저장된 데이터가 사라져서 불러오지 못함
(addFlashattribute에서 302로 넘겨주는게 아니라 redirect 방식으로 넘겨주는게 전부 302 방식 인 것 같다. 그러나 다른 사이트에서는 장바구니에 담아도 302로 넘겨주는 모습이 없는데 어떻게 구조를 짠것인지 너무 궁금하다)
addFlashAttriubte의 원리는 session에 저장하여 넘겨준 다음, 곧바로 invalidate를 해주는 구조라서
새로고침을 하게 될 경우 장바구니에 담겨진 정보를 불러오지 못하게 된다.
결론 : 첫 접근에 loginCheck/cartList 이기 때문에 경로상에 문제가 꼬여서 이 문제가 발생한다.
그렇기 때문에 cartList에 첫 접근시에만 interceptor를 이용하여 권한 체크를 해주고
그 이후에는 interceptor를 통하지 않고 접근이 가능하게 만들었다
@RequestMapping("/loginCheck/cartList") // interceptor 통과
public String cartList(RedirectAttributes attr, HttpSession session, Model model) {
MemberDTO mDTO= (MemberDTO) session.getAttribute("login");
List<CartDTO> list = service.cartList(mDTO.getUserid());
attr.addFlashAttribute("cartList", list); //리다이렉트시 데이터 유지
return "redirect:../cartList";
}
@RequestMapping("/cartList") //
public ModelAndView cartList2(HttpSession session, Model model) {
MemberDTO mDTO= (MemberDTO) session.getAttribute("login");
List<CartDTO> list = service.cartList(mDTO.getUserid());
ModelAndView mav = new ModelAndView(); System.out.println(list);
mav.addObject("cartList", list);
mav.setViewName("cartList");
return mav;
}
이렇게 만들어줬을 때 경로상에 꼬이는게 없어서 새로고침도 가능해지고
다른 페이지 이동시에 경로가 꼬이지도 않게 된다.
결론 : interceptor를 통해 권한 체크를 하는 위치를 잘 정해두고
경로가 꼬이는 경우를 잘 파악해둬야 할 것 같다.
새로고침 오류가 날 수 있는 곳(mypage, 댓글, 장바구니, 구매과정 등)에서 페이지 전환에 대한 부분을 좀더 신경써야 할 것 같음
++ 위의 방식으로 처리하게 될 경우 URI에 바로 cartList를 작성할 경우 로그인 여부를 체크하지 않고 넘어가게 된다.
그러니 접근시에 어떻게든 login세션을 확인해야한다는 건데 권한체크를 어떻게 해야할지 고민해봐야하는 부분이다.
'skill > Spring (boot)' 카테고리의 다른 글
[Spring] stomp 웹소켓 중복 연결 + 메세지 중복 전달 오류 (0) | 2021.06.03 |
---|---|
[Spring] Interceptor, Filter 차이 (0) | 2021.05.19 |
[빌드관리도구]MAVEN (0) | 2021.04.13 |