[Spring] Interceptor 인터셉터-기능 권한

나옹·2022년 11월 29일
0

**세션 기능을 인터셉터에서 적용하여 로그인하는 기능구현

로그인 시
1) 세션의 등록여부, 2) 세션의 로그인 정보를 저장
이것을 컨트롤러에서 할 것인가? 이렇게 하면 어떤 불편한 점이 있을까??

권한이 있는 기능을 구현할 때
글쓰기는 로그인 한 사람만, 글보기는 아무나 , 글 자세히보기도 로그인 한 사람만 가능이라고 가정

불편한 점: 서비스를 먼저 처리해준다고 하고 세션의 등록여부 판단을 매번 해주어야 한다. <코드 중복>

개선한다면 컨트롤러에 서비스를 처리해주기 전에 로그인 검사를 한 후 컨트롤러가 서비스를 처리해준다.
인터셉터는 컨트롤러에 처리하기 전이나 후에 동작하는 것. 대부분 컨트롤러 처리전에 많이 사용

작업순서

클라이언트의 요청> 인터셉터 >컨트롤러 처리(파라미터 받기+데이터베이스 작업 요청+view선택+ 세션처리) > View선택(데이터 전달) > forword or redirect

인터셉터 설정

public class AuthenticationInterceptor 
extends HandlerInterceptorAdapter

java 클래스에 HandlerInterceptorAdapter를 상속받는다.

소스 오버라이딩을 통해 preHandle, postHandle을 오버라이딩 해온다.

preHandle : 실제 handle 이 실행되기 전 수행
postHandle : 실제 handle 이 수행된 후 실행

servlet-context.xml에서 인터셉터 설정

	<!-- 객체를 만들어 주세요.. 라는 설정입니다. 이 코드가 인터셉터 기능은 아닙니다.   -->
	<!-- 인터셉터 설정  인터셉터에 적용될 컨트롤러를 매핑으로 설정-->
	<interceptors>
		<interceptor>
			<mapping path="/**"/> <!-- /로 시작되는 모든 것.. /a/b/c  -->
			<!-- 인터셉터는 로그인과 관련된 컨트롤러 요청은 처리하면 안된다. 제외시킨다. --> 
			<exclude-mapping path="/" /> <!-- 홈화면 제외-->
            <exclude-mapping path="/resources/css/**" /> <!-- css 제외(해주지 않으먄 css가 적용이 되지 않음-->
			<exclude-mapping path="/Login**" /><!-- 로그인 제외-->
			<beans:ref bean="authenInterceptor"/>
		</interceptor>
	
	</interceptors>

여기서 exclude-mapping path가 계속 오류가 떠서 찾아보니 exclude-mapping path는 3.2버젼부터 지원하는 기능인데 나는 3.1 버젼이었다!!


버전을 최신버전으로 바꾸고 Maven update를 진행해주었더니 오류가 사라졌다.

로그인 하지 않은 경우 글쓰기 접근 불가

컨트롤러 코드

@Controller
public class UserLogin {
	
	@RequestMapping(value = "/Login", method = RequestMethod.POST)
	public String login(HttpSession session,
						@RequestParam("id") String id,
						@RequestParam("pass") String pass) {
		//로그인 절차 
		// 1. 파라미터 받는다. 2.쿼리 실행 후 결과값에 따라 판단.. 서비스단이 필요
		
		
		if(id.equals("ttt")) { //쿼리 실행 후 아이디와 패스워드가 정상적인 경우 리턴받는 것으로 수정
			//로그인 성공인 경우
			session.setAttribute("login", id); //세션처리
			session.setAttribute("grade", "vip"); //처리하고 싶은 변수를 등록하여 처리
		}else {
			//로그인 실패인 경우
		}
		// <--- 여기까지가 테스트용 나중에 DB연동 시켜야 한다.
		
		System.out.println("로그인 공사중");
		return "home";
	}
}

인터셉터 코드

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		//로그인을 안한 경우는 로그인을 하도록한다. 글쓰기 글 자세히 보기는 로그인을 해야만 접근할 수 있다. 
		// 세션을 검사 후..
		//클라이언트마다 세션이 있다. 클라이언트가 보낸 쿠키의 아이디와 일티하는 세션의 객체를 가져와라
		HttpSession session =request.getSession();
		//가져온 세션에서 login 변수를 찾아서 리턴받아라. 그런데 login변수의 리턴타입을 모르니 모든변수의 최상위인 object로 받음
		Object obj=session.getAttribute("login");
		if(obj==null) { //로그인 안한경우
			response.sendRedirect(request.getContextPath()+"/"); //컨트롤러 / 경로바꿈
			return false;
		}
		return true;//원래 경로로 가라
	}

컨트롤러에서 로그인이 성공했다면 session에 id를 넘겨주고 로그인에 실패했다면 id는 null상태이다.

인터셉터에서 id를 받아와서 id가 null이라면 로그인이 되지 않은 상태 null이 아니라면 로그인 상태이다.

로그인을 실패한 경우 경로가 현재의 페이지로 변경되어 글쓰기로 들어가지지 않는다.
로그인 성공 시 원래 지정해둔 경로로 맞게 진행된다.

profile
최고의 개발을 위해 !

0개의 댓글