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 |