개발페이지 순서는 아래와 같습니다.

 

1. id/pw 인증 ( otp/first )

테스트계정 : admin/1111

2. id/pw 인증성공하면 otp 생성 후 code 입력창으로 이동 ( otp/second )

위 QR코드나 secretKey는 구글OTP앱에서 계정등록시 필요합니다.

3. google otp 생성 코드 입력 후 2차 인증 확인 ( otp/third )

 

첨부소스는 위의 내용을 spring MVC project로 구현한것입니다. (maven + tomcat8 구성 )

testGoogleOtp_maven.zip
0.02MB

내부 구현된 소스는 아래 무중력고기님의 소스를 그대로 퍼와서 테스트해본 소스입니다.

 

https://zero-gravity.tistory.com/221

 

 

 



1. web.xml 에서 다음과 같이 처리합니다.

흔히 사용하던 jsp 경로 대신 REST uri경로를 그대로 사용합니다.

<error-page>

    <error-code>404</error-code>

    <location>/errors/404</location>

  </error-page>

  

  <error-page>

    <error-code>405</error-code>

    <location>/errors/405</location>

  </error-page>


2. ErrorController를 작성합니다.

package common.error


import java.util.HashMap;

import java.util.Map;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.http.HttpStatus;

import org.springframework.stereotype.Controller;

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

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

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

import org.springframework.web.servlet.ModelAndView;


@Controller

public class ErrorController {

private String RESULT_CODE = "result_code";

private String RESULT_MESSAGE = "result_message";

private String HEAD = "head";


@RequestMapping(value = "/errors/{errorCode}", method = RequestMethod.GET)

public ModelAndView error405(@PathVariable("errorCode") int errorCode, HttpServletRequest request, HttpServletResponse response) {

Map<String, Object> responseMap = new HashMap<String, Object>();

Map<String, Object> responseHeadMap = new HashMap<String, Object>();

                //넘겨받은 errorCode에 해당하는 HttpStatus Object를 가져옵니다.

HttpStatus httpStatus = HttpStatus.valueOf(errorCode); 

responseHeadMap.put(RESULT_CODE, httpStatus.value());

responseHeadMap.put(RESULT_MESSAGE, httpStatus.getReasonPhrase());

responseMap.put(HEAD, responseHeadMap);

/*

for (HttpStatus status :HttpStatus.values()) {

System.out.println(status.value() +"," + status.name()+"::" + status.getReasonPhrase());

}

*/

return new ModelAndView("jsonView", responseMap);

}

}


3. 결과는 다음과 같이 리턴합니다. (404/405, 500 등 각각의 error코드에 맞게 error메시지가 리턴됩니다.)

{

    "head": {

        "result_message": "Method Not Allowed",

        "result_code": 405

    }

}


P.S. 위의 리턴타입은 org.springframework.web.servlet.view.BeanNameViewResolver 를 이용하여 MappingJacksonJsonView를 선언하여 처리한 것입니다.

<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view. BeanNameViewResolver" />

<bean id="jsonView" class="org.springframework.web.servlet.view.json. MappingJacksonJsonView">





SEVERE: Error configuring application listener of class org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1714)
 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
 at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:532)
 at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:514)
 at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:133)
 at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727)
 at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285)
 at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
 at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
 at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
 at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)

 

 

eclipse에서 Tomcat 연동해서 실행을 시키는데, 멀쩡하던 프로젝트가 위와 같은 오류를 뱉어버리고는 구동되지 않는 현상이 발생합니다. 특히 maven plugin을 사용하는 프로젝트는 이런상황이 되면 더이상 진행 불가합니다.

 

천천히 오류메시지를 읽어내려가다 보면 기본 Spring 관련 ContextLoaderListener가 없다고 나옵니다. 뭔가 관련 클래스가 없는것이 확실합니다. 아니면 톰캣이 인식하지 못하고 있던가...

 

다음의 항목을 일단 체크해봅니다.

 

Project Explorer ==> 마우스 오른쪽 클릭 ==> Properties or Alt + Enter ==> Deployment Assembly

 

 

 

뭔가 있어야 할 위치에 있어야 할것이 없는것 같습니다. 뭐지? 잘 기억이 나지 않는다면 정상적으로 로딩되는 다른 유사한 프로젝트를 열어보십시오.

 

Maven Dependency 가 존재하지 않는다는 차이점을 발견할 것입니다. 왜 없어졌는지는 나중에 살펴보기로 하겠습니다.

 

 

 

Java Build Path Entiries 를 선택하고 NEXT 를 클릭합니다.

 

 

 

Maven Dependencies를 선택하고 Finish 를 클릭하면 완료가 됩니다.

 

 

 

이전에 없던 부분이 추가되었습니다.

 

이제 확인을 하고 다시 톰캣을 구동시켜보면 오류가 없어지고 정상적으로 로딩이 됨을 볼수 있습니다.

 

마찬가지로 다른 jar 관련 부분도 이런방식으로 추가합니다.

프로젝트별로 svn 구성을 다르게 하기도 하고 또 maven을 사용하지 않고 jar파일을 별도의 디렉토리에 넣어서 관리하곤 합니다. 이런경우에도 해당 디렉토리를  WEB-INF/lib 로 연결시켜주면 통캣이 로딩하면서 해당 jar를 인식하게 됩니다.

 

 

 

 



« PREV : 1 : 2 : 3 : 4 : 5 : NEXT »