Проект Java Spring Boot и синхронный вход и выход из форума Discuz!

я перевел из
Проект Java Spring Boot и Discuz!

Мой основной сайт Spring Boot связан с Discuz!-api-for-java был частично изменен, чтобы адаптироваться к текущему стилю Spring Boot.

Прежде всего спасибо за открытый исходный код

Открытие с Discuz! обычно делится на взаимодействие через API и взаимодействие с базой данных. На этот раз мы вводим общение через API, поэтому я должен упомянуть diskuz-ucenter-api-for-java. Прежде всего, я хотел бы поблагодарить автора оригинала. : Лян Пин (no_ten@163 .com) выложил свой код в открытый доступ, что сэкономило нам много времени.

Перемодифицированный открытый исходный код

После того, как я загрузил исходный код, я обнаружил, что этот код все еще из 2009 года, полный ретро-стиля, и первоначальный автор перевел его на основе кода PHP, поэтому многие из привычек в нем не являются привычками Java. сервлет, не поддерживает сборки Maven. Это неуместно в текущем проекте Spring Boot, поэтому я изменил исходный код и выпустил его во второй раз.
Чтобы адаптироваться к стилю Spring Boot, созданному Maven, адрес проекта: https://github.com/renfei/discuz-ucenter-api-for-java, я сделал следующие изменения:

  • Публикация пакета проекта на центральном складе Maven.
  • На основе текущего Java JDK8 исходная авторская реализация Base64 удалена, и используется java.util.Base64, предоставленный JDK8, поэтому для запуска требуется как минимум JDK8.
  • Измените стиль подчеркивания имени метода на верблюжий регистр, например, измените «uc_user_delete()» на «ucUserDelete()».
  • Измените имена переменных в стиле PHP на обычные имена переменных Java, например, измените «String $module» на «String $module».
  • Измените способ использования конфигурационного файла на способ передачи параметров в метод построения при создании экземпляра.
  • Измените сервлет конфигурации, чтобы определить свой собственный контроллер и обрабатывать HttpServletRequest и HttpServletResponse.
  • Некоторые китайские искаженные проблемы были исправлены.

Конфигурация UCenter для Discuz

Перед началом интеграции нам необходимо настроить UCenter Discuz для получения адреса интерфейса, коммуникационного ключа и APPID. Сначала перейдите в фоновый режим UCenter Discuz, добавьте приложение:
вставьте сюда описание изображения
затем заполните конфигурацию, выберите «Другое» для типа приложения, а затем дайте приложению имя, введите свой адрес для основного URL-адреса приложения и установите пароль на ключ связи самостоятельно, внизу выберите включить синхронный вход и принимать уведомления:
вставьте сюда описание изображения

Spring Boot 集成 discuz-ucenter-api-for-java

Я использую проект Spring Boot, созданный Maven, поэтому мне нужно сначала изменить pom.xml, чтобы добавить в проект diskuz-ucenter-api-for-java:

<dependency>
  <groupId>net.renfei</groupId>
  <artifactId>discuz-ucenter-api-for-java</artifactId>
  <version>1.0.7</version>
</dependency>

Тогда я лично думаю, что он разделен на две части, одна часть для получения сообщений от UCenter Discuz в качестве клиента, а другая часть для активной отправки сообщений в UCenter Discuz, поговорим об этом отдельно.

Получать сообщения от UCenter Discuz

Сначала создайте контроллер, затем создайте метод для обработки HttpServletRequest и HttpServletResponse, укажите адрес запроса UCenter @RequestMapping("/api/uc.php") и создайте экземпляр клиента net.renfei.discuz.ucenter.api.UCClient и net. .renfei.discuz.ucenter.client.Client, затем передайте HttpServletRequest в net.renfei.discuz.ucenter.api.UCClient.doAnswer() для обработки и, наконец, запишите результат в HttpServletResponse. Если конфигурация UCenter верна, Вы должны видеть, что связь в UCenter нормальная. Конкретные варианты использования следующие:

@Controller
public class UCenterController {
    
    
    @ResponseBody
    @RequestMapping("/api/uc.php")
    public void uc(HttpServletRequest request, HttpServletResponse response) throws IOException {
    
    
        UCClient ucClient = new UCClient();
        Client client = new Client("http://localhost:8080/uc_server", null, "123456789", "3","");
        String result = ucClient.doAnswer(client, request, response);
        response.getWriter().print(result);
    }
}

Активно отправлять сообщения в UCenter of Discuz

регистр

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String string = client.ucUserRegister("username","password","email");

Сначала войдите в систему, а затем войдите синхронно

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
// 登陆
String result = client.ucUserLogin(uid);
LinkedList<String> rs = XMLHelper.ucUnserialize(result);
if(rs.size() > 0){
    
    
    int uid = Integer.parseInt(rs.get(0));
    String username = rs.get(1);
    String password = rs.get(2);
    String email = rs.get(3);
    if(uid > 0) {
    
    
        //同步登陆
        String string = client.ucUserSynlogin(uid);
        //本地登陆代码
        //TODO ... ....
    } else if(uid == -1) {
    
    
        System.out.println("用户不存在,或者被删除");
    } else if(uid == -2) {
    
    
        System.out.println("密码错");
    } else {
    
    
        System.out.println("未定义");
    }
}else{
    
    
    System.out.println("Login failed");
    System.out.println(result);
}

авторизоваться

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
String string = client.ucUserLogin("username","password");

Одновременный вход

Client client = new Client("http://localhost/uc_server", null, "key", "2","");
int UID = 21; //此处是用户的UID(该UID是在论坛用户表per_ucenter_members中的用户UID)
String string = client.ucUserSynlogin(uid);

Общая проблема

Синхронный интерфейс входа выполнен успешно, но нет статуса входа

  • Симптомы: Вызовите net.renfei.discuz.ucenter.client.Client#ucUserSynlogin успешно, получите код JavaScript и успешно запросите адрес JS, но при доступе к Discuz статус входа отсутствует. Проверьте информацию заголовка ответа запрошенного JS-адреса, в Set-Cookie нет файла cookie xxxx_2132_auth.
  • Сцена обнаружения: сначала вызовите net.renfei.discuz.ucenter.client.Client#ucUserRegister, чтобы зарегистрировать пользователя, затем вызовите net.renfei.discuz.ucenter.client.Client#ucUserLogin, чтобы получить uid, а затем вызовите net.renfei.discuz. ucenter.client.Client#ucUserSynlogin выполняет синхронный вход в систему для получения кода JavaScript, и браузер запрашивает адрес JS, все из которых находятся в успешном состоянии, но доступ к Discuz не находится в состоянии входа.
  • Основная причина проблемы: после вызова net.renfei.discuz.ucenter.client.Client#ucUserRegister для регистрации пользователя информация о пользователе будет зарегистрирована в UCenter и вставлена ​​в таблицу pre_ucenter_members, но не будет автоматически вставлена ​​в таблицу pre_common_member. форума Discuz, поэтому вызовите net .renfei.discuz.ucenter.client.Client#ucUserSynlogin Синхронный вход выполнен успешно При доступе к Discuz статус входа отсутствует, поскольку в Discuz нет информации об этом пользователе.
  • Решение: Первый способ: логика зарегистрированных пользователей напрямую подключается к базе данных, а данные о пользователях вставляются в таблицы о пользователях UCenter и Discuz. Второй способ: изменить код UCenter, вставить информацию о пользователе в пользовательскую таблицу Discuz при вставке в пользовательскую таблицу UCenter.
  • Окончательное резюме: UCenter - это просто промежуточный мост, который соединяет учетные записи пользователей каждого приложения, но он не будет уведомлять каждое приложение о новом пользователе.Когда страница входа в систему, которая поставляется с Discuz, обнаруживает, что при входе в систему такого пользователя нет, он будет извлекать информацию о пользователе из UCenter.Вставьте свою собственную таблицу пользователей, поэтому после регистрации пользователя через интерфейс регистрации UCenter, если этот пользователь никогда не входил в систему Discuz, тогда в Discuz нет информации об этом пользователе.Если вы хотите чтобы войти и пройти унифицированную проверку, вам нужно вручную перейти на Discuz. Вставьте соответствующую информацию в пользовательскую таблицу , которая включает в себя несколько таблиц, см. официальную документацию.

Для получения дополнительной информации, пожалуйста, прочитайте исходный код, который не будет здесь демонстрироваться. Вы можете задать вопросы или перейти на форум моего сообщества для обсуждения: https://bbs.renfei.net/forum-44-1.html

Je suppose que tu aimes

Origine blog.csdn.net/qq_27480007/article/details/128716711
conseillé
Classement