반응형

공통팀_개발일정_sample.xlsx

 

INDIRECT 함수를 활용하면 개발일정 엑셀 문서를 조금 더 다양하게 활용할 수 있다.

 

1.)참고 sheet

 -> 작업일수 함수 : =VLOOKUP(C2&D2,INDIRECT(E4&"!A2:H30",TRUE),6,FALSE)

 -> 중간결과 표시 : =VLOOKUP(C2&D2,홍길동!A2:H30,6,FALSE)

 

구분 대메뉴 중메뉴 소메뉴 담당자 작업일수 시작일 완료일
외부 평가관리 평가위원정보 평가위원신청 일지매 3 2018-01-13 2018-01-16
      평가이력 조회 일지매 5 2018-01-17 2018-01-23
  협약 및 수행관리 장비관리 도입장비 현황 홍길동 5 2018-01-13 2018-01-18
      장비활용 실적관리 홍길동 15 2018-01-19 2018-02-08
  고유사업관리 우수기술 공고목록 마동탁 11 2018-01-13 2018-01-26
      접수목록 마동탁 4 2018-01-29 2018-02-01

 

2) 홍길동 sheet

 

참조용 구분 대메뉴 중메뉴 소메뉴 작업일수 시작일 완료일
장비관리도입장비 현황 내부 협약 및 수행관리 장비관리 도입장비 현황 5 2018-01-13 2018-01-18
장비활용 실적관리       장비활용 실적관리 15 2018-01-19 2018-02-08

 

개발팀원별로 자기 이름 시트에서 일정을 작성하면 "참고" sheet에서는 자동으로 해당 일정이 표시된다.

반응형
반응형

GPKI 인증서 로그인 기능을 구현하려고 하는 경우에는 EgovLoginController.java를 다음과 같이 변경한다.

  • 로그인 화면 처리 부분을 다음과 같이 수정한다.
public String loginUsrView(@ModelAttribute("loginVO") LoginVO loginVO,
    HttpServletRequest request,
    HttpServletResponse response,
    ModelMap model) 
    throws Exception {
	// # GPKI 인증을 처리하는 경우 
	GPKIHttpServletResponse gpkiresponse = null;
	GPKIHttpServletRequest gpkirequest = null;
 
	try{
 
		gpkiresponse=new GPKIHttpServletResponse(response); 
		gpkirequest= new GPKIHttpServletRequest(request);
		gpkiresponse.setRequest(gpkirequest);
		model.addAttribute("challenge", gpkiresponse.getChallenge());
		return "cmm/uat/uia/EgovLoginUsr";
 
	}catch(Exception e){
		return "cmm/egovError";
	}
}
  • 인증서 로그인 처리 부분을 다음과 같이 수정한다.
public String actionCrtfctLogin(@ModelAttribute("loginVO") LoginVO loginVO, 
    HttpServletRequest request,
    HttpServletResponse response,
    ModelMap model)
    throws Exception {
    	// # GPKI 인증을 처리하는 경우 
    	// 접속IP
    	String userIp = EgovClntInfo.getClntIP(request);
 
    	// 1. GPKI 인증
    	GPKIHttpServletResponse gpkiresponse = null;
	GPKIHttpServletRequest gpkirequest = null;
	String dn = "";
	try{
		gpkiresponse = new GPKIHttpServletResponse(response);
		gpkirequest = new GPKIHttpServletRequest(request);
		gpkiresponse.setRequest(gpkirequest);
		X509Certificate cert = null; 
 
		byte[] signData = null;
		byte[] privatekey_random = null;
		String signType = "";
		String queryString = "";
 
		cert = gpkirequest.getSignerCert();
		dn = cert.getSubjectDN();
 
		java.math.BigInteger b = cert.getSerialNumber();
		b.toString();
		int message_type =  gpkirequest.getRequestMessageType();
		if( message_type == gpkirequest.ENCRYPTED_SIGNDATA || 
		    message_type == gpkirequest.LOGIN_ENVELOP_SIGN_DATA ||
		    message_type == gpkirequest.ENVELOP_SIGNDATA || 
		    message_type == gpkirequest.SIGNED_DATA){
		    signData = gpkirequest.getSignedData();
		    if(privatekey_random != null) {
			privatekey_random   = gpkirequest.getSignerRValue();
		    }
		    signType = gpkirequest.getSignType();
		}       
		queryString = gpkirequest.getQueryString();
	}catch(Exception e){
		return "cmm/egovError";
	}
 
	// 2. 업무사용자 테이블에서 dn값으로 사용자의 ID, PW를 조회하여
	// 이를 일반로그인 형태로 인증하도록 함
	if (dn != null && !dn.equals("")) {
 
		loginVO.setDn(dn);
		LoginVO resultVO = loginService.actionCrtfctLogin(loginVO);
		if (resultVO != null && resultVO.getId() != null && 
		    !resultVO.getId().equals("")) {	
		    // 3. spring security 연동
		    return "redirect:/j_spring_security_check?j_username=" +
		           resultVO.getUserSe() + resultVO.getId() + 
			   "&j_password=" + resultVO.getUniqId();
		} else {
		    model.addAttribute("message", 
		                       egovMessageSource.getMessage("fail.common.login"));
		    return "cmm/uat/uia/EgovLoginUsr";
		}
	} else {
		model.addAttribute("message", 
		                   egovMessageSource.getMessage("fail.common.login"));
		return "cmm/uat/uia/EgovLoginUsr";
	}
}
반응형

+ Recent posts