티스토리 뷰

Spring

인터셉터

pakker 2018. 12. 6. 21:06


나에게는 이해도 잘 가지 않았던 인터셉터..!

계속 읽다보니까 어떻게 이해가 되긴 되었다.



인터 셉터는 스프링 MVC에서 인터셉터는 URI를 가로채는 일을 합니다.

URI를 가로채서 controller보다 먼저(preHandler), controller 진행 직후(postHandler), View단까지 다 보여준 다음(afterHandler) 3가지로 나눠서 작업 시킬 수 있습니다.


오늘은 이 인터셉터를 활용해서 로그인 처리 를 해보겠습니다.


웹에서 로그인의 가장 기본 방식은 HttpSession 객체를 이용하는 것!

HttpSession은 실제로는 세션쿠키를 이용해 이루어집니다.

세션쿠키가  key라면, HttpSession은 자물쇠입니다.

이런 것들이 쌓이면 Session이 많아 지겠죠?


세션에 보관된 객체는 JSP에서 EL을 이용해서 자동으로 추적합니다.

순서는 ${name }을 검색할 경우 

Page -> Request -> Session -> application의 순서대로 원하는 데이터를 검색합니다.

그래서 개발자가 변수가 어딨는지 고민안해도 되는 고마운 존재!


1. 로그인

시에 사용자 정보는  : VO에 저장 --> 세션에 보관


2. VO, DAOImpl, ServiceImpl 을 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class UserVO {
 
    private String uid;
    private String upw;
    private String uname;
    private String upoint;
    
    
    public String getUid() {
        return uid;
    }
    public void setUid(String uid) {
        this.uid = uid;
    }
    public String getUpw() {
        return upw;
    }
    public void setUpw(String upw) {
        this.upw = upw;
    }
    public String getUname() {
        return uname;
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public String getUpoint() {
        return upoint;
    }
    public void setUpoint(String upoint) {
        this.upoint = upoint;
    }
    
    @Override
    public String toString(){
        return "UserVO: " + uid + upw + uname + upoint;
    }
}
 
cs

1
2
3
4
5
public interface UserDDAO {
 
    public UserVO login(LoginDTO dto)throws Exception;
}
 
cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Repository
public class UserDAOImpl implements UserDDAO{
 
    @Inject
    private SqlSession session;
    
    private static String namespace ="com.itnomads.hh.mappers.userMapper";
    
    @Override
    public UserVO login(LoginDTO dto)throws Exception {
        // TODO Auto-generated method stub
        return session.selectOne(namespace+".login",dto);
    }
 
}
cs

1
2
3
public interface UserService {
    public UserVO login(LoginDTO dto)throws Exception;
}
cs


1
2
3
4
5
6
7
8
9
10
11
12
13
public class UserServiceImpl implements UserService {
 
    @Inject
    private UserDDAO dao;
 
    @Override
    public UserVO login(LoginDTO dto) throws Exception {
        // TODO Auto-generated method stub
        return dao.login(dto);
    }
 
}
 
cs

2. 컨트롤러 

여기서는 중요한 결정이 필요합니다.

1) 컨트롤러에서 HttpSession 객체를 처리할 것인가?

2) 인터셉터에서 HttpSession을 처리할 것인가?


우리는 2번을 선택!

컨트롤러 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@Controller
@RequestMapping(value="/user")
public class UserController {
    
    @Inject
    private UserService service;
    
    @RequestMapping(value="/login", method=RequestMethod.GET)
    public void loginGET(@ModelAttribute("dto") LoginDTO dto){
        
    }
    
    @RequestMapping(value="/loginPost", method=RequestMethod.POST)
    public void loginPOST(LoginDTO dto, HttpSession session, Model model) throws Exception{
        UserVO vo = service.login(dto);
        if(vo==null){
            return;
        }
        model.addAttribute("userVO", vo);
    }
 
}
cs

3. 인터셉터

LoginInterceptor를 구현해 봅시다


preHandle의 타입은 보통 boolean으로, false일때는 controller를 실행하지 않게 하기 위해서 이다.


댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함