ProxyServletConfig.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  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.catalina.connector.ClientAbortException;
  5. import org.apache.http.HttpHost;
  6. import org.apache.http.HttpRequest;
  7. import org.apache.http.HttpResponse;
  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.StringUtils;
  17. import javax.servlet.ServletException;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.io.IOException;
  21. import java.net.ConnectException;
  22. /**
  23. * @author lin
  24. */
  25. @SuppressWarnings(value = {"rawtypes", "unchecked"})
  26. @Configuration
  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 (!StringUtils.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 if (ioException instanceof ClientAbortException) {
  71. logger.error("zlm: 用户已中断连接,代理终止");
  72. } else {
  73. logger.error("zlm 代理失败: ", e);
  74. }
  75. } catch (RuntimeException exception){
  76. logger.error("zlm 代理失败: ", e);
  77. }
  78. }
  79. /**
  80. * 对于为按照格式请求的可以直接返回404
  81. */
  82. @Override
  83. protected String getTargetUri(HttpServletRequest servletRequest) {
  84. String requestURI = servletRequest.getRequestURI();
  85. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  86. String uri = null;
  87. if (mediaInfo != null) {
  88. // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
  89. uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
  90. }else {
  91. uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
  92. }
  93. return uri;
  94. }
  95. /**
  96. * 动态替换请求目标
  97. */
  98. @Override
  99. protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
  100. String requestURI = servletRequest.getRequestURI();
  101. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  102. HttpHost host;
  103. if (mediaInfo != null) {
  104. host = new HttpHost(mediaInfo.getIp(), mediaInfo.getHttpPort());
  105. }else {
  106. host = new HttpHost("127.0.0.1", serverPort);
  107. }
  108. return host;
  109. }
  110. /**
  111. * 根据uri获取流媒体信息
  112. */
  113. MediaServerItem getMediaInfoByUri(String uri){
  114. String[] split = uri.split("/");
  115. String mediaServerId = split[2];
  116. if ("default".equals(mediaServerId)) {
  117. return mediaServerService.getDefaultMediaServer();
  118. }else {
  119. return mediaServerService.getOne(mediaServerId);
  120. }
  121. }
  122. /**
  123. * 去掉url中的标志信息
  124. */
  125. @Override
  126. protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
  127. String requestURI = servletRequest.getRequestURI();
  128. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  129. String url = super.rewriteUrlFromRequest(servletRequest);
  130. if (mediaInfo == null) {
  131. logger.error("[ZLM服务访问代理],错误:处理url信息时未找到流媒体信息=>{}", requestURI);
  132. return url;
  133. }
  134. if (!StringUtils.isEmpty(mediaInfo.getId())) {
  135. url = url.replace(mediaInfo.getId() + "/", "");
  136. }
  137. return url.replace("default/", "");
  138. }
  139. }
  140. @Bean
  141. public ServletRegistrationBean recordServletRegistrationBean(){
  142. ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxyServlet(),"/record_proxy/*");
  143. servletRegistrationBean.setName("record_proxy");
  144. servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081");
  145. servletRegistrationBean.addUrlMappings();
  146. if (logger.isDebugEnabled()) {
  147. servletRegistrationBean.addInitParameter("log", "true");
  148. }
  149. return servletRegistrationBean;
  150. }
  151. class RecordProxyServlet extends ProxyServlet{
  152. @Override
  153. protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
  154. String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
  155. MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
  156. String remoteHost = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
  157. if (mediaInfo != null) {
  158. if (!StringUtils.isEmpty(queryStr)) {
  159. queryStr += "&remoteHost=" + remoteHost;
  160. }else {
  161. queryStr = "remoteHost=" + remoteHost;
  162. }
  163. }
  164. return queryStr;
  165. }
  166. /**
  167. * 异常处理
  168. */
  169. @Override
  170. protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResponse, Exception e){
  171. try {
  172. super.handleRequestException(proxyRequest, proxyResponse, e);
  173. } catch (ServletException servletException) {
  174. logger.error("录像服务 代理失败: ", e);
  175. } catch (IOException ioException) {
  176. if (ioException instanceof ConnectException) {
  177. logger.error("录像服务 连接失败");
  178. } else if (ioException instanceof ClientAbortException) {
  179. logger.error("录像服务:用户已中断连接,代理终止");
  180. } else {
  181. logger.error("录像服务 代理失败: ", e);
  182. }
  183. } catch (RuntimeException exception){
  184. logger.error("录像服务 代理失败: ", e);
  185. }
  186. }
  187. /**
  188. * 对于为按照格式请求的可以直接返回404
  189. */
  190. @Override
  191. protected String getTargetUri(HttpServletRequest servletRequest) {
  192. String requestURI = servletRequest.getRequestURI();
  193. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  194. String uri = null;
  195. if (mediaInfo != null) {
  196. // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
  197. uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
  198. }else {
  199. uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
  200. }
  201. return uri;
  202. }
  203. /**
  204. * 动态替换请求目标
  205. */
  206. @Override
  207. protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
  208. String requestURI = servletRequest.getRequestURI();
  209. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  210. HttpHost host;
  211. if (mediaInfo != null) {
  212. host = new HttpHost(mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
  213. }else {
  214. host = new HttpHost("127.0.0.1", serverPort);
  215. }
  216. return host;
  217. }
  218. /**
  219. * 根据uri获取流媒体信息
  220. */
  221. MediaServerItem getMediaInfoByUri(String uri){
  222. String[] split = uri.split("/");
  223. String mediaServerId = split[2];
  224. if ("default".equals(mediaServerId)) {
  225. return mediaServerService.getDefaultMediaServer();
  226. }else {
  227. return mediaServerService.getOne(mediaServerId);
  228. }
  229. }
  230. /**
  231. * 去掉url中的标志信息
  232. */
  233. @Override
  234. protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
  235. String requestURI = servletRequest.getRequestURI();
  236. MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
  237. String url = super.rewriteUrlFromRequest(servletRequest);
  238. if (mediaInfo == null) {
  239. logger.error("[录像服务访问代理],错误:处理url信息时未找到流媒体信息=>{}", requestURI);
  240. return url;
  241. }
  242. if (!StringUtils.isEmpty(mediaInfo.getId())) {
  243. url = url.replace(mediaInfo.getId() + "/", "");
  244. }
  245. return url.replace("default/", "");
  246. }
  247. }
  248. }