| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- package com.genersoft.iot.vmp.conf;
- import com.genersoft.iot.vmp.media.zlm.dto.MediaServerItem;
- import com.genersoft.iot.vmp.service.IMediaServerService;
- import org.apache.catalina.connector.ClientAbortException;
- import org.apache.http.HttpHost;
- import org.apache.http.HttpRequest;
- import org.apache.http.HttpResponse;
- import org.mitre.dsmiley.httpproxy.ProxyServlet;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.boot.web.servlet.ServletRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.util.StringUtils;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.net.ConnectException;
- /**
- * @author lin
- */
- @SuppressWarnings(value = {"rawtypes", "unchecked"})
- @Configuration
- public class ProxyServletConfig {
- private final static Logger logger = LoggerFactory.getLogger(ProxyServletConfig.class);
- @Autowired
- private IMediaServerService mediaServerService;
- @Value("${server.port}")
- private int serverPort;
- @Bean
- public ServletRegistrationBean zlmServletRegistrationBean(){
- ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new ZlmProxyServlet(),"/zlm/*");
- servletRegistrationBean.setName("zlm_Proxy");
- servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:6080");
- servletRegistrationBean.addUrlMappings();
- if (logger.isDebugEnabled()) {
- servletRegistrationBean.addInitParameter("log", "true");
- }
- return servletRegistrationBean;
- }
- class ZlmProxyServlet extends ProxyServlet{
- @Override
- protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
- String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
- MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
- if (mediaInfo != null) {
- if (!StringUtils.isEmpty(queryStr)) {
- queryStr += "&secret=" + mediaInfo.getSecret();
- }else {
- queryStr = "secret=" + mediaInfo.getSecret();
- }
- }
- return queryStr;
- }
- /**
- * 异常处理
- */
- @Override
- protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResonse, Exception e){
- try {
- super.handleRequestException(proxyRequest, proxyResonse, e);
- } catch (ServletException servletException) {
- logger.error("zlm 代理失败: ", e);
- } catch (IOException ioException) {
- if (ioException instanceof ConnectException) {
- logger.error("zlm 连接失败");
- } else if (ioException instanceof ClientAbortException) {
- logger.error("zlm: 用户已中断连接,代理终止");
- } else {
- logger.error("zlm 代理失败: ", e);
- }
- } catch (RuntimeException exception){
- logger.error("zlm 代理失败: ", e);
- }
- }
- /**
- * 对于为按照格式请求的可以直接返回404
- */
- @Override
- protected String getTargetUri(HttpServletRequest servletRequest) {
- String requestURI = servletRequest.getRequestURI();
- MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
- String uri = null;
- if (mediaInfo != null) {
- // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
- uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
- }else {
- uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
- }
- return uri;
- }
- /**
- * 动态替换请求目标
- */
- @Override
- protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
- String requestURI = servletRequest.getRequestURI();
- MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
- HttpHost host;
- if (mediaInfo != null) {
- host = new HttpHost(mediaInfo.getIp(), mediaInfo.getHttpPort());
- }else {
- host = new HttpHost("127.0.0.1", serverPort);
- }
- return host;
- }
- /**
- * 根据uri获取流媒体信息
- */
- MediaServerItem getMediaInfoByUri(String uri){
- String[] split = uri.split("/");
- String mediaServerId = split[2];
- if ("default".equals(mediaServerId)) {
- return mediaServerService.getDefaultMediaServer();
- }else {
- return mediaServerService.getOne(mediaServerId);
- }
- }
- /**
- * 去掉url中的标志信息
- */
- @Override
- protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
- String requestURI = servletRequest.getRequestURI();
- MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
- String url = super.rewriteUrlFromRequest(servletRequest);
- if (mediaInfo == null) {
- logger.error("[ZLM服务访问代理],错误:处理url信息时未找到流媒体信息=>{}", requestURI);
- return url;
- }
- if (!StringUtils.isEmpty(mediaInfo.getId())) {
- url = url.replace(mediaInfo.getId() + "/", "");
- }
- return url.replace("default/", "");
- }
- }
- @Bean
- public ServletRegistrationBean recordServletRegistrationBean(){
- ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new RecordProxyServlet(),"/record_proxy/*");
- servletRegistrationBean.setName("record_proxy");
- servletRegistrationBean.addInitParameter("targetUri", "http://127.0.0.1:18081");
- servletRegistrationBean.addUrlMappings();
- if (logger.isDebugEnabled()) {
- servletRegistrationBean.addInitParameter("log", "true");
- }
- return servletRegistrationBean;
- }
- class RecordProxyServlet extends ProxyServlet{
- @Override
- protected String rewriteQueryStringFromRequest(HttpServletRequest servletRequest, String queryString) {
- String queryStr = super.rewriteQueryStringFromRequest(servletRequest, queryString);
- MediaServerItem mediaInfo = getMediaInfoByUri(servletRequest.getRequestURI());
- String remoteHost = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getHttpPort());
- if (mediaInfo != null) {
- if (!StringUtils.isEmpty(queryStr)) {
- queryStr += "&remoteHost=" + remoteHost;
- }else {
- queryStr = "remoteHost=" + remoteHost;
- }
- }
- return queryStr;
- }
- /**
- * 异常处理
- */
- @Override
- protected void handleRequestException(HttpRequest proxyRequest, HttpResponse proxyResponse, Exception e){
- try {
- super.handleRequestException(proxyRequest, proxyResponse, e);
- } catch (ServletException servletException) {
- logger.error("录像服务 代理失败: ", e);
- } catch (IOException ioException) {
- if (ioException instanceof ConnectException) {
- logger.error("录像服务 连接失败");
- } else if (ioException instanceof ClientAbortException) {
- logger.error("录像服务:用户已中断连接,代理终止");
- } else {
- logger.error("录像服务 代理失败: ", e);
- }
- } catch (RuntimeException exception){
- logger.error("录像服务 代理失败: ", e);
- }
- }
- /**
- * 对于为按照格式请求的可以直接返回404
- */
- @Override
- protected String getTargetUri(HttpServletRequest servletRequest) {
- String requestURI = servletRequest.getRequestURI();
- MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
- String uri = null;
- if (mediaInfo != null) {
- // String realRequestURI = requestURI.substring(requestURI.indexOf(mediaInfo.getId())+ mediaInfo.getId().length());
- uri = String.format("http://%s:%s", mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
- }else {
- uri = "http://127.0.0.1:" + serverPort +"/index/hook/null"; // 只是一个能返回404的请求而已, 其他的也可以
- }
- return uri;
- }
- /**
- * 动态替换请求目标
- */
- @Override
- protected HttpHost getTargetHost(HttpServletRequest servletRequest) {
- String requestURI = servletRequest.getRequestURI();
- MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
- HttpHost host;
- if (mediaInfo != null) {
- host = new HttpHost(mediaInfo.getIp(), mediaInfo.getRecordAssistPort());
- }else {
- host = new HttpHost("127.0.0.1", serverPort);
- }
- return host;
- }
- /**
- * 根据uri获取流媒体信息
- */
- MediaServerItem getMediaInfoByUri(String uri){
- String[] split = uri.split("/");
- String mediaServerId = split[2];
- if ("default".equals(mediaServerId)) {
- return mediaServerService.getDefaultMediaServer();
- }else {
- return mediaServerService.getOne(mediaServerId);
- }
- }
- /**
- * 去掉url中的标志信息
- */
- @Override
- protected String rewriteUrlFromRequest(HttpServletRequest servletRequest) {
- String requestURI = servletRequest.getRequestURI();
- MediaServerItem mediaInfo = getMediaInfoByUri(requestURI);
- String url = super.rewriteUrlFromRequest(servletRequest);
- if (mediaInfo == null) {
- logger.error("[录像服务访问代理],错误:处理url信息时未找到流媒体信息=>{}", requestURI);
- return url;
- }
- if (!StringUtils.isEmpty(mediaInfo.getId())) {
- url = url.replace(mediaInfo.getId() + "/", "");
- }
- return url.replace("default/", "");
- }
- }
- }
|