프로그래밍/- eGov

post 통신으로 sso

즐겁게 하하하 2022. 10. 31. 10:26
728x90
	@RequestMapping(value = "/api/testNs.do", method = {RequestMethod.POST, RequestMethod.GET} , consumes = {"application/x-www-form-urlencoded"} ) 
	public ModelAndView testNs( @RequestParam Map<String, String> getParam , HttpServletRequest request , SessionVO sessionVO , SearchVO searchVO ) throws Exception {
			
		ModelAndView model = new ModelAndView();
		String sRemoteClientIP = EgovClntInfo.getClntIP(request);
	
		// 연동대상 자동 로그인 연동   
		System.out.println("===== /api/testNs.do getParam =====" + getParam.toString() );  
		
		String ParamData = "{ \"user\" : \"" + (String) getParam.get("user") + "\", \"token\" : \""+ (String) getParam.get("token") +"\" }"; //json 형식 데이터
		String url = "https://연동대상";
		
		// 연동대상 회원정보 요청
		String returnData = httpsPostBodyConnectionAndAutoLogin(url, ParamData); 
		
		//JSON 타입으로 변경
		JSONParser parser = new JSONParser();       
		JSONObject jsonObject = (JSONObject) parser.parse(returnData);  
		
		//username 과 member_no로 password 를 찾는다. 
		Map<String, Object> userMap = new HashMap<String, Object>();
		userMap.put("userId", jsonObject.get("username") );
		userMap.put("memberNo", jsonObject.get("member_no") );
		userMap.put("useAt","Y");	// 사용중인 회원만 
		EgovMap rUserVO = cmmnService.select("user.selectUser", userMap); // 사용자 정보 조회  
		
		if( rUserVO != null ) {
		
			// 회사 정보 조회
			SearchVO searchVo = new SearchVO(); 
			searchVo.setTenancyId( (String)rUserVO.get("tenancyId") );
			EgovMap corpInfo = cmmnService.select("corp.selectCorpInfo", searchVo);
			  
			 // 세션저장객체 생성            
            sessionVO.setsLoginId((String) rUserVO.get("userId"));
			sessionVO.setsLoginPwd((String) rUserVO.get("userPwd"));
			sessionVO.setsMemberNo((String) rUserVO.get("memberNo"));
			sessionVO.setsLoginNm((String)rUserVO.get("userNm"));    			
			sessionVO.setsAuthId((String)rUserVO.get("authId"));
			sessionVO.setsAuthNm((String)rUserVO.get("authNm"));
			sessionVO.setsPhnNum((String)rUserVO.get("phnNum"));
			sessionVO.setsCelNum((String)rUserVO.get("celNum"));
			sessionVO.setViewTime(propertiesService.getString("viewTime")); 
			sessionVO.setTenancyId((String) rUserVO.get("tenancyId")); // 2022-09-02 : 공장별 스키마명 sTenancyId
			 
			sessionVO.setSchemaNm((String) corpInfo.get("corpSchemaName"));
			sessionVO.setsCorpServiceStatus( (Integer)corpInfo.get("corpServiceStatus") );
			sessionVO.setsCorpNm((String)corpInfo.get("corpNm"));
			sessionVO.setsCorpId((String)corpInfo.get("corpId"));
			sessionVO.setSanctNm((String)corpInfo.get("sanctNm")); 
			
			// 메뉴
        	searchVO.setsAuthId( (String)rUserVO.get("authId") );
        	searchVO.setSchemaNm( (String) corpInfo.get("corpSchemaName") );
    		List<?> menuList = cmmnService.selectList("main.selectMainMenuList", searchVO);
    		sessionVO.setsMenuList(menuList);
    		
    		// 로그인 이력
    		EgovMap userLoginMap = new EgovMap();
	    	userLoginMap.put("userId",sessionVO.getsLoginId());
	    	userLoginMap.put("tenancyId",sessionVO.getTenancyId());
    		String loginSeq = cmmnService.selectStr("userLogin.selectUserLoginMaxSeq", userLoginMap);
			sessionVO.setsLoginSeq(loginSeq);
			
			double d = Double.parseDouble(loginSeq);
        	userLoginMap.put("seq", (int)d);	            	
        	userLoginMap.put("loginIp", sRemoteClientIP);
        	userLoginMap.put("loginYn", "Y");
        	cmmnService.insert("userLogin.insertUserLogin", userLoginMap);
        	
        	// 로그인 실패 이력 초기화 
        	cmmnService.update("user.updateLoginFailureInit", userLoginMap);
        	
        	SmartConstants.gWEBURLPATH = propertiesService.getString("urlStorePath") + sessionVO.getSchemaNm() + "/img/";		// Web Image Url Path
			SmartConstants.gIMGURLPATH = propertiesService.getString("imageUrlPath") + sessionVO.getSchemaNm() + "/file/";		// 첨부파일 Image Url Path 
     		 
			//sessionVO null 이면 SmartInterceptor 에서 login.do Redirect
			request.getSession().setAttribute("sessionVO", sessionVO);  
	        model.setViewName("redirect:/index.do");
		}
		
    	return model;			      
	}
	
	// 대상 에게 user 와 token 전달하여 사용자 정보 받기  {"member_no":"00000062","username":"adminbb"}
	public static String httpsPostBodyConnectionAndAutoLogin(String UrlData, String ParamData ){
		
		//http 요청 시 필요한 url 주소를 변수 선언
		String totalUrl = "";
		totalUrl = UrlData.trim().toString();
		
		//http 통신을 하기위한 객체 선언 실시
		URL url = null;
		HttpsURLConnection conn = null;
	    
		//http 통신 요청 후 응답 받은 데이터를 담기 위한 변수
		String responseData = "";	    	   
		BufferedReader br = null;
		StringBuffer sb = null;
	    
		//메소드 호출 결과값을 반환하기 위한 변수
		String returnData = "";
	 
		try {
			//파라미터로 들어온 url을 사용해 connection 실시
			url = new URL(totalUrl);	
			conn = (HttpsURLConnection) url.openConnection();
	        
			//http 요청에 필요한 타입 정의 실시
			conn.setRequestMethod("POST");
			conn.setRequestProperty("Content-Type", "application/json; utf-8"); //post body json으로 던지기 위함
			conn.setRequestProperty("Accept", "application/json");
			conn.setDoOutput(true); //OutputStream을 사용해서 post body 데이터 전송
			try (OutputStream os = conn.getOutputStream()){
				byte request_data[] = ParamData.getBytes("utf-8");
				os.write(request_data);
				os.close();
			}
			catch(Exception e) {
				e.printStackTrace();
			}										        	            
	        
			//http 요청 실시
			conn.connect();
			System.out.println("https 요청 방식 : "+"POST BODY JSON");
			System.out.println("https 요청 타입 : "+"application/json");
			System.out.println("https 요청 주소 : "+ UrlData);
			System.out.println("https 요청 데이터 : "+ ParamData);
			System.out.println("");
	        
			//http 요청 후 응답 받은 데이터를 버퍼에 쌓는다
			br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));	
			sb = new StringBuffer();	       
			while ((responseData = br.readLine()) != null) {
				sb.append(responseData); //StringBuffer에 응답받은 데이터 순차적으로 저장 실시
			}
			
			//메소드 호출 완료 시 반환하는 변수에 버퍼 데이터 삽입 실시
			returnData = sb.toString(); 
			
			//http 요청 응답 코드 확인 실시
			String responseCode = String.valueOf(conn.getResponseCode());
			System.out.println("https 응답 코드 : "+ responseCode);
			System.out.println("https 응답 데이터 : "+ returnData);
			   
		} catch (IOException e) {
			e.printStackTrace();
		} finally { 
			//http 요청 및 응답 완료 후 BufferedReader를 닫아줍니다
			try {
				if (br != null) {
					br.close();	
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return returnData;	 		
	}
728x90