2019.08.29

 

 

 

 

 // 인터셉터 (Interceptor)

 - 컨트롤러에 들어온 요청(HttpRequest)와 응답(HttpResponse)를 가로채는 기능

 - 로그인 체크 유무 혹은 권한 체크에 주로 사용

 

 로그인 체크

 

 application.properties

 

 2019.09.11 추가

 application.properties에서 인터셉터 예외처리로 확장자명을 썼는데 CSS가 적용되지 않는 오류가 발생하여 CSS, JS 등등을 한 폴더에 넣어놓고 폴더 전체를 예외처리하여 문제해결

 

 

 

 

 InterceptorConfig.java

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
package kr.og.ksmart;
 
 
import org.springframework.context.annotation.Configuration;
 
@Configuration // 스프링 컨테이너에 새로운 빈 객체를 제공
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Autowired
    @Qualifier(value = "loginInterceptor")
    private HandlerInterceptor loginInterceptor;
 
    @Value("${resources.notload.list}"// application.properties에 설정된 값을 가지고 오기
    private List<String> notLoadList;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        
        notLoadList.add("/login");
        notLoadList.add("/loginProcess");
        notLoadList.add("/");
        notLoadList.add("/logoutProcess");
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns(notLoadList);        
        
        /*
         * registry.addInterceptor(commonInterceptor) .addPathPatterns("/**") // 추가할 url
         * 패턴 .excludePathPatterns("/user/**"); // 제외할 url 패턴
         */
    }
}
 
 

 

 LoginInterceptor.java

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
40
41
package kr.og.ksmart;
 
 
 
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
 
 
@Component
public class LoginInterceptor implements HandlerInterceptor {
 
    private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
      
    // 요청을 컨트롤러에 보내기 전 작업
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        
        logger.info("LoginInterceptor - {}""호출완료");
        
        HttpSession session = request.getSession();
        String memberId = (String)session.getAttribute("memberId");
        
        if(memberId != null) {
            return true;
        } else {
              try { 
                  response.sendRedirect("/login"); 
              } catch (IOException e) {
                  e.printStackTrace(); 
              }
            return false;
            
        }
    }      
}
 

 

 

 

 

 제대로 동작하는지 확인용

 

 MainController.java

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
40
41
42
43
44
45
46
47
48
49
package kr.og.ksmart;
 
 
import org.springframework.stereotype.Controller;
 
@Controller
public class MainController {
    
    @GetMapping(value = "/")
    public String index() {
        return "/index.html";
    }
    
    @GetMapping(value = "/login")
    public String login() {
        return "/login.html";
    }
        
    @GetMapping(value = "/main")
    public String main() {
        return "/main.html";
    }
    
    @PostMapping(value = "/loginProcess")
    public String loginProcess(@RequestParam(value = "id"String id
                             , @RequestParam(value = "pw"String pw
                             , HttpSession session) {
        
        // DB 조회를 가정하고 ID는 상관없이 PW가 12345
        if("12345".equals(pw)) {
            session.setAttribute("memberId", id);
            return "redirect:/main";
        } else {
            return "redirect:/login";
        }
    }
    
    @RequestMapping("/logoutProcess")
    public String logoutProcess(HttpSession session) {
        session.invalidate();
        return "redirect:/index";
    }
}
 

 

 login session이 없을 경우 index.html -> main.html 

 addPathPatterns("/**") : URL 전체를 인터셉터로 제어

 excludePathPatterns(notLoadList) : /, /login, /loginProcess URL을 제외하고 인터셉터로 제어

 /main 은 제외하지 않은 URL이기 때문에 loginInterceptor 인터셉터로 거치게 되고 session 값이 없기 때문에 /login 으로 redirect

 

 

+ Recent posts