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);
}
}