Jelajahi Sumber

Custom Error 구현

gagamel 4 tahun lalu
induk
melakukan
587c820468

+ 23 - 27
src/main/java/com/style24/scm/support/controller/TssErrorController.java

@@ -3,11 +3,10 @@ package com.style24.scm.support.controller;
 import javax.servlet.RequestDispatcher;
 import javax.servlet.http.HttpServletRequest;
 
+import org.springframework.boot.web.servlet.error.ErrorController;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
 import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.servlet.ModelAndView;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -15,51 +14,48 @@ import com.gagaframework.web.rest.server.GagaResponseStatus;
 
 /**
  * Error Controller
+ * 		Disabling the Whitelabel Error Page
+ * 		- application.yml 파일에 다음을 추가
+ * 			server.error.path: /error
+ * 			server.error.whitelabel.enabled: false
  * 
  * @author gagamel
  * @since 2020. 10. 5
  */
 @Controller
 @Slf4j
-@RequestMapping(value = "/error")
-public class TssErrorController extends TssBaseController {
+public class TssErrorController implements ErrorController {
 
 	/**
-	 * Error
+	 * 이 메서드는 스프링 부트 2.3.x부터 deprecated됨.
+	 * 이 메서드 대신 custom path를 지정하려면 server.error.path 속성으로 지정해야 한다.
 	 */
-	@GetMapping("/500")
-	public ModelAndView error(HttpServletRequest request) throws HttpRequestMethodNotSupportedException {
-		ModelAndView mav = new ModelAndView("error/500");
+	@Override
+	public String getErrorPath() {
+		return null;
+	}
 
+	/**
+	 * Error
+	 */
+	@GetMapping("/error")
+	public String error(HttpServletRequest request) throws HttpRequestMethodNotSupportedException {
 		Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
 
 		if (status != null) {
 			Integer statusCode = Integer.valueOf(status.toString());
-			log.debug("statusCode: {}", statusCode);
+			log.error("Error StatusCode: {}", statusCode);
 
 			if (statusCode == GagaResponseStatus.NOT_FOUND.getCode()) {
-				mav.addObject("status", GagaResponseStatus.NOT_FOUND.getCode());
-				mav.addObject("message", "No mapping found for HTTP request with URI ["
-					+ String.valueOf(request.getAttribute(RequestDispatcher.FORWARD_REQUEST_URI)) + "]");
-
-				return mav;
+				return "error/404";
+			} else if (statusCode == GagaResponseStatus.UNAUTHORIZED.getCode()) {
+				return "error/nosession";
 			}
 		}
 
-		mav.addObject("status", GagaResponseStatus.INTERNAL_SERVER_ERROR.getCode());
-		mav.addObject("message", String.valueOf(request.getAttribute(RequestDispatcher.ERROR_MESSAGE)));
-
-		return mav;
-	}
-
-	@GetMapping("/noSession")
-	public ModelAndView noSession(HttpServletRequest request) throws HttpRequestMethodNotSupportedException {
-		ModelAndView mav = new ModelAndView("error/500");
-
-		mav.addObject("status", GagaResponseStatus.UNAUTHORIZED.getCode());
-		mav.addObject("message", String.valueOf(request.getAttribute(RequestDispatcher.ERROR_MESSAGE)));
+		log.error("Error Message: {}", request.getAttribute(RequestDispatcher.ERROR_MESSAGE));
 
-		return mav;
+		return "error/500";
 	}
 
 }

+ 4 - 2
src/main/java/com/style24/scm/support/interceptor/TssDefaultInterceptor.java

@@ -8,12 +8,13 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.ModelAndView;
 import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
 
-import com.style24.core.support.exception.TscNoSessionException;
 import com.style24.core.support.message.TscMessageByLocale;
 import com.style24.scm.support.security.session.TssSession;
 
 import lombok.extern.slf4j.Slf4j;
 
+import com.gagaframework.web.rest.server.GagaResponseStatus;
+
 /**
  * 모든 Request에 대해 세션 확인
  * 
@@ -46,7 +47,8 @@ public class TssDefaultInterceptor extends HandlerInterceptorAdapter {
 				// Ajax call은 status 세팅 후 ajax.status == 901일 경우 로그인 페이지로 이동 처리
 				response.setStatus(901); // No Session
 			} else { // Submit
-				throw new TscNoSessionException(message.getMessage("LOGN_0003"));
+//				throw new TscNoSessionException(message.getMessage("LOGN_0003"));
+				response.sendError(GagaResponseStatus.UNAUTHORIZED.getCode(), message.getMessage("LOGN_0003"));
 			}
 
 			return false;

+ 10 - 2
src/main/resources/config/application.yml

@@ -12,9 +12,17 @@ spring:
             max-file-size: 30MB
             max-request-size: 30MB
 
-server.site.name: scm
+server:
+    error:
+        path: /error #오류 응답을 처리할 Handler의 경로
+        whitelabel.enabled: false
+#    servlet:
+#        session:
+#            cookie:
+#                name: WSESSIONID
+#                secure: true
 
-server.error.whitelabel.enabled: false
+server.site.name: scm
 
 # 사방넷 API
 sabangnet:

+ 55 - 0
src/main/webapp/WEB-INF/views/error/404.html

@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="common/layout/error">
+<!--
+ *******************************************************************************
+ * @source  : 404.html
+ * @desc    : 404 Error Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.08.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<head>
+	<title>404 Error</title>
+</head>
+
+<body>
+
+<div layout:fragment="content">
+	<div class="errImg">
+		<div>
+			<i class="fa fa-television" aria-hidden="true"></i>
+			<i class="fa fa-info" aria-hidden="true"></i>
+		</div>
+	</div>
+	<ul class="errTxt">
+		<li class="ttl">원하시는 페이지를 찾을 수가 없습니다.</li>
+		<li class="cont">
+			주소가 잘못 입력되었거나, 변경 혹은 삭제되어<br/>
+			요청하신 페이지를 찾을 수가 없습니다.<br/>
+			입력하신 주소가 정확한지 다시 한 번 확인해 주시기 바랍니다.
+		</li>
+		<li class="tel">
+			문의 : 크리스F&C(주) 고객센터 (080-001-1270)
+		</li>
+	</ul>
+	<div class="errBtn">
+		<a href="#" th:href="@{/}" class="btn">Home</a>
+	</div>
+
+<script type="text/javascript">
+/*<![CDATA[*/
+/*]]>*/
+</script>
+
+</div>
+
+</body>
+</html>

+ 8 - 6
src/main/webapp/WEB-INF/views/error/500.html

@@ -8,12 +8,12 @@
  * @source  : 500.html
  * @desc    : 500 Error Page
  *============================================================================
- * STYLE24
- * Copyright(C) 2020 TSIT, All rights reserved.
+ * CREAS
+ * Copyright(C) 2021 TSIT, All rights reserved.
  *============================================================================
  * VER  DATE         AUTHOR      DESCRIPTION
  * ===  ===========  ==========  =============================================
- * 1.0  2020.10.06   gagamel     최초 작성
+ * 1.0  2021.08.20   gagamel     최초 작성
  *******************************************************************************
  -->
 <head>
@@ -30,12 +30,14 @@
 		</div>
 	</div>
 	<ul class="errTxt">
-		<li class="ttl" th:text="${message}">Internal Server Error</li>
+		<li class="ttl">서비스 이용이 원활하지 않습니다.</li>
 		<li class="cont">
-			서버가 요청을 완료할 수 없는 예기치 않은 오류가 발생했습니다.
+			기술적인 문제로 인해 예기치 않은 오류가 발생했습니다.<br/>
+			서비스 이용에 불편을 끼쳐 드려 죄송합니다.<br/>
+			잠시 후 해당 서비스를 이용해 주시기 바랍니다.
 		</li>
 		<li class="tel">
-			문의 : 스타일24(주) 고객센터 (1544-5336)
+			문의 : 크리스F&C(주) 고객센터 (080-001-1270)
 		</li>
 	</ul>
 	<div class="errBtn">

+ 54 - 0
src/main/webapp/WEB-INF/views/error/nosession.html

@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html lang="ko"
+	xmlns:th="http://www.thymeleaf.org"
+	xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
+	layout:decorator="common/layout/error">
+<!--
+ *******************************************************************************
+ * @source  : nosessioin.html
+ * @desc    : No Session Error Page
+ *============================================================================
+ * STYLE24
+ * Copyright(C) 2021 TSIT, All rights reserved.
+ *============================================================================
+ * VER  DATE         AUTHOR      DESCRIPTION
+ * ===  ===========  ==========  =============================================
+ * 1.0  2021.08.20   gagamel     최초 작성
+ *******************************************************************************
+ -->
+<head>
+	<title>No Session Error</title>
+</head>
+
+<body>
+
+<div layout:fragment="content">
+	<div class="errImg">
+		<div>
+			<i class="fa fa-television" aria-hidden="true"></i>
+			<i class="fa fa-info" aria-hidden="true"></i>
+		</div>
+	</div>
+	<ul class="errTxt">
+		<li class="ttl">세션 만료</li>
+		<li class="cont">
+			세션이 만료되어 서비스 이용이 불가능합니다.<br/>
+			로그인 후 서비스를 이용해 주시기 바랍니다.
+		</li>
+		<li class="tel">
+			문의 : 크리스F&C(주) 고객센터 (080-001-1270)
+		</li>
+	</ul>
+	<div class="errBtn">
+		<a href="#" th:href="@{/}" class="btn">Home</a>
+	</div>
+
+<script type="text/javascript">
+/*<![CDATA[*/
+/*]]>*/
+</script>
+
+</div>
+
+</body>
+</html>

+ 5 - 5
src/main/webapp/ux/plugins/gaga/gaga.validation.js

@@ -582,7 +582,7 @@ var gagajf = {
 					mcxDialog.alertC('세션이 없습니다. 로그인 페이지로 이동합니다.', {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							document.location.href = "/error/noSession";
+							document.location.href = "/";
 						}
 					});
 				}
@@ -659,7 +659,7 @@ var gagajf = {
 					mcxDialog.alertC('세션이 없습니다. 로그인 페이지로 이동합니다.', {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							document.location.href = "/error/noSession";
+							document.location.href = "/";
 						}
 					});
 				}
@@ -743,7 +743,7 @@ var gagajf = {
 					mcxDialog.alertC('세션이 없습니다. 로그인 페이지로 이동합니다.', {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							document.location.href = "/error/noSession";
+							document.location.href = "/";
 						}
 					});
 				}
@@ -825,7 +825,7 @@ var gagajf = {
 					mcxDialog.alertC('세션이 없습니다. 로그인 페이지로 이동합니다.', {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							document.location.href = "/error/noSession";
+							document.location.href = "/";
 						}
 					});
 				}
@@ -893,7 +893,7 @@ var gagajf = {
 					mcxDialog.alertC('세션이 없습니다. 로그인 페이지로 이동합니다.', {
 						sureBtnText: "확인",
 						sureBtnClick: function() {
-							document.location.href = "/error/noSession";
+							document.location.href = "/";
 						}
 					});
 				}