package nlib.cmm; import java.lang.reflect.Method; import java.util.Base64; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.core.Authentication; import org.springframework.ui.ModelMap; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.support.RequestContextUtils; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import nlib.cmm.exception.ErrorMessage; import nlib.restful.service.DataApiResVO; import nlib.security.SecUserVO; import nlib.user.service.LoginService; import nlib.user.service.NlibLoginVO; import nlib.util.StringUtil; /** *
 * @Class Name : NlibCommonController.java
 * 
 * @Description : 컨트롤러의 공통적인 기능을 제공하는 컨트롤러 상위 클래스
 * 
 * 
 * @프로젝트명: 지방문화원 통합자료관리시스템 구축사업 (2021)
 *
 * 
* * @ ------------ -------- --------------------------- * @ 수정일 수정자 수정내용 * @ ------------ -------- --------------------------- * @ 2021. 7. 23. KNKIM 최초 생성 * * * @author 이씨플라자 * DIGITALSHIP KNKIM * @since 2021. 7. 23. * @version 1.0 * */ public class NlibCommonController { private static final Logger log = LoggerFactory.getLogger(NlibCommonController.class); @Resource(name = "loginService") private LoginService _loginService; private static final int INFO_ID_COUNCIL_CD = 1; /* 현재 지방문화원 코드를 지칭하는 식별자 */ private static final int INFO_ID_COUNCIL_NM = 2; /* 현재 지방문화원 명칭을 지칭하는 식별자 */ /** * 스프링 시큐리티 Authentication를 통해서 사용자로그인정보 NlibLoginVO를 리턴한다. * * @param authentication * @return */ public NlibLoginVO getNlibLoginVO(Authentication authentication) { if(authentication == null) return new NlibLoginVO(); return (NlibLoginVO)authentication.getPrincipal(); } public NlibLoginVO getNlibLoginVO(HttpServletRequest request) { Authentication auth = (Authentication)request.getUserPrincipal(); if(auth == null || !auth.isAuthenticated()) return new NlibLoginVO(); NlibLoginVO loginVO = (NlibLoginVO)auth.getPrincipal(); if(loginVO == null || StringUtil.isEmpty(loginVO.getMbInfoId())) return new NlibLoginVO(); return loginVO; } /** * 인증에 저장된 사용자 로그인 정보 VO의 값을 매개변수값으로 대체하여 저장하고 돌려 준다. * * @param request * @param newLoginVO * @return */ public NlibLoginVO replaceNlibLoginVO(HttpServletRequest request, NlibLoginVO newLoginVO) { if(newLoginVO == null) return null; Authentication auth = (Authentication)request.getUserPrincipal(); if(auth == null || !auth.isAuthenticated()) return new NlibLoginVO(); NlibLoginVO loginVO = getNlibLoginVO(request); if(loginVO == null) return null; if(!loginVO.getMbInfoId().equals(newLoginVO.getMbInfoId())) { log.error("replaceNlibLoginVO > 서로 다른 사용자 정보이므로 인증 LoginVO 정보를 변경할 수 없습니다."); return null; } // 값 복사작업 Method[] methods = NlibLoginVO.class.getMethods(); String mName; HashMap setterNames = new HashMap(); HashMap getterNames = new HashMap(); final String skipSetterList = "|setIp|setAlerted|setAuthorityList|"; for(Method m : methods) { mName = m.getName(); if(skipSetterList.contains(mName)) continue; //log.debug("NlibLoginVO : methods > " + m.getName()); if(mName.toUpperCase().startsWith("SET")) setterNames.put(mName, m); else if(mName.toUpperCase().startsWith("GET")) getterNames.put(mName, m); else if(mName.toUpperCase().startsWith("IS")) getterNames.put(mName, m); } String getterName; for(String setterName : setterNames.keySet()) { getterName = "get" + setterName.substring(3); Method setter = setterNames.get(setterName); Method getter = getterNames.get(getterName); if(setter != null && getter != null) { try { String oldValue = (String)getter.invoke(loginVO); String newValue = (String)getter.invoke(newLoginVO); setter.invoke(loginVO, getter.invoke(newLoginVO)); //log.debug("replaceNlibLoginVO > Method invoke : " + setterName + " : " + oldValue + " -> " + newValue); } catch(Exception e) { log.error("replaceNlibLoginVO > Method invoke error : " + setterName + ", " + getterName); e.printStackTrace(); } } } return loginVO; } /** * 사용자로그인정보 ID를 리턴한다. * 로그인하지 않은 경우, null을 리턴한다. * * @param request * @return */ public String getMbInfoId(HttpServletRequest request) { Authentication auth = (Authentication)request.getUserPrincipal(); if(auth == null || !auth.isAuthenticated()) return null; NlibLoginVO loginVO = (NlibLoginVO)auth.getPrincipal(); if(loginVO == null || StringUtil.isEmpty(loginVO.getMbInfoId())) return null; return loginVO.getMbInfoId(); } /** * 스프링 시큐리티 Authentication를 통해서 사용자로그인정보 SecUserVO를 리턴한다. * * @param authentication * @return */ public SecUserVO getSecLoginVO(Authentication authentication) { if(authentication == null) return null; return (SecUserVO)authentication.getPrincipal(); } public ResponseEntity makeResponseEntityJson(DataApiResVO resVO) { // Convert Json ObjectMapper mapper = new ObjectMapper(); String jsonStr = null; HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8"); try { jsonStr = mapper.writeValueAsString(resVO); log.debug("RETURN DATA > json:" + jsonStr); } catch (JsonProcessingException e) { ErrorMessage eMsg = new ErrorMessage("ERR_JSON_CONVERT", "응답객체를 JSON으로 변환 처리 중 오류가 발생하였습니다. : " + e.toString()); try { jsonStr = mapper.writeValueAsString(eMsg); } catch (JsonProcessingException ee) {} e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).headers(headers).body(jsonStr); } return ResponseEntity.ok().headers(headers).body(jsonStr); } public ResponseEntity makeResponseEntityJson(List> list) { // Convert Json ObjectMapper mapper = new ObjectMapper(); String jsonStr = null; HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8"); try { jsonStr = mapper.writeValueAsString(list); log.debug("RETURN DATA > json:" + jsonStr); } catch (JsonProcessingException e) { ErrorMessage eMsg = new ErrorMessage("ERR_JSON_CONVERT", "응답객체를 JSON으로 변환 처리 중 오류가 발생하였습니다. : " + e.toString()); try { jsonStr = mapper.writeValueAsString(eMsg); } catch (JsonProcessingException ee) {} e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).headers(headers).body(jsonStr); } return ResponseEntity.ok().headers(headers).body(jsonStr); } public ResponseEntity makeResponseEntityJson(HashMap retMap) { // Convert Json ObjectMapper mapper = new ObjectMapper(); String jsonStr = null; HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_TYPE, "application/json; charset=UTF-8"); try { jsonStr = mapper.writeValueAsString(retMap); log.debug("RETURN DATA > json:" + jsonStr); } catch (JsonProcessingException e) { ErrorMessage eMsg = new ErrorMessage("ERR_JSON_CONVERT", "응답객체를 JSON으로 변환 처리 중 오류가 발생하였습니다. : " + e.toString()); try { jsonStr = mapper.writeValueAsString(eMsg); } catch (JsonProcessingException ee) {} e.printStackTrace(); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).headers(headers).body(jsonStr); } return ResponseEntity.ok().headers(headers).body(jsonStr); } public ModelMap addParamsToModel(Map paramMap, ModelMap model) { return addParamsToModel(paramMap, model, null, null); } public ModelMap addParamsToModel(Map paramMap, ModelMap model, String upperMapName, String itemNames) { if(paramMap == null || paramMap.size() < 1) return model; if(model == null) return model; String filter = null; if(StringUtil.isNotEmpty(itemNames)) { filter = "," + itemNames + ","; filter = filter.replaceAll(" ", ""); } boolean existUpperMap = StringUtil.isNotEmpty(upperMapName); Map uppperMap = null; if(existUpperMap) uppperMap = new HashMap(); for(String key : paramMap.keySet()) { if(filter != null && !filter.contains("," + key + ",")) { continue; } if(existUpperMap) { uppperMap.put(key, paramMap.get(key)); } else { model.addAttribute(key, paramMap.get(key)); } } if(existUpperMap) model.addAttribute(upperMapName, uppperMap); return model; } public RedirectAttributes addParamsToRedirect(Map paramMap, RedirectAttributes redirectAttrs) { return addParamsToRedirect(paramMap, redirectAttrs, null, null); } public RedirectAttributes addParamsToRedirect(Map paramMap , RedirectAttributes redirectAttrs , String upperMapName , String itemNames) { if(paramMap == null || paramMap.size() < 1) return redirectAttrs; if(redirectAttrs == null) return redirectAttrs; String filter = null; if(StringUtil.isNotEmpty(itemNames)) { filter = "," + itemNames + ","; filter = filter.replaceAll(" ", ""); } boolean existUpperMap = StringUtil.isNotEmpty(upperMapName); Map uppperMap = null; if(existUpperMap) uppperMap = new HashMap(); for(String key : paramMap.keySet()) { if(filter != null && !filter.contains("," + key + ",")) { continue; } if(existUpperMap) { uppperMap.put(key, paramMap.get(key)); } else { redirectAttrs.addFlashAttribute(key, paramMap.get(key)); } } if(existUpperMap) redirectAttrs.addFlashAttribute(upperMapName, uppperMap); return redirectAttrs; } /** * paramMap에 이전 요청에서 전달할 때 추가한 POST방식의 매개변수값을 paramMap에 추가한다. * * @param paramMap * @param req */ public void addParamFromInputFlash(Map paramMap, HttpServletRequest req) { if(req == null) return; Map inFlashMap = (Map)RequestContextUtils.getInputFlashMap(req); if(inFlashMap == null || inFlashMap.size() < 1) return; if(paramMap == null) paramMap = new HashMap(); for(String key : inFlashMap.keySet()) { String value = inFlashMap.get(key); if(StringUtil.isNotEmpty(value)) { paramMap.put(key, value); } } return; } /** * 현재 요청(또는 세션)하고 있는 지방문화원 코드를 리턴한다. * * @param request * @return */ private String getCurCouncilInfo(HttpServletRequest request, int which) { HttpSession session = request.getSession(); String councilInfo = (String)session.getAttribute( (which == INFO_ID_COUNCIL_CD ? "curCouncilCd" : "curCouncilNm")); if(StringUtil.isNotEmpty(councilInfo)) { return councilInfo; } // 지방문화원 코드 확인 String curCouncilDnsHost = StringUtil.getHostName(request.getRequestURL().toString()); HashMap councilInfoMap = _loginService.selectCouncilInfoByDnsHost(curCouncilDnsHost); String curCouncilCd = councilInfoMap.get("councilCd"); String curCouncilNm = councilInfoMap.get("councilNm"); session.setAttribute("curCouncilNm", curCouncilNm); session.setAttribute("curCouncilCd", curCouncilCd); session.setAttribute("curCouncilDnsHost", curCouncilDnsHost); return which == INFO_ID_COUNCIL_CD ? curCouncilCd : curCouncilNm; } public String getCurCouncilCd(HttpServletRequest request) { return getCurCouncilInfo(request, INFO_ID_COUNCIL_CD); } public String getCurCouncilNm(HttpServletRequest request) { return getCurCouncilInfo(request, INFO_ID_COUNCIL_NM); } public void setAlerted(HttpServletRequest request, boolean alerted) { NlibLoginVO nlibLoginVO = getNlibLoginVO(request); if(nlibLoginVO == null) return; nlibLoginVO.setAlerted(alerted); return; } public boolean isAlerted(HttpServletRequest request) { NlibLoginVO nlibLoginVO = getNlibLoginVO(request); if(nlibLoginVO == null) return false; return nlibLoginVO.isAlerted(); } public String getParamStr(Map paramMap, String paramName) { return getParamStr(paramMap, paramName, null); } public String getParamStr(Map paramMap, String paramName, String defValue) { if(paramMap == null) return null; if(StringUtil.isEmpty(paramName)) return null; String value = (String)paramMap.get(paramName); return StringUtil.isEmpty(value) ? defValue : value; } }