반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

디케이

[java] 인터셉터 구조 본문

Java

[java] 인터셉터 구조

디케이형 2021. 2. 27. 22:04
반응형

현재 스프링부트를 사용해 서비스를 구현 중 개발 기록을 정리 하기위해

인터셉터에 대해 정리 해보려고 합니다.

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");
    }
}

아직 개발 초기 단계라 비교적 소스코드가 간결할때 기록 하기에 이해하기 어렵지 않을거라 생각합니다.

혹시라도 잘못된 문법이나 궁금한게 있다면 댓글로 남겨주세요 ~~ 

반응형