2019.08.29
// 인터셉터 (Interceptor)
- 컨트롤러에 들어온 요청(HttpRequest)와 응답(HttpResponse)를 가로채는 기능
- 로그인 체크 유무 혹은 권한 체크에 주로 사용
로그인 체크
application.properties
2019.09.11 추가
application.properties에서 인터셉터 예외처리로 확장자명을 썼는데 CSS가 적용되지 않는 오류가 발생하여 CSS, JS 등등을 한 폴더에 넣어놓고 폴더 전체를 예외처리하여 문제해결
| 
 1 
2 
3 
 | 
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 java.util.List; 
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 java.io.IOException; 
import org.slf4j.Logger; 
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) { 
        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
'교육 > Spring Boot' 카테고리의 다른 글
| #89 thymeleaf th:include을 이용하여 레이아웃 분리 (0) | 2019.09.20 | 
|---|---|
| #85 MyBatis AS 대신 resultMap 활용하기 (0) | 2019.09.16 | 
| #63 Spring Boot thymeleaf 변수를 script에서 사용하기 (0) | 2019.08.09 | 
| #62 Spring Boot 페이징 처리 (0) | 2019.08.08 | 
| #60 Spring Boot 로그인 처리 (0) | 2019.08.06 |