web developer

[egov] dispacther-servlet.xml / 로그인 체크 Interceptors 설정 본문

Framework/Egovframework [spring]

[egov] dispacther-servlet.xml / 로그인 체크 Interceptors 설정

trueman 2024. 5. 28. 14:34
728x90
728x90

1. web.xml 설정

<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/config/egovframework/springmvc/dispatcher-servlet.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
	<servlet-name>action</servlet-name>
    <url-pattern>*.do</url-pattern>
</servlet-mapping>

2. dispacther-servlet.xml 설정

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**/*.do"/> <!-- 절대경로(/)부터 시작하면 중간경로가 있을 수 있기에 (**)으로 표시 -->
        <mvc:exclude-mapping path="/cmn/login/*.do"/> <!-- 예외 경로 지정 -->
        <mvc:exclude-mapping path="/mon/page/loginView.do"/> <!-- 예외 경로 지정 -->
        <bean class="egovframework.cmn.cmn.AuthenticInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

3. AuthenticInterceptor.xml 설정 // 세션인증방식

package com.example;

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

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

public class AuthenticInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        /* 
           여기서 로그인 체크 로직을 구현합니다.
           예를 들어, 세션을 확인하여 로그인 상태를 확인하고, 로그인되지 않은 경우에는 로그인 페이지로 리다이렉트합니다.
           이 메서드가 true를 반환하면 핸들러 실행을 계속하고, false를 반환하면 핸들러 실행을 중단합니다.
        */
        String requestURI = request.getRequestURI();
        HttpSession session = request.getSession();
        
    	LoginVO loginVO = (LoginVO) session.getAttribute("userinfo");
        if(loginVO != null) {
            session.setMaxInactiveInterval(60 * 60);
            return true;
        }else {
            String returnUrl = "";
      	    String loginUrl = "/portal/login.do";
            if(requestURI.equals("/menu/board/insert.do") {
            	returnUrl = "redirect:" + loginUrl + "DV=board";
            }else {
            	returnUrl = "redirect:" + loginUrl + "";
            }
            /*
               ajax 요청인 경우 403 에러 발생하고,
               아니면 "XMLHttpRequest"와 같은 AJAX 요청이 아닌 경우에는 특정 뷰를 보여주기 위해 
               ModelAndView 객체를 생성하고 ModelAndViewDefiningException을 던져서 
               해당 뷰를 렌더링하도록 합니다.
            */
            if ("XMLHttpRequest".equals(request.getHeader("x-request-with"))) {
                response.sendError(HttpServletResponse.SC_FORBIDDEN);
                return false;
            }else {
            	// returnUrl은 뷰의 이름이나 리다이렉트 URL을 정확하게 지정해야 합니다.
                ModelAndView modelAndView = new ModelAndView(returnUrl);
                throw new ModelAndViewDefiningException(modelAndView);
            }
        }
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // 핸들러 실행 후에 수행할 작업이 있다면 여기에 구현합니다.
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        // 요청 처리 완료 후에 수행할 작업이 있다면 여기에 구현합니다.
    }

}

참조 : https://subinto.tistory.com/77

728x90
728x90
Comments