Слияние кода завершено, страница обновится автоматически
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-template</artifactId>
</dependency>
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-fastjson</artifactId>
</dependency>
Логин модуль
@SaIgnore
@PostMapping("/weChatRegister")
public SaResult weChatRegister(@RequestBody Map<String, String> data) {
String js_code = data.get("js_code");
Map<String, String> openIdAndUnionId = getWeChatOpenidAndUnionid.getOpenIdAndUnionId(js_code);
String openid = openIdAndUnionId.get("openid");
String unionid = openIdAndUnionId.get("unionid");
User existingUser = getUser(unionid);
if (existingUser != null) {
StpUtil.login(existingUser.getId());
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
log.info("Аккаунт {} успешно вошел в систему (loginType=login), сессионный токен token={}", existingUser.getId(), tokenInfo.getTokenValue());
return SaResult.data(tokenInfo);
}
User user = new User();
user.setUsername("微信用户");
user.setPassword("null");
user.setCreateTime(LocalDateTime.now());
user.setWechatOpenid(openid);
user.setWechatUnionid(unionid);
userService.save(user);
User newUser = getUser( Yöntem );
StpUtil.login(newUser.getId());
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
log.info("Аккаунт {} успешно вошел в систему (loginType=login), сессионный токен token={}", newUser.getId(), tokenInfo.getTokenValue());
return SaResult.data(tokenInfo);
}
```### Шаги тестирования:
+ Я прошел следующие шаги для тестирования:
Настройка перехватчика
@Configuration
public class WebConfig implements WebMvcConfigurer {
private static final Logger logger = LoggerFactory.getLogger(WebConfig.class);
@Autowired
private LoggingInterceptor loggingInterceptor;
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("")
.allowCredentials(true)
.maxAge(3600);
}
}
allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.maxAge(3600);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loggingInterceptor);
registry.addInterceptor(new SaInterceptor(handler -> {
StpUtil.checkLogin();
})).addPathPatterns();
}
}
``````yml
sa-token:
# имя токена (также является именем cookie)
token-name: satoken
# префикс токена
token-prefix: Bearer
# срок действия токена (в секундах) по умолчанию 30 дней, -1 означает вечное действие
timeout: 2592000
# минимальная активность токена (в секундах), если токен не был использован в течение этого времени, он будет заморожен, по умолчанию -1 означает отсутствие ограничений, токен никогда не будет заморожен
active-timeout: -1
# разрешено ли одновременному входу одного аккаунта с разных мест (true - разрешено, false - запрещено)
is-concurrent: true
# разделяются ли токены при одновременном входе нескольких пользователей в один аккаунт (true - разделяются, false - каждый вход создаёт новый токен)
is-share: false
# стиль токена (по умолчанию может быть uuid, simple-uuid, random-32, random-64, random-128, tik)
token-style: uuid
# включено ли логирование действий
is-log: true
```
```java
@SpringBootApplication
public class Application {
public static void main(String[] args) throws JsonProcessingException {
SpringApplication.run(Application.class, args);
}
}
```Получены следующие результаты:
При попытке входа с использованием токена происходит немедленное отключение:
```plaintext
2025-04-13 18:06:23 INFO c. m. b. c. L. LoggingInterceptor - Ответный статус: 200
2025-04-13 18:06:32 INFO c. m. b. c. L. LoggingInterceptor - Запрос URL: http://localhost:8081/login/weChatRegister, метод: POST, параметры запроса: null
2025-04-13 18:06:33 INFO com. zaxxer. hikari. HikariDataSource - HikariPool-1 - Начало. . .
2025-04-13 18:06:33 INFO com. zaxxer. hikari. pool. HikariPool - HikariPool-1 - Добавлено соединение com. mysql. cj. jdbc. ConnectionImpl@33b1e694
2025-04-13 18:06:33 INFO com. zaxxer. hikari. HikariDataSource - HikariPool-1 - Начало завершено.
SA [INFO] -->: Аккаунт 1 успешно вошёл (loginType=login), сессионный токен token=d6329e90-4b2e-4996-a379-1b64dedb9644
SA [INFO] -->: Аккаунт 1 вышел (loginType=login), сессионный токен token=7e56b24d-1127-40f4-a15c-34714f5fe918
2025-04-13 18:06:34 INFO c. m. b. controller.
```LoginController - Успешный вход пользователя 1 (loginType=login), сессионный токен token=d6329e90-4b2e-4996-a379-1b64dedb9644```
+ В коде на строке xx отмечено несоответствие описанию в документации:
+ Мое понимание заключается в следующем:
Должен быть использован один метод для инициирования выхода из системы.
Как мне избежать немедленного выхода после входа? Или как правильно инициировать выход?
Прошу подтвердить, является ли мое понимание неверным, или же проблема в документации?
```