WebUtil.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. package top.ibase4j.core.util;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.serializer.SerializerFeature;
  4. import org.apache.commons.lang3.StringUtils;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.web.util.WebUtils;
  8. import top.ibase4j.core.Constants;
  9. import javax.servlet.ServletResponse;
  10. import javax.servlet.http.Cookie;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletResponse;
  13. import javax.servlet.http.HttpSession;
  14. import java.io.BufferedReader;
  15. import java.io.IOException;
  16. import java.io.UnsupportedEncodingException;
  17. import java.net.InetAddress;
  18. import java.net.URLEncoder;
  19. import java.net.UnknownHostException;
  20. import java.util.List;
  21. import java.util.Map;
  22. import java.util.ResourceBundle;
  23. /**
  24. * Web层辅助类
  25. *
  26. * @author ShenHuaJie
  27. * @version 2016年4月2日 下午4:19:28
  28. */
  29. public final class WebUtil {
  30. private static Logger logger = LoggerFactory.getLogger(WebUtil.class);
  31. private WebUtil() {
  32. }
  33. /**
  34. * 获取指定Cookie的值
  35. *
  36. * @param request
  37. * @param cookieName
  38. * cookie名字
  39. * @param defaultValue
  40. * 缺省值
  41. * @return
  42. */
  43. public static final String getCookieValue(HttpServletRequest request, String cookieName, String defaultValue) {
  44. Cookie cookie = WebUtils.getCookie(request, cookieName);
  45. if (cookie == null) {
  46. return defaultValue;
  47. }
  48. return cookie.getValue();
  49. }
  50. /** 获取当前用户 */
  51. public static final Object getCurrentUser(HttpServletRequest request) {
  52. try {
  53. HttpSession session = request.getSession();
  54. if (null != session) {
  55. return session.getAttribute(Constants.CURRENT_USER);
  56. }
  57. } catch (Exception e) {
  58. logger.error("Session not found", e);
  59. }
  60. return null;
  61. }
  62. /** 保存当前用户 */
  63. public static final void saveCurrentUser(HttpServletRequest request, Object user) {
  64. setSession(request, Constants.CURRENT_USER, user);
  65. }
  66. /**
  67. * 将一些数据放到ShiroSession中,以便于其它地方使用
  68. * 比如Controller,使用时直接用HttpSession.getAttribute(key)就可以取到
  69. */
  70. public static final void setSession(HttpServletRequest request, String key, Object value) {
  71. HttpSession session = request.getSession();
  72. if (null != session) {
  73. session.setAttribute(key, value);
  74. }
  75. }
  76. /** 移除当前用户 */
  77. public static final void removeCurrentUser(HttpServletRequest request) {
  78. request.getSession().removeAttribute(Constants.CURRENT_USER);
  79. }
  80. /**
  81. * 获得国际化信息
  82. *
  83. * @param key
  84. * 键
  85. * @param request
  86. * @return
  87. */
  88. public static final String getApplicationResource(String key, HttpServletRequest request) {
  89. ResourceBundle resourceBundle = ResourceBundle.getBundle("ApplicationResources", request.getLocale());
  90. return resourceBundle.getString(key);
  91. }
  92. /**
  93. * 获得参数Map
  94. *
  95. * @param request
  96. * @return
  97. */
  98. public static final Map<String, Object> getParameterMap(HttpServletRequest request) {
  99. return WebUtils.getParametersStartingWith(request, null);
  100. }
  101. @SuppressWarnings("unchecked")
  102. public static Map<String, Object> getParameter(HttpServletRequest request) {
  103. String str, wholeStr = "";
  104. try {
  105. BufferedReader br = request.getReader();
  106. while ((str = br.readLine()) != null) {
  107. wholeStr += str;
  108. }
  109. if (StringUtils.isNotBlank(wholeStr)) {
  110. logger.info("request===>" + wholeStr);
  111. request.setAttribute("iBase4J.Parameters", wholeStr);
  112. try {
  113. return JSON.parseObject(wholeStr, Map.class);
  114. } catch (Exception e) {
  115. return XmlUtil.parseXml2Map(wholeStr);
  116. }
  117. }
  118. } catch (Exception e) {
  119. logger.error("", e);
  120. }
  121. logger.info("request===>" + JSON.toJSONString(request.getParameterMap()));
  122. return getParameterMap(request);
  123. }
  124. public static <T> T getParameter(HttpServletRequest request, Class<T> cls) {
  125. String str, wholeStr = "";
  126. try {
  127. BufferedReader br = request.getReader();
  128. while ((str = br.readLine()) != null) {
  129. wholeStr += str;
  130. }
  131. if (StringUtils.isNotBlank(wholeStr)) {
  132. logger.info("request===>" + wholeStr);
  133. request.setAttribute("iBase4J.Parameters", wholeStr);
  134. try {
  135. return JSON.parseObject(wholeStr, cls);
  136. } catch (Exception e) {
  137. return InstanceUtil.parse(wholeStr, cls);
  138. }
  139. }
  140. } catch (Exception e) {
  141. logger.error("", e);
  142. }
  143. logger.info("request===>" + JSON.toJSONString(request.getParameterMap()));
  144. return Request2ModelUtil.covert(cls, request);
  145. }
  146. @SuppressWarnings({"unchecked", "rawtypes"})
  147. public static <T> List<T> getParameters(HttpServletRequest request, Class<T> cls) {
  148. String str, wholeStr = "";
  149. try {
  150. BufferedReader br = request.getReader();
  151. while ((str = br.readLine()) != null) {
  152. wholeStr += str;
  153. }
  154. if (StringUtils.isNotBlank(wholeStr)) {
  155. logger.info("request===>" + wholeStr);
  156. List list = JSON.parseObject(wholeStr, List.class);
  157. List<T> resultList = InstanceUtil.newArrayList();
  158. for (Object map : list) {
  159. T t = (T)InstanceUtil.transMap2Bean((Map)map, cls);
  160. resultList.add(t);
  161. }
  162. request.setAttribute("iBase4J.Parameters", resultList);
  163. return resultList;
  164. }
  165. } catch (Exception e) {
  166. logger.error("", e);
  167. }
  168. logger.info("request===>" + JSON.toJSONString(request.getParameterMap()));
  169. return Request2ListUtil.covert(cls, request);
  170. }
  171. /** 获取客户端IP */
  172. public static final String getHost(HttpServletRequest request) {
  173. String ip = request.getHeader("X-Forwarded-For");
  174. if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
  175. ip = request.getHeader("Proxy-Client-IP");
  176. }
  177. if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
  178. ip = request.getHeader("WL-Proxy-Client-IP");
  179. }
  180. if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
  181. ip = request.getHeader("HTTP_CLIENT_IP");
  182. }
  183. if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
  184. ip = request.getHeader("HTTP_X_FORWARDED_FOR");
  185. }
  186. if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
  187. ip = request.getHeader("X-Real-IP");
  188. }
  189. if (StringUtils.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
  190. ip = request.getRemoteAddr();
  191. }
  192. if (ip != null && ip.indexOf(",") > 0) {
  193. //logger.info(ip);
  194. // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
  195. String[] ips = ip.split(",");
  196. for (String ip2 : ips) {
  197. String strIp = ip2;
  198. if (!"unknown".equalsIgnoreCase(strIp)) {
  199. ip = strIp;
  200. break;
  201. }
  202. }
  203. }
  204. if ("127.0.0.1".equals(ip) || "0:0:0:0:0:0:0:1".equals(ip)) {
  205. InetAddress inet = null;
  206. try { // 根据网卡取本机配置的IP
  207. inet = InetAddress.getLocalHost();
  208. } catch (UnknownHostException e) {
  209. logger.error("getCurrentIP", e);
  210. }
  211. if (inet != null) {
  212. ip = inet.getHostAddress();
  213. }
  214. }
  215. //logger.info("getRemoteAddr ip: " + ip);
  216. return ip;
  217. }
  218. /** 设置文件名 */
  219. public static void setResponseFileName(HttpServletRequest request, HttpServletResponse response,
  220. String displayName) {
  221. String userAgent = request.getHeader("User-Agent");
  222. boolean isIE = false;
  223. if (userAgent != null && userAgent.toLowerCase().contains("msie")) {
  224. isIE = true;
  225. }
  226. String displayName2;
  227. try {
  228. if (isIE) {
  229. displayName2 = URLEncoder.encode(displayName, "UTF-8");
  230. displayName2 = displayName2.replaceAll("\\+", "%20");// 修正URLEncoder将空格转换成+号的BUG
  231. response.setHeader("Content-Disposition", "attachment;filename=" + displayName2);
  232. } else {
  233. displayName2 = new String(displayName.getBytes("UTF-8"), "ISO8859-1");
  234. response.setHeader("Content-Disposition", "attachment;filename=\"" + displayName2 + "\"");// firefox空格截断
  235. }
  236. String extStr = displayName2.substring(displayName2.indexOf(".") + 1);
  237. if ("xls".equalsIgnoreCase(extStr)) {
  238. response.setContentType("application/vnd.ms-excel charset=UTF-8");
  239. } else {
  240. response.setContentType("application/octet-stream");
  241. }
  242. } catch (UnsupportedEncodingException e) {
  243. logger.error("设置文件名发生错误", e);
  244. }
  245. }
  246. /* 判断是否是白名单 */
  247. public static boolean isWhiteRequest(String url, int size, List<String> whiteUrls) {
  248. if (url == null || "".equals(url) || size == 0) {
  249. return true;
  250. } else {
  251. String refHost = url.toLowerCase();
  252. for (String urlTemp : whiteUrls) {
  253. if (refHost.contains(urlTemp.toLowerCase())) {
  254. return true;
  255. }
  256. }
  257. }
  258. return false;
  259. }
  260. /** 写出响应 */
  261. public static boolean write(ServletResponse response, Integer code, String msg) throws IOException {
  262. response.setContentType("application/json;charset=UTF-8");
  263. Map<String, Object> modelMap = InstanceUtil.newLinkedHashMap();
  264. modelMap.put("code", code.toString());
  265. modelMap.put("msg", msg);
  266. modelMap.put("timestamp", System.currentTimeMillis());
  267. logger.info("response===>" + JSON.toJSON(modelMap));
  268. response.getOutputStream().write(JSON.toJSONBytes(modelMap, SerializerFeature.DisableCircularReferenceDetect));
  269. return false;
  270. }
  271. }