ProxyServletConfig.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. package com.genersoft.iot.vmp.conf;
  2. import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
  3. import com.genersoft.iot.vmp.service.IMediaServerService;
  4. import org.apache.http.HttpHost;
  5. import org.apache.http.HttpRequest;
  6. import org.apache.http.HttpResponse;
  7. import org.junit.jupiter.api.Order;
  8. import org.mitre.dsmiley.httpproxy.ProxyServlet;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.boot.web.servlet.ServletRegistrationBean;
  14. import org.springframework.context.annotation.Bean;
  15. import org.springframework.context.annotation.Configuration;
  16. import org.springframework.util.ObjectUtils;
  17. import javax.servlet.ServletException;
  18. import javax.servlet.http.HttpServletRequest;
  19. import java.io.IOException;
  20. import java.net.ConnectException;
  21. /**
  22. * @author lin
  23. */
  24. @SuppressWarnings(value = {"rawtypes", "unchecked"})
  25. @Configuration
  26. @Order(1)
  27. public class ProxyServletConfig {
  28. private final static Logger logger = LoggerFactory.getLogger(ProxyServletConfig.class);
  29. @Autowired
  30. private IMediaServerService mediaServerService;
  31. @Value("${server.port}")
  32. private int serverPort;
  33. @Bean
  34. public ServletRegistrationBean zlmServletRegistrationBean(){
  35. ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ZlmProxyServlet(),"/zlm/*");
  36. servletRegistrationBean.setName("zlm_Proxy");
  37. servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:6080");
  38. servletRegistrationBean.addUrlMappings();
  39. if (logger.isDebugEnabled()) {
  40. servletRegistrationBean.addInitParameter("log", "true");
  41. }
  42. return servletRegistrationBean;
  43. }
  44. class ZlmProxyServlet extends ProxyServlet{
  45. @Override
  46. protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
  47. String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
  48. MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
  49. if (mediaInfo != null) {
  50. if (!ObjectUtils.isEmpty(queryStr)) {
  51. queryStr += "&secret=" + mediaInfo.getSecret();
  52. }else {
  53. queryStr = "secret=" + mediaInfo.getSecret();
  54. }
  55. }
  56. return queryStr;
  57. }
  58. /**
  59. * 异常处理
  60. */
  61. @Override
  62. protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResonse, Exception e){
  63. try {
  64. super.handleRequestException(proxyRequest, proxyResonse, e);
  65. } catch (ServletException servletException) {
  66. logger.error("zlm 代理失败: ", e);
  67. } catch (IOException ioException) {
  68. if (ioException instanceof ConnectException) {
  69. logger.error("zlm 连接失败");
  70. } else {
  71. logger.error("zlm 代理失败: ", e);
  72. }
  73. } catch (RuntimeException exception){
  74. logger.error("zlm 代理失败: ", e);
  75. }
  76. }
  77. /**
  78. * 对于为按照格式请求的可以直接返回404
  79. */
  80. @Override
  81. protected String getTargetUri(HttpServletRequest servletRequest) {
  82. String requestURI = servletRequest.getRequestURI();
  83. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  84. String uri = null;
  85. if (mediaInfo != null) {
  86. // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
  87. uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
  88. }else {
  89. uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
  90. }
  91. return uri;
  92. }
  93. /**
  94. * 动态替换请求目标
  95. */
  96. @Override
  97. protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
  98. String requestURI = servletRequest.getRequestURI();
  99. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  100. HttpHost host;
  101. if (mediaInfo != null) {
  102. host = new HttpHost(mediaInfo.getIp(), mediaInfo.getHttpPort());
  103. }else {
  104. host = new HttpHost("127.0.0.1", serverPort);
  105. }
  106. return host;
  107. }
  108. /**
  109. * 根据uri获取流媒体信息
  110. */
  111. MediaServerItem getMediaInfoByUri(String uri){
  112. String[] split = uri.split("/");
  113. String mediaServerId = split[2];
  114. if ("default".equalsIgnoreCase(mediaServerId)) {
  115. return mediaServerService.getDefaultMediaServer();
  116. }else {
  117. return mediaServerService.getOne(mediaServerId);
  118. }
  119. }
  120. /**
  121. * 去掉url中的标志信息
  122. */
  123. @Override
  124. protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
  125. String requestURI = servletRequest.getRequestURI();
  126. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  127. String url = super.rewriteUrlFromRequest(servletRequest);
  128. if (mediaInfo == null) {
  129. logger.error("[ZLM服务访问代理],错误:处理url信息时未找到流媒体信息=>{}", requestURI);
  130. return url;
  131. }
  132. if (!ObjectUtils.isEmpty(mediaInfo.getId())) {
  133. url = url.replace(mediaInfo.getId() + "/", "");
  134. }
  135. return url.replace("default/", "");
  136. }
  137. }
  138. @Bean
  139. public ServletRegistrationBean recordServletRegistrationBean(){
  140. ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxyServlet(),"/record_proxy/*");
  141. servletRegistrationBean.setName("record_proxy");
  142. servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081");
  143. servletRegistrationBean.addUrlMappings();
  144. if (logger.isDebugEnabled()) {
  145. servletRegistrationBean.addInitParameter("log", "true");
  146. }
  147. return servletRegistrationBean;
  148. }
  149. class RecordProxyServlet extends ProxyServlet{
  150. @Override
  151. protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
  152. String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
  153. MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
  154. if (mediaInfo == null) {
  155. return null;
  156. }
  157. String remoteHost = String.format("http://%s:%s", mediaInfo.getStreamIp(), mediaInfo.getRecordAssistPort());
  158. if (!ObjectUtils.isEmpty(queryStr)) {
  159. queryStr += "&remoteHost=" + remoteHost;
  160. }else {
  161. queryStr = "remoteHost=" + remoteHost;
  162. }
  163. return queryStr;
  164. }
  165. /**
  166. * 异常处理
  167. */
  168. @Override
  169. protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResponse, Exception e){
  170. try {
  171. super.handleRequestException(proxyRequest, proxyResponse, e);
  172. } catch (ServletException servletException) {
  173. logger.error("录像服务 代理失败: ", e);
  174. } catch (IOException ioException) {
  175. if (ioException instanceof ConnectException) {
  176. logger.error("录像服务 连接失败");
  177. }else {
  178. logger.error("录像服务 代理失败: ", e);
  179. }
  180. } catch (RuntimeException exception){
  181. logger.error("录像服务 代理失败: ", e);
  182. }
  183. }
  184. /**
  185. * 对于为按照格式请求的可以直接返回404
  186. */
  187. @Override
  188. protected String getTargetUri(HttpServletRequest servletRequest) {
  189. String requestURI = servletRequest.getRequestURI();
  190. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  191. String uri = null;
  192. if (mediaInfo != null) {
  193. // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
  194. uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
  195. }else {
  196. uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
  197. }
  198. return uri;
  199. }
  200. /**
  201. * 动态替换请求目标
  202. */
  203. @Override
  204. protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
  205. String requestURI = servletRequest.getRequestURI();
  206. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  207. HttpHost host;
  208. if (mediaInfo != null) {
  209. host = new HttpHost(mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
  210. }else {
  211. host = new HttpHost("127.0.0.1", serverPort);
  212. }
  213. return host;
  214. }
  215. /**
  216. * 根据uri获取流媒体信息
  217. */
  218. MediaServerItem getMediaInfoByUri(String uri){
  219. String[] split = uri.split("/");
  220. String mediaServerId = split[2];
  221. if ("default".equalsIgnoreCase(mediaServerId)) {
  222. return mediaServerService.getDefaultMediaServer();
  223. }else {
  224. return mediaServerService.getOne(mediaServerId);
  225. }
  226. }
  227. /**
  228. * 去掉url中的标志信息
  229. */
  230. @Override
  231. protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
  232. String requestURI = servletRequest.getRequestURI();
  233. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  234. String url = super.rewriteUrlFromRequest(servletRequest);
  235. if (mediaInfo == null) {
  236. logger.error("[录像服务访问代理],错误:处理url信息时未找到流媒体信息=>{}", requestURI);
  237. return url;
  238. }
  239. if (!ObjectUtils.isEmpty(mediaInfo.getId())) {
  240. url = url.replace(mediaInfo.getId() + "/", "");
  241. }
  242. return url.replace("default/", "");
  243. }
  244. }
  245. }