ServletContext.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. package com.zhiqiyun.open.utils;
  2. import org.apache.commons.lang3.StringUtils;
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.util.Enumeration;
  9. import java.util.HashMap;
  10. import java.util.Map;
  11. import java.util.UUID;
  12. /**
  13. * Created on 2015年09月24
  14. * <p>
  15. * Title: Servlet上下文
  16. * </p>
  17. * <p>
  18. * Description: 获取请求上下文的request,response等信息
  19. * </p>
  20. * <p>
  21. * Copyright: Copyright (c) 2015
  22. * </p>
  23. *
  24. * @author jtoms
  25. * @version 1.0
  26. */
  27. public class ServletContext {
  28. private final static String[] PROXY_REMOTE_IP_ADDRESS = {"x-forwarded-for", "proxy-client-ip", "wl-proxy-client-ip", "x-real-ip"};
  29. private final static String[] PROXY_ACCESS_TOKEN = {"x-header-access-token", "x-access-token"};
  30. private final static String[] PROXY_FROM_SOURCE = {"x-header-from-source", "x-from-source"};
  31. private final static ThreadLocal<ServletContext> CONTROLLER_CONTEXT = new ThreadLocal<>();
  32. private final static String REQUEST_ID = "____REQUEST_ID____";
  33. private final static String HTTP_SERVLET_REQUEST = "____HTTP_SERVLET_REQUEST____";
  34. private final static String HTTP_SERVLET_RESPONSE = "____HTTP_SERVLET_RESPONSE____";
  35. private final static String REMOTE_IP_ADDRESS = "____REMOTE_IP_ADDRESS____";
  36. private final static String ACCESS_TOKEN = "____ACCESS_TOKEN____";
  37. private final static String FORM_SOURCE = "____FORM_SOURCE____";
  38. private final static String IS_JSON = "____IS_JSON____";
  39. private final Map<String, Object> context;
  40. public ServletContext(Map<String, Object> context) {
  41. this.context = context;
  42. }
  43. /**
  44. * Created on 2015-09-24
  45. * <p>
  46. * Description:初始化 该方法在ControllerFilter中调用其他地方不能调用
  47. * </p>
  48. */
  49. public static void init(HttpServletRequest request, HttpServletResponse response) {
  50. CONTROLLER_CONTEXT.set(new ServletContext(new HashMap<>()));
  51. String requestId = UUID.randomUUID().toString();
  52. CONTROLLER_CONTEXT.get().getContext().put(REQUEST_ID, requestId);
  53. CONTROLLER_CONTEXT.get().getContext().put(HTTP_SERVLET_REQUEST, request);
  54. CONTROLLER_CONTEXT.get().getContext().put(HTTP_SERVLET_RESPONSE, response);
  55. CONTROLLER_CONTEXT.get().getContext().put(REMOTE_IP_ADDRESS, getRemoteIPAddress(request));
  56. CONTROLLER_CONTEXT.get().getContext().put(ACCESS_TOKEN, getAccessToken(request));
  57. CONTROLLER_CONTEXT.get().getContext().put(FORM_SOURCE, getFromSource(request));
  58. CONTROLLER_CONTEXT.get().getContext().put(IS_JSON, isJson(request));
  59. }
  60. public static void clean() {
  61. CONTROLLER_CONTEXT.set(null);
  62. CONTROLLER_CONTEXT.remove();
  63. }
  64. /**
  65. * Created on 2015-09-24
  66. * <p>
  67. * Description:获取 request
  68. * </p>
  69. */
  70. public static HttpServletRequest getRequest() {
  71. return getValue(HTTP_SERVLET_REQUEST);
  72. }
  73. public static boolean isJson() {
  74. return getValue(IS_JSON);
  75. }
  76. public static HttpServletResponse getResponse() {
  77. return getValue(HTTP_SERVLET_RESPONSE);
  78. }
  79. @SuppressWarnings("unchecked")
  80. public static <T> T getValue(String key) {
  81. return (T) CONTROLLER_CONTEXT.get().getContext().get(key);
  82. }
  83. public static void set(String key, Object value) {
  84. CONTROLLER_CONTEXT.get().getContext().put(key, value);
  85. }
  86. public static String getFromSource() {
  87. return getValue(FORM_SOURCE);
  88. }
  89. public static String getRequestId() {
  90. return getValue(REQUEST_ID);
  91. }
  92. public static String getRemoteIPAddress() {
  93. return getValue(REMOTE_IP_ADDRESS);
  94. }
  95. public static String getAccessToken() {
  96. return getValue(ACCESS_TOKEN);
  97. }
  98. public static String getAccessToken(HttpServletRequest request) {
  99. return getHeaderValue(request, PROXY_ACCESS_TOKEN);
  100. }
  101. public static String getFromSource(HttpServletRequest request) {
  102. return getHeaderValue(request, PROXY_FROM_SOURCE);
  103. }
  104. public static Map<String, String> getRequestParamMap() {
  105. HttpServletRequest request = getRequest();
  106. Enumeration<String> parameterNames = request.getParameterNames();
  107. Map<String, String> dataMap = new HashMap<>();
  108. while (parameterNames.hasMoreElements()) {
  109. String key = parameterNames.nextElement();
  110. String value = request.getParameter(key);
  111. dataMap.put(key, value);
  112. }
  113. return dataMap;
  114. }
  115. public static String getRemoteIPAddress(HttpServletRequest request) {
  116. String xforwardIp = getHeaderValue(request, PROXY_REMOTE_IP_ADDRESS);
  117. if (StringUtils.isNotBlank(xforwardIp)) {
  118. return getRemoteIpFromForward(xforwardIp);
  119. } else {
  120. return request.getRemoteHost();
  121. }
  122. }
  123. public static String getHeaderValue(HttpServletRequest request, String[] nameArrays) {
  124. String value = "";
  125. for (String s : nameArrays) {
  126. value = request.getHeader(s);
  127. if (StringUtils.isNotBlank(value)) {
  128. break;
  129. }
  130. }
  131. return value;
  132. }
  133. /**
  134. * <p>
  135. * 从 HTTP Header 的 X-Forward-IP 头中截取客户端连接 IP 地址。如果经过多次反向代理, 在 X-Forward-IP
  136. * 中获得的是以“,&lt;SP&gt;”分隔 IP 地址链,第一段为客户端 IP 地址。
  137. * </p>
  138. *
  139. * @param xforwardIp
  140. * @return
  141. */
  142. private static String getRemoteIpFromForward(String xforwardIp) {
  143. int commaOffset = xforwardIp.indexOf(',');
  144. if (commaOffset < 0) {
  145. return xforwardIp;
  146. }
  147. return xforwardIp.substring(0, commaOffset);
  148. }
  149. /**
  150. * 判断本次请求的数据类型是否为json
  151. *
  152. * @param request request
  153. * @return boolean
  154. */
  155. private static boolean isJson(HttpServletRequest request) {
  156. String contentType = request.getContentType();
  157. return StringUtils.contains(contentType, "application/json");
  158. }
  159. /**
  160. * 获取请求body数据
  161. *
  162. * @param inStream
  163. * @return
  164. * @throws IOException
  165. */
  166. public static String getBody(InputStream inStream) throws IOException {
  167. ByteArrayOutputStream outSteam = new ByteArrayOutputStream();
  168. byte[] buffer = new byte[1024];
  169. int len = 0;
  170. while ((len = inStream.read(buffer)) != -1) {
  171. outSteam.write(buffer, 0, len);
  172. }
  173. outSteam.close();
  174. inStream.close();
  175. return outSteam.toString("utf-8");
  176. }
  177. private Map<String, Object> getContext() {
  178. return context;
  179. }
  180. }