본문 바로가기

Spring 3/Interceptor

Spring MVC Interceptor

스프링 인터셉터를 이용하여 로그인 상태를 검사하는 예 ( Spring MVC Interceptor Authentication example )



로그인을 거친 이용자에게는 Controller 클래스의 getTime() 메소드가 기능을 할 수 있도록 하고 아니면 로그인 폼을 보여주는 예


WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">


    <!-- The definition of the Root Spring Container shared by all Servlets and Filters -->

    <context-param>

        <param-name>contextConfigLocation</param-name>

        <param-value>/WEB-INF/spring/root-context.xml</param-value>

    </context-param>


    <!-- Creates the Spring Container shared by all Servlets and Filters -->

    <listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

    </listener>


    <!-- Processes application requests -->

    <servlet>

        <servlet-name>appServlet</servlet-name>

        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>/WEB-INF/spring/servlet-context.xml</param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

    </servlet>


    <servlet-mapping>

        <servlet-name>appServlet</servlet-name>

        <url-pattern>/</url-pattern>

    </servlet-mapping>


    <filter>

<filter-name>encodingFilter</filter-name>

<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>UTF-8</param-value>

</init-param>

    </filter>

    <filter-mapping>

<filter-name>encodingFilter</filter-name>

<url-pattern>/*</url-pattern>

    </filter-mapping>


</web-app>



SampleController.java

package org.kdea.interceptor;


import java.util.Date;


import javax.servlet.http.HttpSession;


import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

import org.springframework.web.bind.annotation.RequestParam;

import org.springframework.web.bind.annotation.ResponseBody;


@Controller

public class SampleController {


@RequestMapping(value="/int/login", method=RequestMethod.GET)

public String login(){

return "interceptor/login_form";

}

@RequestMapping(value="/int/login", method=RequestMethod.POST)

public String login(@RequestParam String id,

@RequestParam String pwd,

HttpSession session){

if(id!=null && !id.equals("") && pwd!=null && !pwd.equals("")) {

session.setAttribute("login", true);

return "interceptor/login_success";

}

return "interceptor/login_fail";

}

@RequestMapping("/int/getTime")

@ResponseBody

public String getServerTime(){ // 로그인을 거친 사용자만 사용할 수 있도록 설정하려고 함

return new Date().toString();

}

}



서블릿 설정파일에 콘트롤러를 자동으로 찾을 수 있도록 설정하고 이용자의 요청 URL에 인터셉터를 연결한다

WEB-INF/spring/servlet-context.xml

................

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

        <beans:property name="prefix" value="/WEB-INF/views/" />

        <beans:property name="suffix" value=".jsp" />

        <beans:property name="contentType" value="text/html; charset=UTF-8"/>

</beans:bean>

................

<context:component-scan base-package="org.kdea.interceptor" />

.........

    .............

<interceptors>

    <interceptor>

<mapping path="/int/getTime"/>  <!-- /int/*  을 사용하여 모든 기능에 앞서 인터셉터가 호출되도록 할 수 있음 -->

         <beans:bean class="org.kdea.interceptor.AuthInterceptor" />

    </interceptor>

</interceptors>

.........



AuthInterceptor.java

package org.kdea.interceptor;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;


public class AuthInterceptor extends HandlerInterceptorAdapter {


@Override   // 콘트롤러에 앞서 실행됨

public boolean preHandle(HttpServletRequest request, 

HttpServletResponse response, Object handler) throws Exception {

if(request.getSession().getAttribute("login")==null){

response.sendRedirect("login"); // 콘트롤러에 선언된 login 요청으로 전환함

return false; // 다른 절차가 실행되지 않음

}

return true;          // 다른 인터셉터나 콘트롤러가 이후에 호출됨

}

@Override   // 콘트롤러 실행 후, 뷰 호출 전에 실행됨

public void postHandle(HttpServletRequest request,

HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception {

System.out.println("postHandle():after Controller, before View rendering");

}

@Override   // 뷰가 실행된 후에 실행됨

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception ex)

throws Exception {

System.out.println("afterCompletion():after View rendered");

}

}



WEB-INF/views/login_success.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>로그인 성공</title>

</head>

<body>

로그인에 성공했습니다<p>

Login success!

</body>

</html>



WEB-INF/views/login_fail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>로그인 실패</title>

</head>

<body>

로그인에 실패<p>

Login Failed!

</body>

</html>


WEB-INF/views/login_form.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>로그인 폼</title>

</head>

<body>

로그인 폼<p>

<form action="login" method="post">

ID <input type="text" name="id">

PWD <input type="password" name="pwd">

<input type="submit" value="Login">

</form>

</body>

</html>