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>

 

2. dispatcher-servlet.xml 설정(프로젝트마다 파일이름이 다를 수 있다.)

 

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

 

3. AuthInterceptor.java 설정

 

public class AuthInterceptor extends HandlerInterceptorAdapter {
    /**
     * 세션에 계정정보(LoginVO)가 있는지 여부로 인증 여부를 체크한다. 계정정보(LoginVO)가 없다면, 로그인 페이지로 이동한다.
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        LoginVO loginVO = null;
       
        try {
            loginVO = (LoginVO) request.getSession().getAttribute("loginVO");

            if (loginVO != null && loginVO.getUserId() != null) {
                return true;
            } else {
                ModelAndView modelAndView = new ModelAndView("forward:/loginView.do");
                modelAndView.addObject("message", "세션이 만료되어 로그아웃 되었습니다. 다시 로그인 해주세요.");
                throw new ModelAndViewDefiningException(modelAndView);
            }
        } catch (Exception e) {
            ModelAndView modelAndView = new ModelAndView("forward:/loginView.do");
            modelAndView.addObject("message", "세션이 만료되어 로그아웃 되었습니다. 다시 로그인 해주세요.");
            throw new ModelAndViewDefiningException(modelAndView);
        }
    }

    /**
     * 세션에 메뉴권한(LoginVO.userGubun)을 가지고 메뉴를 조회하여 권한 여부를 체크한다.
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        LoginVO loginVO = null;
        String requestURI = request.getRequestURI();
       
        try {
         if(!"/loginView.do".equals(requestURI)) {
          loginVO = (LoginVO) request.getSession().getAttribute("loginVO");
          if (loginVO != null && loginVO.getUserId() != null) {
           SearchVO searchVO = new SearchVO();
           searchVO.setSchMenuUrl(requestURI);
           searchVO.setSchUserGubun(loginVO.getUserGubun());
           List<?> resultList = sysadmService.getSelectRollMenuCheckList(searchVO);
           
           if(resultList == null || resultList.size() == 0) {
                     ModelAndView mav = new ModelAndView("forward:/monitorView.do"); 
                     mav.addObject("message", "권한이 없습니다.");
                     throw new ModelAndViewDefiningException(mav);
           }
           
          } else {
           ModelAndView mav = new ModelAndView("forward:/loginView.do");
           mav.addObject("message", "세션이 만료되어 로그아웃 되었습니다. 다시 로그인 해주세요.");
           throw new ModelAndViewDefiningException(mav);
          }
         }
        } catch (Exception e) {
            ModelAndView mav = new ModelAndView("forward:/monitorView.do"); 
            mav.addObject("message", "권한이 없습니다.");
            throw new ModelAndViewDefiningException(mav);
        }    }
}

 

4. 현재 진행 중인 프로젝트엔 세션 권한별 접근 메뉴 체크가 없기에 비워놈... 언젠가는 추가할지도??

5. 동일한 환경으로 새로운 프로젝트를 시작하여 권한도 추가하였다.

반응형

ResourceBundle 클래스를 사용하여 properties 파일 정보를 읽어올 수 있다.

 

다음과 같은 파일이 있다면

 

경로 : WEB-INF/classes/egovframework/egovProps/IpInfoSample.properties

 

IpInfoSample.properties 파일 내용

 

#소켓IP정보

SocketIp=127.0.0.1

 

#소켓포트정보

SocketPort=5001 

 

아래와 같이 사용하여 정보를 읽어올 수 있다.

 

ResourceBundle mainResource = ResourceBundle.getBundle("egovframework.egovProps.IpInfoSample");

String SocketIp = mainResource.getString("SocketIp");

String SocketPort = mainResource.getString("SocketPort");

 

System.out.println("[SocketIp] : " + SocketIp);

System.out.println("[SocketPort] : " + SocketPort);

 

결과 :

[SocketIp] : 127.0.0.1
[SocketPort] : 5001

 

properties 파일의 모든 정보를 읽어야 한다면 아래와 같이 사용할수도 있다.

 

ResourceBundle mainResource = ResourceBundle.getBundle("egovframework.egovProps.IpInfoSample");  

Enumeration enm = mainResource.getKeys();

 

while(enm.hasMoreElements()){
    String key = (String) enm.nextElement();
    String value = mainResource.getString(key);


    System.out.println("[" + key + "] : " + value);
}

 

결과 :

[SocketIp] : 127.0.0.1
[SocketPort] : 5001

 

반응형

GPKI 서버 인증서가 만료되어 GPKI를 신규로 발급받아 설치 시 표준API 라이센스 파일(gpkiapi.lic)의 내용을 복사하여

 

~(Web Root)/gpkisecureweb/client/var.js

 

위 파일에 아래 라이센스변수 내용을 수정하고 서버를 돌렸는데 계속 라이센스 만료에러가 발생하였다.

 

var.js

 

ServerCert = "MIID5 ...."

 

결론은 gpkiapi.lic 파일의 라이센스를 Base64Encode 값으로 변환하여 ServerCert 변수에 세팅해야된다. 

 

<%@ page import="com.gpki.gpkiapi.storage.Disk" %>
<%@ page import="com.gpki.gpkiapi.util.Base64" %>
<%@ page import="com.gpki.gpkiapi.cert.X509Certificate" %>
<%
String SERVER_KM_CERT_PATH = "서버인증서파일경로/서버인증서파일(SVR_env.cer)";
Base64 base64 = new Base64();
byte[] bBase64 = null;
String strBase64 = "";
X509Certificate srvCert = Disk.readCert(SERVER_KM_CERT_PATH);
bBase64 = srvCert.getCert();
strBase64 = new String(base64.encode(bBase64));
%>

 

위 내용은 표준API설치가이드에서 제공하는 Base64Encode로 변환하는 가이드인데 저대로 하면 에러가 발생한다.^^;

 

변환하기전에 아래 소스를 먼저 선언하고 돌려야한다. 참고로 가이드문서는 jsp로 되어있지만 java로 돌리면 훨신 간편하다. ^-^

 

GpkiApi.init("/subinto/conf/"); //gpkiapi.lic 가 있는 경로
반응형

+ Recent posts