디케이
[java] 인터셉터 구조 본문
반응형
현재 스프링부트를 사용해 서비스를 구현 중 개발 기록을 정리 하기위해
인터셉터에 대해 정리 해보려고 합니다.
1. beforeActionInterceptor
- 정보강화
- 없는 정보를 만들지는 않지만 세션 정보를 꺼내서 기존에 있는 정보를 정리 해둔다
- 가장 먼저 동작
@Component("beforeActionInterceptor") // 컴포넌트 이름 설정
public class BeforeActionInterceptor implements HandlerInterceptor {
@Autowired
private MemberService memberService;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 로그인 여부에 관련된 정보를 request에 담는다.
boolean isLogined = false;
boolean isAdmin = false;
int loginedMemberId = 0;
Member loginedMember = null;
if (session.getAttribute("loginedMemberId") != null) {
loginedMemberId = (int) session.getAttribute("loginedMemberId");
isLogined = true;
loginedMember = memberService.getMember(loginedMemberId);
isAdmin = memberService.isAdmin(loginedMemberId);
}
request.setAttribute("loginedMemberId", loginedMemberId);
request.setAttribute("isLogined", isLogined);
request.setAttribute("isAdmin", isAdmin);
request.setAttribute("loginedMember", loginedMember);
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
2. needAdminInterceptor
- 관리자 관련 항목으로 일반사용자 접속을 걸러준다
- ajax 문법을 사용했다면 json으로 응답
- ajax가 아니라면 javascript로 응답
- 로그인까지는 예외 적용
@Component("needAdminInterceptor") // 컴포넌트 이름 설정
public class NeedAdminInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isLogined 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isLogined"); 이것만으로 로그인 여부 알 수 있음
boolean isAdmin = (boolean) request.getAttribute("isAdmin");
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isAjax 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isAjax"); 이것만으로 해당 요청이 ajax인지 구분 가능
boolean isAjax = true;
if (isAdmin == false) {
if (isAjax == false) {
response.setContentType("text/html; charset=UTF-8");
response.getWriter().append("<script>");
response.getWriter().append("alert('관리자만 이용해주세요.');");
response.getWriter().append("location.replace('/usr/member/login?redirectUri="
+ request.getAttribute("encodedAfterLoginUri") + "');");
response.getWriter().append("</script>");
// 리턴 false;를 이후에 실행될 인터셉터와 액션이 실행되지 않음
} else {
response.setContentType("application/json; charset=UTF-8");
response.getWriter().append("{\"resultCode\":\"F-A\",\"msg\":\"관리자만 이용해주세요.\"}");
}
return false;
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
3. needLoginInterceptor
- 일반 사용자에 대한 모든 접속 정보를 한번 걸러준다
@Component("needLoginInterceptor") // 컴포넌트 이름 설정
public class NeedLoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isLogined 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isLogined"); 이것만으로 로그인 여부 알 수 있음
boolean isLogined = (boolean) request.getAttribute("isLogined");
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isAjax 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isAjax"); 이것만으로 해당 요청이 ajax인지 구분 가능
boolean isAjax = true;
if (isLogined == false) {
if (isAjax == false) {
response.setContentType("text/html; charset=UTF-8");
response.getWriter().append("<script>");
response.getWriter().append("alert('로그인 후 이용해주세요.');");
response.getWriter().append("location.replace('/usr/member/login?redirectUri="
+ request.getAttribute("encodedAfterLoginUri") + "');");
response.getWriter().append("</script>");
// 리턴 false;를 이후에 실행될 인터셉터와 액션이 실행되지 않음
} else {
response.setContentType("application/json; charset=UTF-8");
response.getWriter().append("{\"resultCode\":\"F-A\",\"msg\":\"로그인 후 이용해주세요.\"}");
}
return false;
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
4. needLogoutInterceptor
- 일반 사용자에 대한 모든 접속 정보를 한번 걸러준다
@Component("needLogoutInterceptor") // 컴포넌트 이름 설정
public class NeedLogoutInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 이 인터셉터 실행 전에 beforeActionInterceptor 가 실행되고 거기서 isLogined 라는 속성 생성
// 그래서 여기서 단순히 request.getAttribute("isLogined"); 이것만으로 로그인 여부 알 수 있음
boolean isLogined = (boolean) request.getAttribute("isLogined");
boolean isAjax = true;
if (isLogined) {
if (isAjax == false) {
response.setContentType("text/html; charset=UTF-8");
response.getWriter().append("<script>");
response.getWriter().append("location.replace('/usr/home/main');");
response.getWriter().append("</script>");
} else {
response.setContentType("application/json; charset=UTF-8");
response.getWriter().append("{\"resultCode\":\"F-A\",\"msg\":\"로그아웃 상태에서 이용해주세요.\"}");
}
// 리턴 false;를 이후에 실행될 인터셉터와 액션이 실행되지 않음
return false;
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
}
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
// beforeActionInterceptor 인터셉터 불러오기
@Autowired
@Qualifier("beforeActionInterceptor")
HandlerInterceptor beforeActionInterceptor;
// needAdmLoginInterceptor 인터셉터 불러오기
@Autowired
@Qualifier("needAdminInterceptor")
HandlerInterceptor needAdminInterceptor;
// needLoginInterceptor 인터셉터 불러오기
@Autowired
@Qualifier("needLoginInterceptor")
HandlerInterceptor needLoginInterceptor;
// needLogoutInterceptor 인터셉터 불러오기
@Autowired
@Qualifier("needLogoutInterceptor")
HandlerInterceptor needLogoutInterceptor;
// 이 함수는 인터셉터를 적용하는 역할을 합니다.
@Override
public void addInterceptors(InterceptorRegistry registry) {
// beforeActionInterceptor 인터셉터가 모든 액션 실행전에 실행되도록 처리
registry.addInterceptor(beforeActionInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/resource/**");
// 어드민 필요
registry.addInterceptor(needAdminInterceptor)
.addPathPatterns("/adm/**")
.excludePathPatterns("/adm/member/login")
.excludePathPatterns("/adm/member/doLogin");
// 로그인 필요
registry.addInterceptor(needLoginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/")
.excludePathPatterns("/adm/**")
.excludePathPatterns("/resource/**")
.excludePathPatterns("/usr/home/main")
.excludePathPatterns("/usr/member/login")
.excludePathPatterns("/usr/member/doLogin")
.excludePathPatterns("/usr/member/join")
.excludePathPatterns("/usr/member/doJoin")
.excludePathPatterns("/usr/article/list")
.excludePathPatterns("/usr/article/detail")
.excludePathPatterns("/usr/reply/list")
.excludePathPatterns("/usr/member/findLoginId")
.excludePathPatterns("/usr/member/doFindLoginId")
.excludePathPatterns("/usr/member/findLoginPw")
.excludePathPatterns("/usr/member/doFindLoginPw")
.excludePathPatterns("/usr/file/test*")
.excludePathPatterns("/usr/file/doTest*")
.excludePathPatterns("/test/**")
.excludePathPatterns("/error");
// 로그인 상태에서 접속할 수 없는 URI 전부 기술
registry.addInterceptor(needLogoutInterceptor)
.addPathPatterns("/adm/member/login")
.addPathPatterns("/adm/member/doLogin")
.addPathPatterns("/usr/member/login")
.addPathPatterns("/usr/member/doLogin")
.addPathPatterns("/usr/member/join")
.addPathPatterns("/usr/member/doJoin");
}
}
아직 개발 초기 단계라 비교적 소스코드가 간결할때 기록 하기에 이해하기 어렵지 않을거라 생각합니다.
혹시라도 잘못된 문법이나 궁금한게 있다면 댓글로 남겨주세요 ~~
반응형
'Java' 카테고리의 다른 글
[Java] 추상클래스와 인터페이스 차이 (0) | 2021.02.27 |
---|---|
github 원격저장소에 잘 못 올린 파일, 폴더 삭제 (0) | 2021.02.19 |
[JSP] <form>을 ajax로 변환 하는 예제 (0) | 2021.02.17 |
HTTPServletRequest 메소드 정리 (0) | 2021.02.07 |
리눅스 명령어 -1 (0) | 2021.02.03 |