java как запустить конвейер? Сессия сразу после нее сбросила бан аккаунта!

Java

сценарий спроса

Блокировка учетных записей является относительно распространенным бизнес-требованием, особенно на форумах и проектах сообщества.Когда есть нелегальные пользователи, мы должны немедленно заблокировать их учетные записи.

Общая идея дизайна такова: в дизайне用户表При добавлении поля состояния, например:status, при значении 1 учетная запись нормальная, при значении 0 учетная запись заблокирована.

Когда нам нужно заблокировать учетную запись, нам нужно только изменить ее учетную записьstatusЗначение можно изменить на 0. Когда другая сторона снова войдет в систему, мы можем обнаружитьstatusЗначение не регистрируется как бан.

Хотя эта модель имеет простую идею, у нее также есть большая проблема, а именно: что, если другая сторона всегда онлайн и не выходит из системы?

Поскольку мы обнаруживаем только при входе в системуstatusзначение, что означает, что если другая сторона не выйдет из учетной записи активно, его сеанс все равно будет существовать и быть действительным.

Так как же он может вступить в силу сразу после блокировки аккаунта?

Вы можете подумать об использовании перехватчика для перехвата всех пользовательских запросов на проверку состояния учетной записи:status=0Доступ запрещен,status=1отпустить запрос

Хотя этот метод решает проблему, если вам приходится запрашивать базу данных для каждого запроса, база данных означает, что у вас нет психологического давления, чтобы меня вот так заметать?

Что делать тогда? кеш? Хотя это может снизить нагрузку на производительность, всегда кажется, что это не решает проблему идеально.

Настоящая проблема в том, что в обычной системе нужно забанить только 0,01% пользователей, а обнаружение остальных 99,99% пользователей в режиме реального времени — ненужная трата производительности.

В приведенном выше сценарии, что нам действительно нужно, так это операция кикания кого-либо в оффлайне, то есть: после того, как мы забаним пользователя, его сессия будет немедленно отключена, даже если он снова войдет в систему, ему будет запрещен вход в систему.

Итак, как выгнать кого-то из сети в режиме реального времени?

Автор использует SA-Token Permission Authentication Framework.Эта структура инкапсулирует то, что очень удобно отключать вызовы офлайн-операций.Вам не нужно поднимать уровень себя, как в других платформах.

специальный код

  1. сначала добавитьpom.xmlРамка
<!-- sa-token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
<dependency>
	<groupId>cn.dev33</groupId>
	<artifactId>sa-token-spring-boot-starter</artifactId>
	<version>1.12.1</version>
</dependency>
  1. Запишите идентификатор учетной записи в сеанс, когда пользователь входит в систему.
@RestController
@RequestMapping("user")
public class UserController {
	@RequestMapping("doLogin")
	public String doLogin(String username, String password) {
		// 此处仅作示例模拟,真实项目需要从数据库中查询数据进行比对 
		if("zhang".equals(username) && "123456".equals(password)) {
			StpUtil.setLoginId(10001);
			return "登录成功";
		}
		return "登录失败";
	}
}
  1. Учетная запись, которая будет указывать идентификатор
// 使指定id账号的会话注销登录,对方再次访问系统时会抛出`NotLoginException`异常,场景值为-5
@RequestMapping("kickout")
public String kickout(long userId) {
	StpUtil.logoutByLoginId(userId);
	return "剔出成功";
}

Ключевой кодStpUtil.logoutByLoginId(userId)Это предложение заставляет учетную запись с указанным идентификатором выйти из системы и войти в нее (кикнуть человека в автономном режиме)

Если вы считаете, что статья написана хорошо, пожалуйста, не стесняйтесь поставить ей палец вверх Ваша поддержка - самая большая мотивация для моего обновления!

Наконец, ссылка на проект прилагается: