From dd2ae6578673651712134fd1867dca514cfec61f Mon Sep 17 00:00:00 2001
From: chenzhangyue <chenzhangyue01@weidian.com>
Date: 星期四, 10 八月 2023 20:00:43 +0800
Subject: [PATCH] 修复代理访问跨域问题,和ScheduledFuture取消任务时指令重排异常,不结束正在运行的任务。防止 Command interrupted
---
src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java | 5 ++
src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java | 3 +
src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java | 2
src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java | 2
src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java | 19 ++++++++-
src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java | 25 ++++++++++++
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java | 2 +
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java | 2
src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java | 15 +++++--
src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java | 3 +
src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java | 5 +-
src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java | 2
12 files changed, 68 insertions(+), 17 deletions(-)
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java b/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java
index 39e0a70..20b6eef 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/CivilCodeFileConf.java
@@ -12,7 +12,10 @@
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.ObjectUtils;
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
import java.nio.file.Files;
import java.util.Map;
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
index 873feab..5a451e3 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/DynamicTask.java
@@ -111,7 +111,7 @@
}
boolean result = false;
if (!ObjectUtils.isEmpty(futureMap.get(key)) && !futureMap.get(key).isCancelled() && !futureMap.get(key).isDone()) {
- result = futureMap.get(key).cancel(true);
+ result = futureMap.get(key).cancel(false);
futureMap.remove(key);
runnableMap.remove(key);
}
@@ -143,7 +143,8 @@
public void execute(){
if (futureMap.size() > 0) {
for (String key : futureMap.keySet()) {
- if (futureMap.get(key).isDone() || futureMap.get(key).isCancelled()) {
+ ScheduledFuture<?> future = futureMap.get(key);
+ if (future.isDone() || future.isCancelled()) {
futureMap.remove(key);
runnableMap.remove(key);
}
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
index f3fd1d8..a7416a8 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/ProxyServletConfig.java
@@ -18,6 +18,7 @@
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.ConnectException;
@@ -62,6 +63,18 @@
}
}
return queryStr;
+ }
+
+
+ @Override
+ protected HttpResponse doExecute(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
+ HttpRequest proxyRequest) throws IOException {
+ HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);
+ response.removeHeaders("Access-Control-Allow-Origin");
+ response.setHeader("Access-Control-Allow-Credentials","true");
+ response.removeHeaders("Access-Control-Allow-Credentials");
+
+ return response;
}
/**
@@ -181,6 +194,18 @@
return queryStr;
}
+
+ @Override
+ protected HttpResponse doExecute(HttpServletRequest servletRequest, HttpServletResponse servletResponse,
+ HttpRequest proxyRequest) throws IOException {
+ HttpResponse response = super.doExecute(servletRequest, servletResponse, proxyRequest);
+ String origin = servletRequest.getHeader("origin");
+ response.setHeader("Access-Control-Allow-Origin",origin);
+ response.setHeader("Access-Control-Allow-Credentials","true");
+
+ return response;
+ }
+
/**
* 寮傚父澶勭悊
*/
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
index c9c7b68..05faba5 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/security/JwtUtils.java
@@ -35,7 +35,7 @@
/**
* token杩囨湡鏃堕棿(鍒嗛挓)
*/
- public static final long expirationTime = 30;
+ public static final long expirationTime = 30 * 24 * 60;
public static String createToken(String username, String password, Integer roleId) {
try {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
index 0332aab..a4558c7 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/cmd/ISIPCommanderForPlatform.java
@@ -20,6 +20,8 @@
void register(ParentPlatform parentPlatform, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException;
void register(ParentPlatform parentPlatform, SipTransactionInfo sipTransactionInfo, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent) throws InvalidArgumentException, ParseException, SipException;
+
+
void register(ParentPlatform parentPlatform, SipTransactionInfo sipTransactionInfo, WWWAuthenticateHeader www, SipSubscribe.Event errorEvent , SipSubscribe.Event okEvent, boolean isRegister) throws SipException, InvalidArgumentException, ParseException;
/**
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
index d44ff5a..64a6478 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/NotifyRequestProcessor.java
@@ -132,7 +132,7 @@
if (CmdType.CATALOG.equals(cmd)) {
logger.info("鎺ユ敹鍒癈atalog閫氱煡");
-// processNotifyCatalogList(take.getEvt());
+ processNotifyCatalogList(take.getEvt());
notifyRequestForCatalogProcessor.process(take.getEvt());
} else if (CmdType.ALARM.equals(cmd)) {
logger.info("鎺ユ敹鍒癆larm閫氱煡");
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
index ceeb3b1..761781c 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/transmit/event/request/impl/RegisterRequestProcessor.java
@@ -85,7 +85,11 @@
Response response = null;
boolean passwordCorrect = false;
// 娉ㄥ唽鏍囧織
- boolean registerFlag;
+ boolean registerFlag = true;
+ if (request.getExpires().getExpires() == 0) {
+ // 娉ㄩ攢鎴愬姛
+ registerFlag = false;
+ }
FromHeader fromHeader = (FromHeader) request.getHeader(FromHeader.NAME);
AddressImpl address = (AddressImpl) fromHeader.getAddress();
SipUri uri = (SipUri) address.getURI();
@@ -96,11 +100,12 @@
RemoteAddressInfo remoteAddressInfo = SipUtils.getRemoteAddressFromRequest(request,
userSetting.getSipUseSourceIpAsRemoteAddress());
String requestAddress = remoteAddressInfo.getIp() + ":" + remoteAddressInfo.getPort();
- logger.info("[娉ㄥ唽璇锋眰] 璁惧锛歿}, 寮�濮嬪鐞�: {}", deviceId, requestAddress);
+ String title = registerFlag ? "[娉ㄥ唽璇锋眰]": "[娉ㄩ攢璇锋眰]";
+ logger.info(title + "璁惧锛歿}, 寮�濮嬪鐞�: {}", deviceId, requestAddress);
if (device != null &&
device.getSipTransactionInfo() != null &&
request.getCallIdHeader().getCallId().equals(device.getSipTransactionInfo().getCallId())) {
- logger.info("[娉ㄥ唽璇锋眰] 璁惧锛歿}, 娉ㄥ唽缁: {}",device.getDeviceId(), device.getDeviceId());
+ logger.info(title + "璁惧锛歿}, 娉ㄥ唽缁: {}",device.getDeviceId(), device.getDeviceId());
device.setExpires(request.getExpires().getExpires());
device.setIp(remoteAddressInfo.getIp());
device.setPort(remoteAddressInfo.getPort());
@@ -120,7 +125,7 @@
String password = (device != null && !ObjectUtils.isEmpty(device.getPassword()))? device.getPassword() : sipConfig.getPassword();
AuthorizationHeader authHead = (AuthorizationHeader) request.getHeader(AuthorizationHeader.NAME);
if (authHead == null && !ObjectUtils.isEmpty(password)) {
- logger.info("[娉ㄥ唽璇锋眰] 璁惧锛歿}, 鍥炲401: {}",deviceId, requestAddress);
+ logger.info(title + " 璁惧锛歿}, 鍥炲401: {}",deviceId, requestAddress);
response = getMessageFactory().createResponse(Response.UNAUTHORIZED, request);
new DigestServerAuthenticationHelper().generateChallenge(getHeaderFactory(), response, sipConfig.getDomain());
sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
@@ -135,7 +140,7 @@
// 娉ㄥ唽澶辫触
response = getMessageFactory().createResponse(Response.FORBIDDEN, request);
response.setReasonPhrase("wrong password");
- logger.info("[娉ㄥ唽璇锋眰] 璁惧锛歿}, 瀵嗙爜/SIP鏈嶅姟鍣↖D閿欒, 鍥炲403: {}", deviceId, requestAddress);
+ logger.info(title + " 璁惧锛歿}, 瀵嗙爜/SIP鏈嶅姟鍣↖D閿欒, 鍥炲403: {}", deviceId, requestAddress);
sipSender.transmitRequest(request.getLocalAddress().getHostAddress(), response);
return;
}
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
index 17e8e21..b484806 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/DeviceServiceImpl.java
@@ -108,6 +108,7 @@
inviteStreamService.clearInviteInfo(device.getDeviceId());
}
device.setUpdateTime(now);
+ device.setKeepaliveTime(now);
if (device.getKeepaliveIntervalTime() == 0) {
// 榛樿蹇冭烦闂撮殧60
device.setKeepaliveIntervalTime(60);
@@ -209,7 +210,7 @@
redisCatchStorage.updateDevice(device);
deviceMapper.update(device);
//杩涜閫氶亾绂荤嚎
-// deviceChannelMapper.offlineByDeviceId(deviceId);
+ deviceChannelMapper.offlineByDeviceId(deviceId);
// 绂荤嚎閲婃斁鎵�鏈塻src
List<SsrcTransaction> ssrcTransactions = streamSession.getSsrcTransactionForAll(deviceId, null, null, null);
if (ssrcTransactions != null && ssrcTransactions.size() > 0) {
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
index b75b477..86ee0f4 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlatformServiceImpl.java
@@ -234,7 +234,6 @@
// 璁剧疆骞冲彴绂荤嚎锛屽苟閲嶆柊娉ㄥ唽
logger.info("[鍥芥爣绾ц仈] 涓夋蹇冭烦瓒呮椂, 骞冲彴{}({})绂荤嚎", parentPlatform.getName(), parentPlatform.getServerGBId());
offline(parentPlatform, false);
-
}
}else {
@@ -249,6 +248,7 @@
platformCatch.setKeepAliveReply(0);
redisCatchStorage.updatePlatformCatchInfo(platformCatch);
}
+ logger.info("[鍙戦�佸績璺砞 鍥芥爣绾ц仈 鍙戦�佸績璺�, code锛� {}, msg: {}", eventResult.statusCode, eventResult.msg);
});
} catch (SipException | InvalidArgumentException | ParseException e) {
logger.error("[鍛戒护鍙戦�佸け璐 鍥芥爣绾ц仈 鍙戦�佸績璺�: {}", e.getMessage());
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
index bdc45bf..d48b802 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/dao/DeviceChannelMapper.java
@@ -193,7 +193,7 @@
@Update(value = {"UPDATE wvp_device_channel SET status=false WHERE device_id=#{deviceId} AND channel_id=#{channelId}"})
void offline(String deviceId, String channelId);
- @Update(value = {"UPDATE wvp_device_channel SET status=fasle WHERE device_id=#{deviceId}"})
+ @Update(value = {"UPDATE wvp_device_channel SET status=false WHERE device_id=#{deviceId}"})
void offlineByDeviceId(String deviceId);
@Insert("<script> " +
diff --git a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
index 8b23f22..0f1509f 100644
--- a/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/storager/impl/RedisCatchStorageImpl.java
@@ -16,6 +16,7 @@
import com.genersoft.iot.vmp.service.bean.MessageForPushChannel;
import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
import com.genersoft.iot.vmp.storager.dao.DeviceChannelMapper;
+import com.genersoft.iot.vmp.storager.dao.DeviceMapper;
import com.genersoft.iot.vmp.storager.dao.dto.PlatformRegisterInfo;
import com.genersoft.iot.vmp.utils.DateUtil;
import com.genersoft.iot.vmp.utils.JsonUtil;
@@ -39,6 +40,9 @@
@Autowired
private DeviceChannelMapper deviceChannelMapper;
+
+ @Autowired
+ private DeviceMapper deviceMapper;
@Autowired
private UserSetting userSetting;
@@ -375,7 +379,8 @@
for (Object o : keys) {
String key = (String) o;
Device device = JsonUtil.redisJsonToObject(redisTemplate, key, Device.class);
- if (Objects.nonNull(device)) { // 鍙彇娌℃湁瀛樿繃寰�
+ if (Objects.nonNull(device)) {
+ // 鍙彇娌℃湁瀛樿繃寰�
result.add(JsonUtil.redisJsonToObject(redisTemplate, key, Device.class));
}
}
@@ -386,14 +391,22 @@
@Override
public Device getDevice(String deviceId) {
String key = VideoManagerConstants.DEVICE_PREFIX + userSetting.getServerId() + "_" + deviceId;
- return JsonUtil.redisJsonToObject(redisTemplate, key, Device.class);
+ Device device = JsonUtil.redisJsonToObject(redisTemplate, key, Device.class);
+ if (device == null){
+ device = deviceMapper.getDeviceByDeviceId(deviceId);
+ if (device != null) {
+ updateDevice(device);
+ }
+ }
+ return device;
}
@Override
public void updateGpsMsgInfo(GPSMsgInfo gpsMsgInfo) {
String key = VideoManagerConstants.WVP_STREAM_GPS_MSG_PREFIX + userSetting.getServerId() + "_" + gpsMsgInfo.getId();
Duration duration = Duration.ofSeconds(60L);
- redisTemplate.opsForValue().set(key, gpsMsgInfo, duration); // 榛樿GPS娑堟伅淇濆瓨1鍒嗛挓
+ redisTemplate.opsForValue().set(key, gpsMsgInfo, duration);
+ // 榛樿GPS娑堟伅淇濆瓨1鍒嗛挓
}
@Override
diff --git a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
index 31e89f9..48369d4 100644
--- a/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
+++ b/src/main/java/com/genersoft/iot/vmp/utils/redis/RedisUtil.java
@@ -1,5 +1,6 @@
package com.genersoft.iot.vmp.utils.redis;
+import com.google.common.collect.Lists;
import org.springframework.data.redis.core.Cursor;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;
@@ -38,7 +39,7 @@
return keys;
});
- return new ArrayList<>(resultKeys);
+ return Lists.newArrayList(resultKeys);
}
}
--
Gitblit v1.8.0