09009

[Spring] 예제 2 - Interceptor 본문

Back-End/Spring
[Spring] 예제 2 - Interceptor
09009

로그인하지 않았는데도 글쓰기 페이지가 접속이 되는 문제가 있다.

인터셉터 동작 원리

package com.ja.finalproject.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

// 이 클래스는 JSP API를 사용해야 한다.
public class SessionInterceptor implements HandlerInterceptor {

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) {
	
		if(request.getSession().getAttribute("sessionUser") == null) {
			System.out.println("로그인이 되어 있지 않습니다.");
			
		}
		return true;
	}
}

servlet-context.xml

아래와 같이 작성하면 모든 요청은 먼저 Intercepter를 통과하여 controller로 가게 된다.

/**/ : 모든 파일 적용

<!-- 인터셉터 -->
	<interceptors>
		<interceptor>
			<mapping path="/**"/>
			<beans:bean class="com.ja.finalproject.interceptor.SessionInterceptor"></beans:bean>
		</interceptor>	
	</interceptors>
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven />

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<!-- ja : 파일 업로드 관련.. 빈 등록.. -->
	<beans:bean id="multipartResolver" 
	class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<beans:property name="maxUploadSize" value="100000000"></beans:property>
	</beans:bean>
	
	
	<!-- 인터셉터 -->
	<interceptors>
		<interceptor>
			<mapping path="/**"/>
			<beans:bean class="com.ja.finalproject.interceptor.SessionInterceptor"></beans:bean>
		</interceptor>	
	</interceptors>
	
	
	
	<!--  ja : 아래 패키지명 변경할 것 -->
	<context:component-scan base-package="com.ja.finalproject.*.controller" />
	
	
	
</beans:beans>

	<!-- 인터셉터 -->
	<interceptors>
		<interceptor>
			<mapping path="/board/writeContentPage"/>
			<mapping path="/board/writeContentProcess"/>
			<mapping path="/board/updateContentProcess"/>
			<mapping path="/board/updatePage"/>
			
			<beans:bean class="com.ja.finalproject.interceptor.SessionInterceptor"></beans:bean>
		</interceptor>	
	</interceptors>

exception을 발동시켜 forwarding 해야 한다.

 

SessionInterceptor.java

package com.ja.finalproject.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.ModelAndViewDefiningException;

// 이 클래스는 JSP API를 사용해야 한다.
public class SessionInterceptor implements HandlerInterceptor {

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws ModelAndViewDefiningException {
	
		if(request.getSession().getAttribute("sessionUser") == null) {
				
			ModelAndView mv = new ModelAndView();
			mv.setViewName("member/loginRequired");
			throw new ModelAndViewDefiningException(mv);
			// 예외를 발생시켜야 스프링 프레임워크에서 인지한다.
			
			// 스프링 프레임워크로 예외를 넘긴다.
			
		}
		return true;
	}
}

loginRequired.jsp

이제 사용자가 글쓰기 페이지로 임의로 링크로 입력해서 접속하면 접근이 제한된다.

controller가 실행되지 않고 intercpet에서 처리한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	접근 권한이 없습니다. <a href="../board/mainPage">메인 페이지로 이동</a>
</body>
</html>