Распределённая стратегия
- Поскольку Spring Cache не позволяет устанавливать гибкие значения времени истечения срока действия для кэша, необходимо добавить аннотацию @cacheExpireTime для каждого кэша, чтобы установить индивидуальное время истечения срока действия (в настоящее время это применимо только к использованию кэша Redis).
- Аннотация @CacheExpireTime:
2.1 Область действия:
2.1.1 На уровне класса: применяется ко всем методам с аннотацией @Cacheable в текущем классе, но не влияет на методы без аннотации @CacheExpireTime. 2.1.2 На уровне метода: устанавливает время истечения срока действия для текущего метода.
- Использование:
@Bean
CacheManager cacheManager(RedisConnectionFactory connectionFactory) {
// Инициализация RedisCacheWriter
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory);
RedisCacheConfiguration defaultCacheConfig = RedisCacheConfiguration.defaultCacheConfig();
// Установка времени истечения по умолчанию
RedisCacheConfiguration configuration = defaultCacheConfig.entryTtl(Duration.ofSeconds(100000));
FormulaCacheManager cacheManager = new FormulaCacheManager(redisCacheWriter, configuration);
return cacheManager;
}
2. **Распределённые блокировки**
@Override @Lock(keys = {"#params"}, waitTime = 10, leaseTime = 10) public String getValue(String params) { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } return "success"; }
@Override
@Lock(keys = {"#id"})
public String getValue(Integer id, @LockParam String username) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "success";
}
@Override
@Lock(keys = {"#user.name", "#user.id"})
public String getValue(User user) {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "success";
}
3. **Распределённый ограничитель скорости**
> 3.1 Включение ограничителя скорости с помощью @EnableRateLimit. Ограничение скорости применяется к методам, отмеченным аннотацией @RateLimit.
> 3.2 По умолчанию используется алгоритм подсчёта, для переключения на использование алгоритма токена необходимо добавить в конфигурацию следующее:
rateLimit.algorithm= token
Также следует обратить внимание на два свойства в @RateLimit:
/**
* Время интервала добавления данных в токен-ведро, в секундах. По умолчанию 10 секунд
*/
public long tokenBucketTimeInterval() default 10;
/**
* Количество токенов, добавляемых в ведро токенов за один раз. По умолчанию 5
*/
public long tokenBucketStepNum() default 5;
Пример:
@GetMapping("find/id2")
@RateLimit(limit = 20)
public User findById2(@RequestParam("id") Integer id) {
return userService.findById2(id);
}
4. **Предотвращение повторной отправки**
Обеспечение уникальности запросов (один и тот же запрос от пользователя всегда приводит к одному и тому же результату):
token механизм — получение токена при запросе:
@PostMapping("get/token")
public String getToken() {
log.info("Получение TOKEN");
String token = KEY_NAME + System.currentTimeMillis();
stringRedisTemplate.opsForValue().set(token, token, TIME_OUT, TimeUnit.SECONDS);
return null;
}
Затем запрос направляется к бизнес-интерфейсу:
@PostMapping("idempotent")
@ExtApiIdempotent(Constants.HEAD)
public String idempotent() {
log.info("Тестирование интерфейса на уникальность");
return null;
}
5. **Генерация коротких ссылок**
6. **Шифрование ответа**
>6.1 Включить:
```
@SpringBootApplication
@EnableEncrypt
public class FormulaDistributionExampleApplication {
public static void main(String[] args) {
SpringApplication.run(FormulaDistributionExampleApplication.class, args);
}
}
```
>6.2 Добавить ключ шифрования:
spring.formula.encrypt.key=abcdef0123456789 spring.formula.encrypt.debug=false
>spring.formula.encrypt.key: ключ шифрования, должен быть 16-битным.
>spring.formula.encrypt.debug: включить режим отладки, по умолчанию false, если true, то шифрование и дешифрование не будут выполняться.
>6.3 Шифрование результата ответа:
@PostMapping("Encrypt")
@Encrypt
public String Encrypt(@RequestBody User user) {
return JSON.toJSONString(user);
}
>6.4 Дешифрование содержимого запроса:
@PostMapping("Decrypt")
@Decrypt
public String Decrypt(@RequestBody User user) {
return JSON.toJSONString(user);
}
>6.5 Реализация с использованием axios:
В тексте запроса есть код на языке программирования Java, который я не могу перевести. Я перевёл всё, что смог понять. Если у вас есть дополнительные вопросы или уточнения, пожалуйста, дайте мне знать. ```
var key = CryptoJS.enc.Latin1.parse('abcdef0123456789');
var iv = CryptoJS.enc.Latin1.parse('abcdef0123456789');
// 加密
function EncryptData(data) {
var srcs = CryptoJS.enc.Utf8.parse(data);
var encrypted = CryptoJS.AES.encrypt(srcs, key, {
mode : CryptoJS.mode.ECB,
padding : CryptoJS.pad.Pkcs7
});
return encrypted.toString();
}
// 解密
function DecryptData(data) {
var stime = new Date().getTime();
var decrypt = CryptoJS.AES.decrypt(data, key, {
mode : CryptoJS.mode.ECB,
padding : CryptoJS.pad.Pkcs7
});
var result = JSON.parse(CryptoJS.enc.Utf8.stringify(decrypt).toString());
var etime = new Date().getTime();
console.log("DecryptData Time:" + (etime - stime));
return result;
}
Код axios-перехватчика:
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 对所有POST请加密,必须是json数据提交,不支持表单
if (config.method == "post") {
config.data = EncryptData(JSON.stringify(config.data));
}
return config;
}, function (error) {
return Promise.reject(error);
});
// 添加响应拦搓器
axios.interceptors.response.use(function (response) {
// 后端返回字符串表示需要解密操作
if(typeof(response.data) == "string"){
response.data = DecryptData(response.data);
}
return response;
}, function (error) {
return Promise.reject(error);
});
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )