package com.app.util; import java.util.Locale; import java.util.Properties; import javax.servlet.http.HttpServletRequest; import org.springframework.context.MessageSource; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.core.io.support.PropertiesLoaderUtils; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import com.util.StringUtil; import lombok.extern.slf4j.Slf4j; /** * 웹 관련 유틸 클래스 * * @author STEVE */ @Slf4j public class WebUtil { /** * 현재 request url 에서 [http(s)프로토콜 부터 도메인까지]를 substring 한 문자열을 리턴한다. * * - PDF에 링크가 존재할 경우, 브라우저 호출이 가능하도록 하기 위해서 작성한 메서드 * - 최초 SharedService 에 작성하려고 했었으나, HttpServletRequest 에 대한 dependencies 가 존재하지 않아서 그냥 간단한 유틸로 작성함. */ public static String getUrlPrefix(HttpServletRequest request) { return request.getRequestURL().toString().replaceAll("^(https?:\\/\\/)(.+?)(\\/.*)$", "$1$2"); } /** * 특정 프로퍼티의 값을 static way로 조회/리턴 * * - Spring DI 를 사용할 수 없을 경우에 사용한다. * - File I/O가 발생할 수 있으므로 퍼포먼스가 중요한 로직에는 사용하지 말 것. * * @param name * @return */ public static String getProperty(String name) { String ret = ""; try { Resource resource = new ClassPathResource("/META-INF/spring/dataweb-infra.properties"); Properties props = PropertiesLoaderUtils.loadProperties(resource); ret = props.getProperty(name); } catch (Exception e) { e.printStackTrace(); } return ret; } /** * context root 의 물리경로 반환 * * @param request * @return */ public static String getCtxRootPath(HttpServletRequest request) { return request.getServletContext().getRealPath("/"); } /** * 현재 WAS가 로컬서버인지 운영서버인지 판단하여 구분값을 리턴 * * @return */ public static String getServerType() { return StringUtil.isBlank(System.getProperty("proxy.server")) ? "LOCAL" : "PRD"; } /** * 모바일기기로부터 온 요청일 경우 true, 아니면 false 리턴 * * @param request * @return */ public static boolean isMobileRequest(HttpServletRequest request) { String userAgent = StringUtil.trim(request.getHeader("user-agent")); log.debug("## userAgent: [{}]", userAgent); return userAgent.contains("Mobi"); // 'Mobi'를 식별자로 사용 } /** * HttpServletRequest를 static way로 획득 * * @return */ public static HttpServletRequest getCurrentHttpRequest(){ RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes(); if (requestAttributes instanceof ServletRequestAttributes) { HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest(); return request; } log.debug("HttpReqest가 존재하지 않는 context 에서 getCurrentHttpRequest()가 호출되었습니다."); return null; } /** * request parameter 'lang'을 찾아서 Locale 객체를 생성/리턴한다. * * @return */ public static Locale getRequestLocale() { String lang = WebUtil.getCurrentHttpRequest().getParameter("lang"); lang = StringUtil.isNotBlank(lang) ? lang : "ko"; // 기본값 ko return new Locale(lang); } /** * MessageSource 를 static way로 획득 * * @return */ public static MessageSource getMessageSource() { return ContextProvider.getBean(MessageSource.class); } /** * application-messages*.properties 파일의 문자열 획득 * * @param msgCode * @param args * @return */ public static String getMessage(String msgCode, Object[] args) { return getMessageSource().getMessage(msgCode, args, getRequestLocale()); } public static String getMessage(String msgCode) { return getMessage(msgCode, null); } }