IT/Spring

(Spring) Interceptor [2015.04.07]

바바옄 2015. 4. 7. 18:25
반응형

p.149 ~ p.153 인터셉터

 

interceptor

- dispatcher servlet과 컨트롤러 사이에 존재하여 요청을 가로챈다.

- 모든 페이지 마다 동일한 기능의 제어

- 응답시간을 측정하는 인터페이스를 만들 수 있다.

 

interceptor가 할 수 있는 일 !!

1. 처리시간 체크

2. 인증 체크

3. 인가 체크

4. 로그인 체크

 

브라우져 -------> DS -----| interceptor |-----> control

    
                요청

 

dispatcherServlet.xml -> 원래 default는 applicationContext.xml

실무에서는 web.xml(모델 1)에 쓴다.. 지금은 잘 모르겠음.

 

src/main/java -> com.ktds.mcjang -> intercept -> Measuringinterceptor.java

 

package com.ktds.mcjang.intercept;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
 
public class Measuringinterceptor extends HandlerInterceptorAdapter{
 
    private static Logger logger = LoggerFactory.getLogger(Measuringinterceptor.class);
    
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        
        // 현재 시간을 가져온다
        long currentTime = System.currentTimeMillis();
        
        //  컨트롤러 -> DS : 응답을 받아주기 위헤
        //  현재 시간을 모델에 넣는다.
        request.setAttribute("bTime", currentTime);
        
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        
        //View를 리턴하기 직전 실햄 됨
        
        //현재 시간을 구한다.
        long currentTime = System.currentTimeMillis();
        
        // 요청이 시작된 시간을 가져온다
        long beginTime = (long)request.getAttribute("bTime");
        
        // 현재 시간에서 요청이 시작된 시간을 뺀다.
        // --> 총 처리 시간을 구한다.
        
        long processedTime = currentTime - beginTime;
        
        /*
        logger.trace("Trace 입니다.");
        logger.debug("Debug 입니다.");
        logger.info("Info 입니다.");
        logger.warn("Warn 입니다.");
        logger.error("Error 입니다.");
        */
        
        logger.info("요청된 URL : " +request.getRequestURI());
        logger.info("총 처리 시간은 "+processedTime);
        super.afterCompletion(request, response, handler, ex);
    }
}
 
cs

 

src/main/java -> com.ktds.mcjang -> intercept -> LoginInterceptor.java

package com.ktds.mcjang.intercept;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
public class LoginInterceptor extends HandlerInterceptorAdapter {
 
    
    private static Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    
    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
    
        // 사용자가 어디 페이지에서 왔는지 보여준다.
        String refererURL = request.getHeader("referer");
        logger.info(refererURL);
        
        HttpSession session = request.getSession();
        if(session.getAttribute("_MEMBER_"== null){
 
            //response.sendRedirect(refererURL);
                    
            // 세션이 없으면 write 페이지(로그인 페이지로 가정)로 돌아가라.
            response.sendRedirect("http://localhost:8080/TestMVC/write");
            
            // return false 꼭 써줘야 되 
            // return false만 하면 ds에서 컨트롤러로 안가고 다시 ds로 돌아가 아무 화면도 안나옴.
            return false;
        }
        return true;
    }
}
 
cs

src -> main -> webapp -> WEB-INF ->  config -> spring -> dispatcherServlet.xml

<mvc:interceptors>
    <!--  여러 개 interceptor를 쓸 수 있다. 순서는 위에서 아래로-->
    
    <bean class="com.ktds.mcjang.intercept.Measuringinterceptor" id="measuringinterceptor"/>
    
    <mvc:interceptor>
        <mvc:mapping path="/detail/**/"/>
        <mvc:mapping path="/list"/>
        <!-- write를 login으로 가정하고. write와 doWrite는 loginInterceptor에서 제외-->
        <mvc:exclude-mapping path="/write"/>
        <mvc:exclude-mapping path="/doWrite"/>
        <bean class="com.ktds.mcjang.intercept.LoginInterceptor" id="loginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>
cs

 

 

 

 

 

 

반응형