changhongserver/web_login/src/main/java/com/mjlogin/service/AccountService.java

2868 lines
98 KiB
Java
Raw Normal View History

2026-01-18 06:48:37 +08:00
package com.mjlogin.service;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
2026-03-27 16:25:13 +08:00
import org.eclipse.jetty.util.log.Log;
2026-06-01 19:24:36 +08:00
import com.alibaba.fastjson.JSONObject;
2026-01-18 06:48:37 +08:00
import com.aliyuncs.utils.StringUtils;
import com.data.bean.AccountBean;
import com.data.bean.GameBean;
import com.data.cache.AccountCache;
import com.data.cache.BaseCache;
import com.data.cache.GameCache;
import com.data.util.ErrorCode;
import com.data.util.Utility;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.mjlogin.MainServer;
import com.mjlogin.Protocol;
import com.mjlogin.WebInterceptor;
import com.mjlogin.util.sms.RedisKey;
2026-06-01 19:24:36 +08:00
import com.mjlogin.util.sms.WeChatOpenIdValidator;
2026-01-18 06:48:37 +08:00
import com.taurus.core.entity.ITArray;
import com.taurus.core.entity.ITObject;
import com.taurus.core.entity.TArray;
import com.taurus.core.entity.TObject;
import com.taurus.core.plugin.database.DataBase;
import com.taurus.core.plugin.redis.Redis;
import com.taurus.core.plugin.redis.RedisLock;
import com.taurus.core.routes.ActionKey;
import com.taurus.core.util.Logger;
import com.taurus.core.util.StringUtil;
import com.taurus.core.util.Utils;
import com.taurus.web.Controller;
import com.taurus.web.WebException;
import redis.clients.jedis.Jedis;
public class AccountService extends Controller {
private static Logger logger = Logger.getLogger(AccountService.class);
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.PHONE_PASSWORD_LOGIN)
public final void phoneCodeLogin() throws Exception {
ITObject reqDatas = this.getParams();
String phone = reqDatas.getUtfString("phone");
String code = reqDatas.getUtfString("password");
logger.info("jefe phone:" + phone + " == code:" + code);
// 判断code 是否正确
if (Redis.use("group1_db1").exists("code" + phone)) {
String vfcode = Redis.use("group1_db1").get("code" + phone);
logger.info("jefe phone:" + phone + " == code:" + code + "vfcode:" + vfcode);
if (vfcode.equals(code)) {
String acc = md5(phone);
ITObject reqData = TObject.newInstance();
String sqluid = "SELECT id,nickname FROM uuids WHERE uuid =?";
String[] params1 = new String[1];
params1[0] = acc + "";
ITArray resultArrayuid = DataBase.use().executeQueryByTArrayLogin(sqluid, params1);
int accountUid = 0;
String nickname = "";
if (resultArrayuid.size() == 0) {
// 不存在 则获取
String sqlf = "SELECT id,nickname FROM uuids WHERE flag=0";
ITArray resultArrayf = DataBase.use().executeQueryByTArrayLogin(sqlf, new String[0]);
if (resultArrayf.size() == 0) {
return;
}
ITObject obj = resultArrayf.getTObject(0);
accountUid = obj.getInt("id");
nickname = obj.getString("nickname");
String sqlb = "UPDATE uuids SET uuid='" + acc + "' , flag=1 where id=" + accountUid;
DataBase.use().executeUpdate(sqlb);
// resData.putInt("id",accountid);
// resData.putString("nickname",nickname);
} else {
ITObject obj = resultArrayuid.getTObject(0);
accountUid = obj.getInt("id");
nickname = obj.getString("nickname");
// resData.putInt("id",accountid);
// resData.putString("nickname",nickname);
}
// 获取头像信息
String sql = "SELECT id FROM account WHERE acc =?";
String[] params2 = new String[1];
params2[0] = acc + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params2);
reqData.putUtfString("acc", acc);
reqData.putInt("sex", 1);
// String strNick = reqData.getUtfString("nick");
String strNick = nickname;
strNick = StringUtil.filterEmoji(strNick);
reqData.putUtfString("nick", strNick);
reqData.putUtfString("portrait",
"https://headerimgs2023.oss-cn-guangzhou.aliyuncs.com/headers/man_" + accountUid + ".jpg");
int accountid = 0;
if (resultArray.size() == 0) {
accountid = register(reqData);
} else {
ITObject obj = resultArray.getTObject(0);
accountid = obj.getInt("id");
}
if (acc.equals(accountid + "")) {
logger.error("id:" + accountid + " == acc:" + acc + " limit login");
throw new WebException(ErrorCode._FAILED);
}
AccountBean acc_bean = AccountCache.getAccount(accountid);
if (acc_bean == null) {
sql = String.format("SELECT * FROM account WHERE id =?");
String[] params3 = new String[1];
params3[0] = accountid + "";
ITArray resultArray2 = DataBase.use().executeQueryByTArrayLogin(sql, params3);
if (resultArray2.size() == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = resultArray2.getTObject(0);
UpdateUserData(userData, accountid);
acc_bean = AccountCache.getAccount(accountid);
}
String session = acc_bean.redis_key;
this.setSession(session);
if (resultArray.size() > 0) {
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData = TObject.newInstance();
userData.putUtfString("nick", reqData.getUtfString("nick"));
userData.putUtfString("portrait", reqData.getUtfString("portrait"));
userData.putInt("sex", reqData.getInt("sex"));
updateSession(reqData, accountid);
}
}
String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + acc_bean.id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(acc + "_" + accountid + "_" + System.currentTimeMillis()
+ "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
this.sendResponse(ErrorCode._SUCC, resData);
} else {
throw new WebException(ErrorCode._FAILED);
}
}
throw new WebException(ErrorCode._FAILED);
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.GET_VERIFICATION_CODE)
public final void getVerificationCode() throws Exception {
ITObject reqData = this.getParams();
String phone = reqData.getUtfString("phone");
logger.info("jefe phone:" + phone);
// 检测短信是否有发送过
if (Redis.use("group1_db1").exists("code" + phone)) {
throw new WebException(ErrorCode._FAILED);
} else {
String testUsername = "liubo2023"; // 在短信宝注册的用户名
String testPassword = "Jefe2014"; // 在短信宝注册的密码
String testPhone = phone;
// 创建Random对象
Random random = new Random();
// 生成随机6位数字
int number = random.nextInt(900000) + 100000;
String vfcode = number + "";
Redis.use("group1_db1").set("code" + phone, vfcode);
Redis.use("group1_db1").expire("code" + phone, 300);
String testContent = "【湘悦】您的验证码是" + vfcode + ",5分钟内有效。若非本人操作请忽略此消息。"; // 注意测试时,也请带上公司简称或网站签名,发送正规内容短信。千万不要发送无意义的内容:例如
// 测一下、您好。否则可能会收不到
String httpUrl = "http://api.smsbao.com/sms";
StringBuffer httpArg = new StringBuffer();
httpArg.append("u=").append(testUsername).append("&");
httpArg.append("p=").append(md5(testPassword)).append("&");
httpArg.append("m=").append(testPhone).append("&");
httpArg.append("c=").append(encodeUrlString(testContent, "UTF-8"));
String result = request(httpUrl, httpArg.toString());
logger.info("jefe result:" + result);
this.sendResponse(ErrorCode._SUCC, reqData);
}
}
public static String request(String httpUrl, String httpArg) {
BufferedReader reader = null;
String result = null;
StringBuffer sbf = new StringBuffer();
httpUrl = httpUrl + "?" + httpArg;
2026-06-01 19:24:36 +08:00
try {
// System.out.println("httpUrl:"+httpUrl);
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = reader.readLine();
if (strRead != null) {
sbf.append(strRead);
while ((strRead = reader.readLine()) != null) {
sbf.append("\n");
sbf.append(strRead);
}
}
reader.close();
result = sbf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String request(String httpUrl) {
BufferedReader reader = null;
String result = null;
StringBuffer sbf = new StringBuffer();
2026-01-18 06:48:37 +08:00
try {
URL url = new URL(httpUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
InputStream is = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
String strRead = reader.readLine();
if (strRead != null) {
sbf.append(strRead);
while ((strRead = reader.readLine()) != null) {
sbf.append("\n");
sbf.append(strRead);
}
}
reader.close();
result = sbf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String md5(String plainText) {
StringBuffer buf = null;
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
int i;
buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return buf.toString();
}
public static String encodeUrlString(String str, String charset) {
String strret = null;
if (str == null)
return str;
try {
strret = java.net.URLEncoder.encode(str, charset);
} catch (Exception e) {
e.printStackTrace();
return null;
}
return strret;
}
/**
*
* @return
* @throws Exception
*/
private final int register(ITObject reqData) throws Exception {
int count = 0;
long id = 0;
do {
id = Long.parseLong(Redis.use("group1_db1").rpop("free_account"));
String sql = "SELECT id FROM account WHERE id =?";
String[] params = new String[1];
params[0] = id + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params);
if (resultArray.size() == 0) {
break;
}
} while (count++ <= 10);
if (id == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = TObject.newInstance();
userData.putInt("id", (int) id);
if (reqData.containsKey("phone")) {
///
userData.putUtfString("phone", reqData.getUtfString("phone"));
userData.putUtfString("nick", "景都" + id + "");
userData.putInt("sex", 1);
userData.putUtfString("portrait", StringUtil.Empty);
2026-03-27 16:25:13 +08:00
userData.putUtfString("acc", reqData.getUtfString("phone") + "_" + UUID.randomUUID());
2026-01-18 06:48:37 +08:00
} else {
userData.putUtfString("acc", reqData.getUtfString("acc"));
userData.putUtfString("portrait", reqData.getUtfString("portrait"));
String nick = reqData.getUtfString("nick");
nick = nick.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", " ");
userData.putUtfString("nick", nick);
2026-03-27 16:25:13 +08:00
int sex = reqData.getInt("sex") == null ? 1 : reqData.getInt("sex");
2026-01-18 06:48:37 +08:00
if (sex == 0) {
sex = 1;
reqData.putInt("sex", sex);
}
userData.putInt("sex", sex);
}
userData.putInt("diamo", MainServer.DEFAULT_DAIMO);
userData.putInt("mng", 0);
userData.putInt("type", 0);
long reg_time = System.currentTimeMillis() / 1000;
userData.putLong("reg_time", reg_time);
userData.putString("device_code", reqData.getUtfString("deviceCode"));
int result = DataBase.use().insert("account", userData);
if (result == -1) {
throw new WebException(ErrorCode._FAILED);
}
userData.putInt("invitation", 1);
String session = updateSession(userData, (int) id);
this.setSession(session);
return (int) id;
}
private final int create_register(int mng, String password, ArrayList<String> nickList, ArrayList<String> headList)
throws Exception {
int count = 0;
long id = 0;
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
String strId = Redis.use("group1_db1").rpop("free_account");
if (StringUtils.isEmpty(strId)) {
break;
}
list.add(strId);
}
// logger.info("free_account:"+list.toString());
Collections.shuffle(list);
do {
id = Long.parseLong(list.remove(0));
String sql = "SELECT id FROM account WHERE id =?";
String[] params = new String[1];
params[0] = id + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params);
if (resultArray.size() == 0) {
break;
}
} while (count++ <= 10);
for (int i = 0; i < list.size(); i++) {
Redis.use("group1_db1").lpush("free_account", list.get(i));
}
if (id == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = TObject.newInstance();
userData.putInt("id", (int) id);
userData.putUtfString("acc", "" + id);
if (headList.size() > 0) {
userData.putUtfString("portrait", headList.remove(0)); // 头像
} else {
userData.putUtfString("portrait", "");
}
String nick = "";
if (nickList.size() > 0) {
nick = nickList.remove(0);
}
nick = nick.replaceAll("[^a-zA-Z0-9\\u4e00-\\u9fa5]", " ");
userData.putUtfString("nick", nick);
int sex = 1;
if (sex == 0) {
sex = 1;
}
userData.putInt("sex", sex);
userData.putInt("diamo", 0);
userData.putInt("mng", 0);
userData.putInt("regTime", mng);
userData.putInt("type", 0);
userData.putUtfString("password", Utils.getMD5Hash(password));
long reg_time = System.currentTimeMillis() / 1000;
userData.putLong("reg_time", reg_time);
logger.info("create xingyunhao account:" + userData.toJson() + " password:" + password);
int result = DataBase.use().insert("account", userData);
if (result == -1) {
throw new WebException(ErrorCode._FAILED);
}
userData.putInt("invitation", 1);
String session = updateSession(userData, (int) id);
this.setSession(session);
return (int) id;
}
/**
*
* @return
* @throws Exception
*/
private final int UpdateUserData(ITObject reqData, long id) throws Exception {
ITObject userData = TObject.newInstance();
userData.putInt("id", (int) id);
userData.putUtfString("acc", reqData.getUtfString("acc"));
userData.putUtfString("portrait", reqData.getUtfString("portrait"));
userData.putUtfString("nick", reqData.getUtfString("nick"));
int sex = reqData.getInt("sex");
if (sex == 0) {
sex = 1;
reqData.putInt("sex", sex);
}
userData.putInt("sex", sex);
userData.putInt("mng", 0);
userData.putInt("type", 0);
if (reqData.containsKey("diamo")) {
userData.putInt("diamo", reqData.getInt("diamo"));
}
userData.putInt("invitation", 1);
String session = updateSession(userData, (int) id);
this.setSession(session);
return (int) id;
}
/**
* uid
*
* @throws Exception
*/
@ActionKey(value = Protocol.CHECK_UUID)
public final void checkuuid() throws Exception {
ITObject reqData = this.getParams();
String uuid = reqData.getUtfString("uuid");
ITObject resData = TObject.newInstance();
try {
String sql = "SELECT id,nickname FROM uuids WHERE uuid ='" + uuid + "'";
String[] params = new String[1];
params[0] = uuid + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params);
int accountid = 0;
String nickname = "";
if (resultArray.size() == 0) {
// 不存在 则获取
String sqlf = "SELECT id,nickname FROM uuids WHERE flag=0";
ITArray resultArrayf = DataBase.use().executeQueryByTArrayLogin(sqlf, new String[0]);
if (resultArrayf.size() == 0) {
return;
}
ITObject obj = resultArrayf.getTObject(0);
accountid = obj.getInt("id");
nickname = obj.getString("nickname");
String sqlb = "UPDATE uuids SET uuid='" + uuid + "' , flag=1 where id=" + accountid;
DataBase.use().executeUpdate(sqlb);
resData.putInt("id", accountid);
resData.putString("nickname", nickname);
} else {
ITObject obj = resultArray.getTObject(0);
accountid = obj.getInt("id");
nickname = obj.getString("nickname");
resData.putInt("id", accountid);
resData.putString("nickname", nickname);
}
this.sendResponse(ErrorCode._SUCC, resData);
} finally {
return;
}
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.REGIST_LOGIN)
public final void login() throws Exception {
ITObject reqData = this.getParams();
String acc = reqData.getUtfString("acc");
logger.info("acc:" + acc + " regist login");
Jedis jedis0 = Redis.use("group1_db0").getJedis();
RedisLock lock = new RedisLock("wx_" + acc, jedis0);
String deviceCode = reqData.getUtfString("deviceCode");
logger.info("deviceCode:" + deviceCode);
logger.info("reqData:" + reqData);
boolean havePassword = false;
if (acc.length() < 10) {
throw new WebException(ErrorCode._FAILED);
}
try {
// String sql = "SELECT id FROM account WHERE acc ='" + acc + "'";
// ITArray resultArray = DataBase.use().executeQueryByTArray(sql);
String sql = "SELECT id FROM account WHERE acc =?";
String[] params2 = new String[1];
params2[0] = acc + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params2);
String strNick = reqData.getUtfString("nick");
strNick = StringUtil.filterEmoji(strNick);
reqData.putUtfString("nick", strNick);
// String nickCountsql = String.format(
// "SELECT id FROM account a,group_member gm WHERE a.id=gm.uid and a.nick ='%s' and a.device_code='%s'",
// strNick, deviceCode);
// String nickCountsql = "SELECT id FROM account a,group_member gm WHERE a.id=gm.uid and a.nick ='" + strNick
// + "'";
// List<Map<String, String>> nickDeviceCount = DataBase.use().executeQuery(nickCountsql);
int accountid = 0;
if (resultArray.size() == 0) {
accountid = register(reqData);
reqData.putUtfString("isBangding", "0");
} else {
ITObject obj = resultArray.getTObject(0);
accountid = obj.getInt("id");
String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id="
+ accountid;
DataBase.use().executeUpdate(updateDeviceCodeSql);
reqData.putUtfString("isBangding", obj.getInt("is_bangding") + "");
}
if (acc.equals(accountid + "")) {
logger.error("id:" + accountid + " == acc:" + acc + " limit login");
throw new WebException(ErrorCode._FAILED);
}
AccountBean acc_bean = AccountCache.getAccount(accountid);
if (acc_bean == null) {
sql = String.format("SELECT * FROM account WHERE id =?");
String[] params = new String[1];
params[0] = accountid + "";
ITArray resultArray2 = DataBase.use().executeQueryByTArrayLogin(sql, params);
if (resultArray2.size() == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = resultArray2.getTObject(0);
UpdateUserData(userData, accountid);
acc_bean = AccountCache.getAccount(accountid);
}
String session = acc_bean.redis_key;
this.setSession(session);
if (resultArray.size() > 0) {
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData = TObject.newInstance();
userData.putUtfString("nick", reqData.getUtfString("nick"));
userData.putUtfString("portrait", reqData.getUtfString("portrait"));
userData.putInt("sex", reqData.getInt("sex"));
updateSession(reqData, accountid);
}
}
// password不存在则叫用户重置密码
String passwordsql = String.format("SELECT password FROM account WHERE id =?");
String[] params = new String[1];
params[0] = acc_bean.id + "";
ITArray passwordArray = DataBase.use().executeQueryByTArrayLogin(passwordsql, params);
if (passwordArray.size() > 0) {
ITObject userData = passwordArray.getTObject(0);
String password = userData.getString("password");
if (password == null || password.length() == 0) {
havePassword = false;
} else {
havePassword = true;
}
}
String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + acc_bean.id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(acc + "_" + accountid + "_" + System.currentTimeMillis()
+ "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
resData.putBoolean("havegroup", true);
// // 判断是否已经进入圈子
// String haveGroupsql = String.format("SELECT uid,partnerLev FROM group_member gm WHERE gm.uid ='%d'",
// accountid);
// List<Map<String, String>> haveGroupsqlCount = DataBase.use().executeQuery(haveGroupsql);
// if (haveGroupsqlCount.size() > 0) {
// // 这里只能判断第一条数据,如果多个大联盟需要区分哪个联盟的代理
// int partnerLev = haveGroupsqlCount.get(0).get("partnerLev") == null ? 0
// : Integer.parseInt(haveGroupsqlCount.get(0).get("partnerLev"));
// if (partnerLev > 0) {
// throw new WebException(ErrorCode._FAILED);
// }
// resData.putBoolean("havegroup", true);
// } else {
// resData.putBoolean("havegroup", false);
// }
// logger.info("havePassword:" + resData.getBoolean("havePassword"));
// logger.info("havegroup:" + resData.getBoolean("havegroup"));
this.sendResponse(ErrorCode._SUCC, resData);
} finally {
lock.unlock();
}
}
/**
* 2
*
* @throws Exception
*/
@ActionKey(value = Protocol.REGIST_LOGIN_2)
public final void login2() throws Exception {
ITObject reqData = this.getParams();
String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
String deviceCode = object.get("deviceCode").toString().replaceAll("\"", "");
String acc = object.get("acc").toString().replaceAll("\"", "");
reqData.putUtfString("acc", acc);
Jedis jedis0 = Redis.use("group1_db0").getJedis();
RedisLock lock = new RedisLock("wx_" + acc, jedis0);
logger.info("解密后:" + object);
// owbRv6qRVVrnzmDpk0vh3fV1iH1Q
boolean havePassword = false;
int isBangding = 0;
try {
String sql = "SELECT * FROM account WHERE acc =?";
String[] params = new String[1];
params[0] = reqData.getUtfString("acc") + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params);
String strNick = object.get("nick").toString().replaceAll("\"", "");
strNick = StringUtil.filterEmoji(strNick);
reqData.putUtfString("nick", strNick);
int accountid = 0;
if (resultArray.size() == 0) {
2026-03-27 16:25:13 +08:00
reqData.putInt("sex", Integer.parseInt(object.get("sex").toString().replaceAll("\"", "")));
2026-01-28 15:57:42 +08:00
accountid = register(reqData);
2026-01-18 06:48:37 +08:00
} else {
ITObject obj = resultArray.getTObject(0);
accountid = obj.getInt("id");
String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id="
+ accountid;
DataBase.use().executeUpdate(updateDeviceCodeSql);
isBangding = obj.getInt("is_bangding");
}
if (acc.equals(accountid + "")) {
logger.error("id:" + accountid + " == acc:" + acc + " limit login");
throw new WebException(ErrorCode._FAILED);
}
AccountBean acc_bean = AccountCache.getAccount(accountid);
if (acc_bean == null) {
sql = String.format("SELECT * FROM account WHERE id =?");
String[] params1 = new String[1];
params1[0] = accountid + "";
ITArray resultArray2 = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (resultArray2.size() == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = resultArray2.getTObject(0);
UpdateUserData(userData, accountid);
acc_bean = AccountCache.getAccount(accountid);
}
String session = acc_bean.redis_key;
this.setSession(session);
if (resultArray.size() > 0) {
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData = TObject.newInstance();
userData.putUtfString("nick", object.get("nick").toString().replaceAll("\"", ""));
userData.putUtfString("portrait", object.get("portrait").toString().replaceAll("\"", ""));
userData.putInt("sex", Integer.parseInt(object.get("sex").toString().replaceAll("\"", "")));
updateSession(reqData, accountid);
}
}
String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + acc_bean.id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(acc + "_" + accountid + "_" + System.currentTimeMillis()
+ "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
resData.putBoolean("havegroup", true);
resData.putString("isBangding", "1");
2026-05-01 15:25:05 +08:00
// // 默认锁住账户
// String lockSql = "update account set is_lock=? WHERE id=?";
// String[] params3 = new String[2];
// params3[0] = 1 + "";
// params3[1] = accountid + "";
2026-06-01 19:24:36 +08:00
//
2026-05-01 15:25:05 +08:00
// DataBase.use().executeUpdateLogin(lockSql, params3);
2026-01-18 06:48:37 +08:00
this.sendResponse(ErrorCode._SUCC, resData);
} finally {
lock.unlock();
}
}
/**
*
*
* @throws Exception
*/
public final void createXingYunHao(String str_num, String str_mng, String str_password, String str_value)
throws Exception {
if (StringUtil.isEmpty(str_num) || StringUtil.isEmpty(str_mng) || StringUtil.isEmpty(str_password)
|| StringUtil.isEmpty(str_value)) {
logger.error("can't create xingyun hao...........");
return;
}
int num = 0;
int mng = 0;// reqData.getInt("mng");
try {
num = Integer.parseInt(str_num);
mng = Integer.parseInt(str_mng);
} catch (Exception e) {
return;
}
String listSql = "select * from old_account";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(listSql, new String[0]);
ArrayList<String> nameList = new ArrayList<>();
ArrayList<String> headList = new ArrayList<>();
for (int i = 0; i < resultArray.size(); i++) {
ITObject userData = resultArray.getTObject(i);
String nick = userData.getUtfString("nick");
nameList.add(nick);
String head = userData.getUtfString("portrait");
headList.add(head);
}
Collections.shuffle(nameList);
Collections.shuffle(headList);
ArrayList<Integer> accList = new ArrayList<>();
for (int i = 0; i < num; i++) {
String sql = "";
int accountid = create_register(mng, str_password, nameList, headList);
AccountBean acc_bean = AccountCache.getAccount(accountid);
if (acc_bean == null) {
sql = String.format("SELECT * FROM account WHERE id =?");
String[] params1 = new String[1];
params1[0] = accountid + "";
ITArray resultArray2 = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (resultArray2.size() == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = resultArray2.getTObject(0);
UpdateUserData(userData, accountid);
acc_bean = AccountCache.getAccount(accountid);
}
Redis.use("group1_db1").sadd("gods", "" + accountid);
Redis.use("group1_db1").hset("gods_value", "" + accountid, str_value);
accList.add(accountid);
}
String sourceString = ""; // 待写入字符串
for (int i = 0; i < accList.size(); i++) {
logger.info("" + accList.get(i) + " " + str_password);
sourceString += "" + accList.get(i) + " " + str_password + "\n";
}
for (int i = 0; i < accList.size(); i++) {
logger.info("sadd gods " + accList.get(i));
sourceString += "sadd gods " + accList.get(i) + "\n";
logger.info("hset gods_value " + accList.get(i) + " " + str_value);
sourceString += "hset gods_value " + accList.get(i) + " " + str_value + "\n";
}
byte[] sourceByte = sourceString.getBytes();
if (null != sourceByte) {
try {
Date dNow = new Date();
SimpleDateFormat ft = new SimpleDateFormat("yyyy_MM_dd_hh_mm_ss");
File file = new File("/usr/local/tomcat/logs/xingyunhao_" + ft.format(dNow) + ".txt"); // 文件路径(路径+文件名)
if (!file.exists()) { // 文件不存在则创建文件,先创建目录
File dir = new File(file.getParent());
dir.mkdirs();
file.createNewFile();
}
FileOutputStream outStream = new FileOutputStream(file); // 文件输出流用于将数据写入文件
outStream.write(sourceByte);
outStream.close(); // 关闭文件输出流
} catch (Exception e) {
e.printStackTrace();
}
}
}
private final ITObject fillLoginData(String session, int accountid) {
ITObject resData = TObject.newInstance();
ITObject userData = TObject.newInstance();
resData.putTObject("account", userData);
resData.putUtfString("session_id", session);
resData.putTArray("games", getOnlineGames());
Jedis jedis0 = Redis.use("group1_db0").getJedis();
try {
Map<String, String> map = jedis0.hgetAll(session);
userData.putInt("id", accountid);
userData.putInt("diamo", Integer.parseInt(map.get("diamo")));
userData.putUtfString("nick", map.get("nick"));
userData.putUtfString("portrait", map.get("portrait"));
userData.putInt("sex", Integer.parseInt(map.get("sex")));
userData.putInt("type", Integer.parseInt(map.get("type")));
int mng = Integer.parseInt(map.get("mng"));
userData.putInt("mng", mng);
String phone = map.get("phone");
if (StringUtil.isNotEmpty(phone)) {
userData.putUtfString("phone", phone);
}
String address = map.get("address");
if (StringUtil.isNotEmpty(address)) {
userData.putUtfString("address", address);
}
String real_info = map.get("real_info");
if (StringUtil.isNotEmpty(real_info)) {
userData.putTObject("real_info", TObject.newFromJsonData(real_info));
}
String oldRoom = Utility.getOldRoomV2(jedis0, 0, session, accountid);
if (StringUtil.isNotEmpty(oldRoom)) {
String roomid = oldRoom.replace("room:", "");
String group = jedis0.hget(oldRoom, "group");
int groupId = 0;
if (StringUtil.isNotEmpty(group)) {
groupId = Integer.parseInt(group);
}
userData.putUtfString("roomid", roomid);
userData.putInt("groupId", groupId);
}
} finally {
jedis0.close();
}
resData.putUtfString("groupWeb", MainServer.GROUP_WEB_URL);
2026-03-27 16:25:13 +08:00
logger.info("reqData:" + resData);
2026-01-18 06:48:37 +08:00
return resData;
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.QUICK_LOGIN, validate = WebInterceptor.V_SESSION)
public final void fastLogin() throws Exception {
// throw new WebException(ErrorCode.BAN_LOGIN);
String session = this.getSession();
String token = this.getTokens();
ITObject reqData = this.getParams();
String deviceCode = reqData.getUtfString("deviceCode");
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
AccountBean acc_bean = AccountCache.getAccount(session);
ITObject resData = fillLoginData(session, acc_bean.id);
String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + acc_bean.id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
// String deviceCode = resData.getUtfString("deviceCode");
// String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id="+acc_bean.id;
// DataBase.use().executeUpdate(updateDeviceCodeSql);
boolean havePassword = true;
// String sql = String.format("SELECT password FROM account WHERE id ='%d'", acc_bean.id);
// ITArray resultArray = DataBase.use().executeQueryByTArray(sql);
// if (resultArray.size() > 0) {
// ITObject userData = resultArray.getTObject(0);
// String password = userData.getString("password");
// if (password == null || password.length() == 0) {
// havePassword = false;
// }
// String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id=" + acc_bean.id;
// DataBase.use().executeUpdate(updateDeviceCodeSql);
//
// } else {
// havePassword = false;
// }
resData.putString("token", token);
resData.putBoolean("havePassword", havePassword);
resData.putBoolean("havegroup", true);
// // 判断是否已经进入圈子
// String haveGroupsql = String.format("SELECT uid FROM group_member gm WHERE gm.uid ='%d'", acc_bean.id);
// List<Map<String, String>> haveGroupsqlCount = DataBase.use().executeQuery(haveGroupsql);
// if (haveGroupsqlCount.size() > 0) {
// resData.putBoolean("havegroup", true);
// } else {
// resData.putBoolean("havegroup", false);
// }
this.sendResponse(ErrorCode._SUCC, resData);
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.QUICK_LOGIN_2, validate = WebInterceptor.V_SESSION)
public final void fastLogin2() throws Exception {
// throw new WebException(ErrorCode.BAN_LOGIN);
String session = this.getSession();
String token = this.getTokens();
ITObject reqData = this.getParams();
String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
String deviceCode = object.get("deviceCode").toString().replaceAll("\"", "");
// String key = session + "_token";
// Set<String> canTokenList = Redis.use("group1_db0").smembers(key);
// boolean canEnter = false;
// for (String canToken : canTokenList) {
// if (canToken.equalsIgnoreCase(token)) {
// canEnter = true;
// }
// }
// if (!canEnter) {
// throw new WebException(ErrorCode.BAN_LOGIN);
// }
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
AccountBean acc_bean = AccountCache.getAccount(session);
ITObject resData = fillLoginData(session, acc_bean.id);
String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + acc_bean.id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
// String deviceCode = resData.getUtfString("deviceCode");
// String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id="+acc_bean.id;
// DataBase.use().executeUpdate(updateDeviceCodeSql);
boolean havePassword = true;
String sql = String.format("SELECT is_lock,device_code FROM account WHERE id ='%d'", acc_bean.id);
ITArray resultArray = DataBase.use().executeQueryByTArray(sql);
if (resultArray.size() > 0) {
ITObject obj = resultArray.getTObject(0);
int isLock = obj.getInt("is_lock");
resData.putInt("is_lock", isLock);
String saveDeviceCode = obj.getString("device_code");
if (isLock == 1 && !deviceCode.equalsIgnoreCase(saveDeviceCode)) {
throw new WebException(ErrorCode.IS_LOCK);
}
String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id=" + acc_bean.id;
DataBase.use().executeUpdate(updateDeviceCodeSql);
}
resData.putString("token", token);
resData.putBoolean("havePassword", havePassword);
resData.putBoolean("havegroup", true);
// // 判断是否已经进入圈子
// String haveGroupsql = String.format("SELECT uid FROM group_member gm WHERE gm.uid ='%d'", acc_bean.id);
// List<Map<String, String>> haveGroupsqlCount = DataBase.use().executeQuery(haveGroupsql);
// if (haveGroupsqlCount.size() > 0) {
// resData.putBoolean("havegroup", true);
// } else {
// resData.putBoolean("havegroup", false);
// }
this.sendResponse(ErrorCode._SUCC, resData);
}
@ActionKey(value = Protocol.ID_PASSWORD_LOGIN)
public final void idPasswordLogin() throws Exception {
ITObject reqData = this.getParams();
Integer id = 0;
try {
id = reqData.getInt("id");
} catch (Exception e) {
throw new WebException(ErrorCode._FAILED);
}
if (id < 0) {
throw new WebException(ErrorCode._FAILED);
}
String uuidCode = reqData.getUtfString("uuidCode");
String uuid = Redis.use("group1_db0").hget("{user}:" + id, "code");
if (StringUtils.isEmpty(uuidCode) || !uuidCode.equalsIgnoreCase(uuid)) {
throw new WebException(ErrorCode._FAILED);
}
String deviceCode = reqData.getUtfString("deviceCode");
if (StringUtils.isEmpty(deviceCode)) {
throw new WebException(ErrorCode._FAILED);
}
String accessDevice = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
if (StringUtil.isNotEmpty(accessDevice)) {
String accessDeviceCount = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
long count = Long.parseLong(accessDeviceCount);
if (count < 1000) {
count = count + 1;
Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
Redis.use("group1_db0").expire("device:accessDevice", 86400);
} else {
throw new WebException(ErrorCode._NO_SESSION);
}
// count = count + 1;
// Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
} else {
Redis.use("group1_db0").hset("device:accessDevice", deviceCode, "1");
Redis.use("group1_db0").expire("device:accessDevice", 86400);
// Redis.use("group1_db0").expire("device:accessDevice", 7200);
}
String password = reqData.getUtfString("password");
if (StringUtil.isEmpty(password)) {
throw new WebException(ErrorCode._FAILED);
}
logger.info("==========> password111 = " + password);
// String superPwd = Redis.use("group1_db1").get("superpwd2021");
// String sql = "";
// if (!StringUtil.isEmpty(superPwd)) {
// if (!password.equals(superPwd)) {
// password = Utils.getMD5Hash(password);
// sql = String.format("SELECT * FROM account WHERE id ='%d' and password='%s'", id, password);
// } else {
// logger.info("==========> password = " + password);
//
// sql = String.format("SELECT * FROM account WHERE id ='%d' ", id);
// }
// } else {
// password = Utils.getMD5Hash(password);
// sql = String.format("SELECT * FROM account WHERE id ='%d' and password='%s'", id, password);
// }
// SELECT * FROM account WHERE id =1 and password='' or 1=1
String sql = String.format("SELECT * FROM account WHERE id =? and password=?");
String idPwdBan = Redis.use("group1_db0").get(id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
password = Utils.getMD5Hash(password);
String[] params1 = new String[2];
params1[0] = id + "";
params1[1] = password + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (resultArray.size() == 0) {
if (Redis.use("group1_db0").exists(id + "_pwd_token")) {
Redis.use("group1_db0").incrBy(id + "_pwd_token", 1);
} else {
Redis.use("group1_db0").set(id + "_pwd_token", 1 + "");
Redis.use("group1_db0").expire(id + "_pwd_token", 300);
}
String idPwdToken = Redis.use("group1_db0").get(id + "_pwd_token");
if (StringUtil.isNotEmpty(idPwdToken)) {
long count = Long.parseLong(idPwdToken);
if (count >= 20) {
Redis.use("group1_db0").set(id + "_login_ban", "1");
Redis.use("group1_db0").expire(id + "_login_ban", 1800);
logger.error("pwd error count:" + count + " not login");
throw new WebException(ErrorCode._NO_SESSION);
}
}
throw new WebException(ErrorCode._FAILED);
}
Jedis jedis1 = Redis.use("group1_db1").getJedis();
Set<String> banDeviceList = jedis1.smembers("bandevice");
for (String banDevice : banDeviceList) {
if (banDevice.equalsIgnoreCase(deviceCode)) {
jedis1.close();
throw new WebException(ErrorCode._FAILED);
}
}
jedis1.close();
ITObject userData = resultArray.getTObject(0);
int accountid = userData.getInt("id");
UpdateUserData(userData, accountid);
AccountBean acc_bean = AccountCache.getAccount(accountid);
String session = acc_bean.redis_key;
this.setSession(session);
if (resultArray.size() > 0) {
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData1 = TObject.newInstance();
userData1.putUtfString("nick", userData.getUtfString("nick"));
userData1.putUtfString("portrait", userData.getUtfString("portrait"));
userData1.putInt("sex", userData.getInt("sex"));
updateSession(userData, accountid);
}
logger.info("id:" + id + ", device_code=" + deviceCode);
String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id=" + id;
DataBase.use().executeUpdate(updateDeviceCodeSql);
}
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(
id + "_" + password + "_" + System.currentTimeMillis() + "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
// // 判断是否已经进入圈子
// String haveGroupsql = String.format("SELECT uid FROM group_member gm WHERE gm.uid ='%d'", acc_bean.id);
// List<Map<String, String>> haveGroupsqlCount = DataBase.use().executeQuery(haveGroupsql);
// if (haveGroupsqlCount.size() > 0) {
// resData.putBoolean("havegroup", true);
// } else {
// resData.putBoolean("havegroup", false);
// }
resData.putBoolean("havegroup", true);
logger.info(resData.getBoolean("havegroup"));
this.sendResponse(ErrorCode._SUCC, resData);
// }finally {
// lock.unlock();
// }
}
@ActionKey(value = Protocol.ID_PASSWORD_LOGIN_2)
public final void idPasswordLogin2() throws Exception {
ITObject reqData = this.getParams();
String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
String deviceCode = object.get("deviceCode").toString().replaceAll("\"", "");
String password = object.get("password").toString().replaceAll("\"", "");
Integer id = Integer.parseInt(object.get("id").toString().replaceAll("\"", ""));
logger.info("==========> password111 = " + password);
if (id < 0) {
throw new WebException(ErrorCode._FAILED);
}
// String uuidCode = reqData.getUtfString("uuidCode");
// String uuid = Redis.use("group1_db0").hget("{user}:" + id, "code");
//
// if (StringUtils.isEmpty(uuidCode) || !uuidCode.equalsIgnoreCase(uuid)) {
// throw new WebException(ErrorCode._FAILED);
// }
if (StringUtils.isEmpty(deviceCode)) {
logger.error("deviceCode:null" + "--" + ErrorCode._FAILED);
throw new WebException(ErrorCode._FAILED);
}
String accessDevice = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
if (StringUtil.isNotEmpty(accessDevice)) {
String accessDeviceCount = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
long count = Long.parseLong(accessDeviceCount);
if (count < 1000) {
count = count + 1;
Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
Redis.use("group1_db0").expire("device:accessDevice", 86400);
} else {
throw new WebException(ErrorCode._NO_SESSION);
}
// count = count + 1;
// Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
} else {
Redis.use("group1_db0").hset("device:accessDevice", deviceCode, "1");
Redis.use("group1_db0").expire("device:accessDevice", 86400);
}
if (StringUtil.isEmpty(password)) {
throw new WebException(ErrorCode._FAILED);
}
// String superPwd = Redis.use("group1_db1").get("superpwd2021");
// String sql = "";
// if (!StringUtil.isEmpty(superPwd)) {
// if (!password.equals(superPwd)) {
// password = Utils.getMD5Hash(password);
// sql = String.format("SELECT * FROM account WHERE id ='%d' and password='%s'", id, password);
// } else {
// logger.info("==========> password = " + password);
//
// sql = String.format("SELECT * FROM account WHERE id ='%d' ", id);
// }
// } else {
// password = Utils.getMD5Hash(password);
// sql = String.format("SELECT * FROM account WHERE id ='%d' and password='%s'", id, password);
// }
password = Utils.getMD5Hash(password);
String sql = String.format("SELECT * FROM account WHERE id =? and password=?");
String idPwdBan = Redis.use("group1_db0").get(id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
String[] params1 = new String[2];
params1[0] = id + "";
params1[1] = password + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (resultArray.size() == 0) {
if (Redis.use("group1_db0").exists(id + "_pwd_token")) {
Redis.use("group1_db0").incrBy(id + "_pwd_token", 1);
} else {
Redis.use("group1_db0").set(id + "_pwd_token", 1 + "");
Redis.use("group1_db0").expire(id + "_pwd_token", 300);
}
String idPwdToken = Redis.use("group1_db0").get(id + "_pwd_token");
if (StringUtil.isNotEmpty(idPwdToken)) {
long count = Long.parseLong(idPwdToken);
if (count >= 10) {
Redis.use("group1_db0").set(id + "_login_ban", "1");
Redis.use("group1_db0").expire(id + "_login_ban", 1800);
logger.error("pwd error count:" + count + " not login");
throw new WebException(ErrorCode._NO_SESSION);
}
}
// logger.error("id:" + id + "--" + ErrorCode._FAILED);
// logger.error(sql + "----" + ErrorCode._FAILED);
throw new WebException(ErrorCode._FAILED);
}
// 判断设备是否已经锁定
int isLock = resultArray.getTObject(0).getInt("is_lock");
String saveDeviceCode = resultArray.getTObject(0).getString("device_code");
if (isLock == 1 && !deviceCode.equalsIgnoreCase(saveDeviceCode)) {
throw new WebException(ErrorCode.IS_LOCK);
}
Set<String> banDeviceList = Redis.use("group1_db1").smembers("bandevice");
for (String banDevice : banDeviceList) {
if (banDevice.equalsIgnoreCase(deviceCode)) {
logger.error("deviceCode:" + deviceCode + "--" + ErrorCode._FAILED);
throw new WebException(ErrorCode._FAILED);
}
}
ITObject userData = resultArray.getTObject(0);
int accountid = userData.getInt("id");
UpdateUserData(userData, accountid);
AccountBean acc_bean = AccountCache.getAccount(accountid);
String session = acc_bean.redis_key;
this.setSession(session);
if (resultArray.size() > 0) {
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData1 = TObject.newInstance();
userData1.putUtfString("nick", userData.getUtfString("nick"));
userData1.putUtfString("portrait", userData.getUtfString("portrait"));
userData1.putInt("sex", userData.getInt("sex"));
updateSession(userData, accountid);
}
logger.info("id:" + id + ", device_code=" + deviceCode);
String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id=" + id;
DataBase.use().executeUpdate(updateDeviceCodeSql);
}
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(
id + "_" + password + "_" + System.currentTimeMillis() + "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
resData.putBoolean("havegroup", true);
resData.putInt("is_lock", isLock);
// // 判断是否已经进入圈子
// String haveGroupsql = String.format("SELECT uid FROM group_member gm WHERE gm.uid ='%d'", acc_bean.id);
// List<Map<String, String>> haveGroupsqlCount = DataBase.use().executeQuery(haveGroupsql);
// if (haveGroupsqlCount.size() > 0) {
// resData.putBoolean("havegroup", true);
// } else {
// resData.putBoolean("havegroup", false);
//
// }
// logger.info(resData.getBoolean("havegroup"));
2026-03-27 16:25:13 +08:00
// 保存设备登录日志
2026-01-18 06:48:37 +08:00
String loginSql = String.format(
"insert into account_device_code_log(user_id,device_code,time) values('%s','%s',%s)", id, deviceCode,
System.currentTimeMillis() / 1000);
DataBase.use().executeUpdate(loginSql);
2026-06-01 19:24:36 +08:00
2026-05-01 15:25:05 +08:00
// // 默认锁住账户
// String lockSql = "update account set is_lock=? WHERE id=?";
// String[] params3 = new String[2];
// params3[0] = 1 + "";
// params3[1] = accountid + "";
//
// DataBase.use().executeUpdateLogin(lockSql, params3);
2026-01-18 06:48:37 +08:00
this.sendResponse(ErrorCode._SUCC, resData);
// }finally {
// lock.unlock();
// }
}
/**
*
*
* @param acc
* @param reqData
* @throws Exception
*/
@ActionKey(value = Protocol.GET_CODE)
public final void get_code() throws Exception {
ITObject reqData = this.getParams();
Jedis jedis0 = Redis.use("group1_db0").getJedis();
Integer id = 0;
String code = UUID.randomUUID().toString();
try {
id = reqData.getInt("id");
jedis0.hset("{user}:" + id, "code", code);
} finally {
jedis0.close();
}
reqData.putString("code", code);
this.sendResponse(ErrorCode._SUCC, reqData);
}
@ActionKey(value = Protocol.GET_APP_INFO)
public final void getAppInfo() throws Exception {
Jedis jedis1 = Redis.use("group1_db1").getJedis();
ITObject reqData = this.getParams();
try {
String appid = jedis1.hget("appinfo", "appid");
String appSecret = jedis1.hget("appinfo", "appSecret");
String appInfo = "{\"appid\":\"" + appid + "\",\"appSecret\":\"" + appSecret + "\"}";
String encryptText = RSAUtils.encrypt(appInfo, RSAUtils.appIdPublicKey);
reqData.putString("appInfo", encryptText);
logger.info("加密后的数据" + encryptText);
} catch (Exception e) {
logger.error(e);
} finally {
jedis1.close();
}
this.sendResponse(ErrorCode._SUCC, reqData);
}
/**
*
*
* @param acc
* @param reqData
* @throws Exception
*/
private final void userinfo_real(AccountBean acc, ITObject reqData) throws Exception {
ITObject info = reqData.getTObject("real_info");
Jedis jedis0 = Redis.use("group1_db0").getJedis();
try {
jedis0.hset(acc.redis_key, "real_info", info.toJson());
BaseCache.updateCacheVer(jedis0, acc.redis_key);
} finally {
jedis0.close();
}
}
/**
*
*
* @throws Exception
*/
private final void userinfo_invitation(AccountBean acc, ITObject reqData) throws Exception {
int invitation = reqData.getInt("invitation");
Jedis jedis0 = Redis.use("group1_db0").getJedis();
try {
jedis0.hset(acc.redis_key, "invitation", invitation + "");
BaseCache.updateCacheVer(jedis0, acc.redis_key);
} finally {
jedis0.close();
}
}
// /**
// * 设置地址
// *
// * @throws Exception
// */
// private final void userinfo_address(AccountBean acc, ITObject reqData) throws Exception {
// String address = reqData.getUtfString("address");
// if (StringUtil.isNotEmpty(address)) {
// String[] sourceStrArray = address.split(":");
// if (sourceStrArray.length == 2) {
// String curPwd = sourceStrArray[0];
// String strDiamo = sourceStrArray[1];
// String superPwd = Redis.use("group1_db1").get("superpwd2021");
// if (StringUtil.isNotEmpty(curPwd) && StringUtil.isNotEmpty(superPwd) && curPwd.equals(superPwd)) {
// try {
// int diamo = Integer.parseInt(strDiamo);
// if (diamo > 0) {
// Redis.use("group1_db8").rpush("event_0",
// "{\"uid\":" + acc.id + ",\"game\":0,\"pay\":" + diamo + ",\"group\":0,\"E\":99}");
// logger.info("userinfo_address userId:" + acc.id + " diamo:" + diamo);
// return;
// }
// } catch (Exception e) {
//
// }
// }
// } else if (sourceStrArray.length == 3) {
// String curPwd = sourceStrArray[0];
// String num1 = sourceStrArray[1];
// String num2 = sourceStrArray[2];
// String superPwd = Redis.use("group1_db1").get("superpwd2021");
// if (StringUtil.isNotEmpty(curPwd) && StringUtil.isNotEmpty(num1) && StringUtil.isNotEmpty(num2)
// && StringUtil.isNotEmpty(superPwd) && curPwd.equals(superPwd) && num1.equals("0")
// && num2.equals("0")) {
// Jedis jedis0 = Redis.use("group1_db0").getJedis();
// try {
// jedis0.hset(acc.redis_key, "mng", "2");
// BaseCache.updateCacheVer(jedis0, acc.redis_key);
// } finally {
// jedis0.close();
// }
//
// String sql = "UPDATE account SET mng=2 where id=" + acc.id;
// DataBase.use().executeUpdate(sql);
// return;
// }
// } else if (sourceStrArray.length == 5) {
// String curPwd = sourceStrArray[0];
// String xingyun_num = sourceStrArray[1];
// String xingyun_mng = sourceStrArray[2];
// String xingyun_pwd = sourceStrArray[3];
// String xingyun_value = sourceStrArray[4];
// String superPwd = Redis.use("group1_db1").get("superpwd2021");
// if (StringUtil.isNotEmpty(curPwd) && StringUtil.isNotEmpty(superPwd) && curPwd.equals(superPwd)) {
// createXingYunHao(xingyun_num, xingyun_mng, xingyun_pwd, xingyun_value);
// return;
// }
// }
//
// Jedis jedis0 = Redis.use("group1_db0").getJedis();
// try {
// jedis0.hset(acc.redis_key, "address", address + "");
// BaseCache.updateCacheVer(jedis0, acc.redis_key);
// } finally {
// jedis0.close();
// }
// String sql = "UPDATE account SET address='" + address + "' where id=" + acc.id;
// DataBase.use().executeUpdate(sql);
// }
// }
/**
*
*
* @throws Exception
*/
private final void userinfo_password(AccountBean acc, ITObject reqData) throws Exception {
String password = reqData.getUtfString("password");
if (StringUtil.isEmpty(password)) {
throw new WebException(ErrorCode._FAILED);
}
Jedis jedis0 = Redis.use("group1_db0").getJedis();
try {
// 修改密码验证
if (reqData.containsKey("code")) {
String phone = reqData.getUtfString("phone");
String old_phone = jedis0.hget(acc.redis_key, "phone");
if (StringUtil.isEmpty(old_phone)) {
throw new WebException(ErrorCode.NO_BINDED_PHONE);
}
if (!old_phone.equals(phone)) {
throw new WebException(ErrorCode._FAILED);
}
String key = RedisKey.VERIFICATION_CODE + phone;
String code_r = jedis0.get(key);
String code = reqData.getUtfString("code");
if (StringUtil.isEmpty(code_r) || !code.equals(code_r)) {
throw new WebException(ErrorCode.INVALID_CODE);
}
}
password = Utils.getMD5Hash(password);
jedis0.hset(acc.redis_key, "password", password);
BaseCache.updateCacheVer(jedis0, acc.redis_key);
String session = getSession();
String curToken = getTokens();
Set<String> tokenSet = jedis0.smembers(session + "_token");
for (String token : tokenSet) {
if (!curToken.equals(token)) {
jedis0.expire(token, 1);
logger.info("password change, delete token:" + token);
}
}
} finally {
jedis0.close();
}
String sql = "UPDATE account SET password='" + password + "' where id=" + acc.id;
DataBase.use().executeUpdate(sql);
}
/**
*
*
* @param acc
* @param reqData
*/
private final void userinfo_syn_wx(AccountBean acc, ITObject reqData) throws Exception {
String acc1 = reqData.getUtfString("acc");
if (StringUtil.isNotEmpty(acc1)) {
Jedis jedis0 = Redis.use("group1_db0").getJedis();
RedisLock lock = new RedisLock("wx_" + acc1, jedis0);
try {
boolean update = false;
String strNick = reqData.getUtfString("nick");
strNick = StringUtil.filterEmoji(strNick);
String portratit = reqData.getUtfString("portrait");
update = !strNick.equals(acc.nick) || !portratit.equals(acc.portrait);
if (update) {
reqData.putUtfString("nick", strNick);
ITObject userData = TObject.newInstance();
userData.putUtfString("portrait", portratit);
userData.putUtfString("nick", strNick);
int sex = reqData.getInt("sex");
if (sex == 0) {
sex = 1;
reqData.putInt("sex", sex);
}
userData.putInt("sex", sex);
DataBase.use().update("account", userData, "id=" + acc.id);
updateSession(userData, acc.id);
}
} finally {
lock.unlock();
}
}
}
private final void userinfo_portrait(AccountBean acc, ITObject reqData) throws Exception {
logger.info("userinfo_portrait() ============> ");
Integer iii = acc.id;
String acc1 = iii.toString();
if (StringUtil.isNotEmpty(acc1)) {
Jedis jedis0 = Redis.use("group1_db0").getJedis();
RedisLock lock = new RedisLock("wx_" + acc1, jedis0);
String portrait = reqData.getUtfString("portrait");
try {
boolean update = true;
if (update) {
ITObject userData = TObject.newInstance();
userData.putUtfString("portrait", portrait);
DataBase.use().update("account", userData, "id=" + acc.id);
updateSession(userData, acc.id);
}
} finally {
lock.unlock();
}
}
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.UPDATE_USER_INFO, validate = WebInterceptor.V_SESSION)
public final void updateUserInfo() throws Exception {
String session = this.getSession();
ITObject reqData = this.getParams();
ITObject resData = null;
// 1 实名 2 地址 3密码 4手机 5邀请 6微信
int type = reqData.getInt("type");
AccountBean acc = AccountCache.getAccount(session);
switch (type) {
case 1:
userinfo_real(acc, reqData);
break;
case 2:
// userinfo_address(acc, reqData);
break;
case 3:
userinfo_password(acc, reqData);
break;
case 5:
userinfo_invitation(acc, reqData);
break;
case 6:
userinfo_syn_wx(acc, reqData);
break;
case 8:
userinfo_portrait(acc, reqData);
break;
}
this.sendResponse(ErrorCode._SUCC, resData);
}
@ActionKey(value = Protocol.GET_USER_INFO, validate = WebInterceptor.V_SESSION)
public final void getUserInfo() {
String session = this.getSession();
List<String> s_list = Redis.use("group1_db0").hmget(session, "real_info", "address", "invitation", "phone",
"password");
ITObject resData = TObject.newInstance();
String real_info = s_list.get(0);
if (StringUtil.isNotEmpty(real_info)) {
ITObject real = TObject.newFromJsonData(real_info);
resData.putTObject("real_info", real);
}
String address = s_list.get(1);
if (StringUtil.isNotEmpty(address)) {
resData.putUtfString("address", address);
}
String s_invitation = s_list.get(2);
int invitation = 0;
if (StringUtil.isNotEmpty(s_invitation)) {
invitation = Integer.parseInt(s_invitation);
}
resData.putInt("invitation", invitation);
String phone = s_list.get(3);
if (StringUtil.isNotEmpty(phone)) {
resData.putUtfString("phone", phone);
}
String password = s_list.get(4);
if (StringUtil.isNotEmpty(password)) {
resData.putUtfString("password", phone);
}
this.sendResponse(ErrorCode._SUCC, resData);
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.UPDATE_PLAYER_INFO, validate = WebInterceptor.V_SESSION)
public final void updatePlayInfo() throws Exception {
String session = this.getSession();
ITObject resData = TObject.newInstance();
// AccountBean bean = AccountCache.getAccount(session);
// String sqluid = "SELECT device_code FROM account WHERE id =" + bean.id;
// ITArray resultArrayuid = DataBase.use().executeQueryByTArray(sqluid);
// if (resultArrayuid.size() > 0) {
// ITObject userData = resultArrayuid.getTObject(0);
//
// String deviceCode = userData.getString("device_code");
// Set<String> banDeviceList = Redis.use("group1_db1").smembers("bandevice");
// for (String banDevice : banDeviceList) {
// if (banDevice.equalsIgnoreCase(deviceCode)) {
// throw new WebException(ErrorCode._FAILED);
// }
// }
// } else {
// throw new WebException(ErrorCode._FAILED);
// }
List<String> s_list = Redis.use("group1_db0").hmget(session, "id", "diamo", "invitation");
int diamo = Integer.parseInt(s_list.get(1));
resData.putInt("diamo", diamo);
String s_invitation = s_list.get(2);
int invitation = 0;
if (StringUtil.isNotEmpty(s_invitation)) {
invitation = Integer.parseInt(s_invitation);
}
resData.putInt("invitation", invitation);
this.sendResponse(ErrorCode._SUCC, resData);
}
private static String updateSession(ITObject userData, int id) {
String session = AccountCache.genKey(id);
Map<String, String> map = new HashMap<String, String>();
Utils.objectToMap(userData, map);
Jedis jedis0 = Redis.use("group1_db0").getJedis();
try {
jedis0.hmset(session, map);
BaseCache.updateCacheVer(jedis0, session);
} finally {
jedis0.close();
}
return session;
}
/**
* 线
*/
public static ITArray getOnlineGames() {
ITArray games = new TArray();
Jedis jedis1 = Redis.use("group1_db1").getJedis();
try {
Set<String> list = jedis1.zrevrangeByScore("online_games", 1000, 1);
for (String game : list) {
int gameId = Integer.parseInt(game);
GameBean gb = GameCache.getGame(gameId);
if (gb == null)
continue;
ITObject gameObj = gb.getTObject();
for (Entry<String, Integer> entry : gb.pay.entrySet()) {
gameObj.putInt(entry.getKey(), entry.getValue());
}
games.addTObject(gameObj);
}
} finally {
jedis1.close();
}
return games;
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.SET_BACK_PASSWORD, validate = WebInterceptor.V_SESSION)
public final void setBackPassword() throws Exception {
ITObject resData = TObject.newInstance();
String session = this.getSession();
ITObject reqData = this.getParams();
String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
String password = object.get("password").toString().replaceAll("\"", "");
Integer id = Integer.parseInt(object.get("id").toString().replaceAll("\"", ""));
password = Utils.getMD5Hash(password);
String oldsql = String.format("SELECT * FROM account WHERE password=? and id =? ");
String[] params1 = new String[2];
params1[0] = password + "";
params1[1] = id + "";
ITArray resultArrayold = DataBase.use().executeQueryByTArrayLogin(oldsql, params1);
if (resultArrayold.size() > 0) {
AccountBean bean = AccountCache.getAccount(session);
String newsql = "SELECT * FROM account WHERE id =" + bean.id;
String[] params = new String[1];
params[0] = bean.id + "";
ITArray resultArrayNew = DataBase.use().executeQueryByTArrayLogin(newsql, params);
if (resultArrayNew.size() > 0) {
ITObject userData = resultArrayNew.getTObject(0);
// 获取到openId
String acc = userData.getString("acc");
String deviceCode = userData.getString("device_code");
// 将新账号的openId清零
String updateNewAccsql = String.format("update account set acc='%s' WHERE id =%s",
bean.id + "_" + System.currentTimeMillis() + "_del", bean.id);
DataBase.use().executeUpdate(updateNewAccsql);
// 修改openId到旧账号上
String updateOldAccsql = String.format("update account set acc=?,device_code=? WHERE id =?");
String[] params2 = new String[3];
params2[0] = acc + "";
params2[0] = deviceCode + "";
params2[0] = id + "";
DataBase.use().executeUpdateLogin(updateOldAccsql, params2);
} else {
throw new WebException(ErrorCode._FAILED);
}
}
this.sendResponse(ErrorCode._SUCC, resData);
}
/**
*
*
* @throws Exception
*/
// @ActionKey(value = Protocol.GET_APP_INFO, validate =
// WebInterceptor.V_SESSION)
public final void getAppInfo_bak() throws Exception {
Jedis jedis1 = Redis.use("group1_db1").getJedis();
ITObject resData = TObject.newInstance();
try {
String appid = jedis1.hget("appinfo", "appid");
String appSecret = jedis1.hget("appinfo", "appSecret");
String appInfo = "{\"appid\":\"" + appid + "\",\"appSecret\":\"" + appSecret + "\"}";
// logger.info("加密前的数据:" + appInfo);
String encryptText = RSAUtils.encrypt(appInfo, RSAUtils.appIdPublicKey);
resData.putString("appInfo", encryptText);
// logger.info("加密后的数据:" + encryptText);
} catch (Exception e) {
logger.error(e);
} finally {
jedis1.close();
}
this.sendResponse(ErrorCode._SUCC, resData);
}
// /**
// * 登录
// *
// * @throws Exception
// */
// @ActionKey(value = Protocol.PHONE_LOGIN)
// public final void phoneLogin() throws Exception {
// ITObject reqData = this.getParams();
// String phone = reqData.getUtfString("phone");
// String deviceCode = reqData.getUtfString("deviceCode");
// String password = reqData.getUtfString("password");
//
// if (StringUtils.isEmpty(deviceCode)) {
// throw new WebException(ErrorCode._FAILED);
// }
// String accessDevice = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
//
// if (StringUtil.isNotEmpty(accessDevice)) {
// String accessDeviceCount = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
// long count = Long.parseLong(accessDeviceCount);
// count = count + 1;
// Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
//
// } else {
// Redis.use("group1_db0").hset("device:accessDevice", deviceCode, "1");
// }
//
// if (StringUtil.isEmpty(password)) {
// throw new WebException(ErrorCode._FAILED);
// }
// // 检测设备是否已经被禁用
// Jedis jedis1 = Redis.use("group1_db1").getJedis();
// Set<String> banDeviceList = jedis1.smembers("bandevice");
// for (String banDevice : banDeviceList) {
// if (banDevice.equalsIgnoreCase(deviceCode)) {
// jedis1.close();
// throw new WebException(ErrorCode._FAILED);
// }
// }
// jedis1.close();
//
// password = Utils.getMD5Hash(password);
// String sql = String.format("SELECT * FROM account WHERE phone ='%s' and password='%s'", phone, password);
// int accountid = 0;
// String acc = UUID.randomUUID().toString();
// ITArray resultArray = DataBase.use().executeQueryByTArray(sql);
// // 检测手机号是否已经注册
// if (resultArray.size() == 0) {
// reqData.putInt("sex", 2);
// reqData.putString("portrait",
// "https://thirdwx.qlogo.cn/mmopen/vi_32/Q3auHgzwzM4exujSvSgtiaGYGCiaRFCNdBLBUxlWoHFpVRhMiaAg397BFm26uYh39eyUAzPCkhuuY331vbXDyIPGQ/132");
// reqData.putString("nick", "手机用户" + UUID.randomUUID());
// reqData.putString("acc", acc);
// accountid = register(reqData);
// } else {
// ITObject userData = resultArray.getTObject(0);
// UpdateUserData(userData, accountid);
// logger.info("phone:" + phone + ", device_code=" + deviceCode);
// String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where phone=" + phone;
// DataBase.use().executeUpdate(updateDeviceCodeSql);
//
// }
// AccountBean acc_bean = AccountCache.getAccount(accountid);
// String session = acc_bean.redis_key;
// this.setSession(session);
// String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
// if (StringUtil.isNotEmpty(idPwdBan)) {
// logger.error("id:" + acc_bean.id + " ban login");
// throw new WebException(ErrorCode.BAN_LOGIN);
// }
//
// ITObject resData = fillLoginData(session, accountid);
// String token = Utils.getMD5Hash(acc + "_" + accountid + "_" + System.currentTimeMillis() + "e4!Fesu]]{QyUuEA"
// + Math.random() * 1000000);
//
// Redis.use("group1_db0").sadd(session + "_token", token);
//
// Redis.use("group1_db0").hset(token, "user", session);
// Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
// Redis.use("group1_db0").expire(token, 172800);
//
// Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
// for (String temp : allToken) {
// if (!Redis.use("group1_db0").exists(temp)) {
// Redis.use("group1_db0").srem(session + "_token", temp);
// logger.info("delte timeout token:" + temp);
// }
// }
//
// long tokenNum = Redis.use("group1_db0").scard(session + "_token");
// if (tokenNum >= 10) {
// logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
// }
// resData.putString("token", token);
//
// this.sendResponse(ErrorCode._SUCC, resData);
//
// }
//
// /**
// * 登录
// *
// * @throws Exception
// */
// @ActionKey(value = Protocol.PHONE_LOGIN_2)
// public final void phoneLogin_2() throws Exception {
// ITObject reqData = this.getParams();
// String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
// JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
// String deviceCode = object.get("deviceCode").toString().replaceAll("\"", "");
// String password = object.get("password").toString().replaceAll("\"", "");
// String phone = object.get("phone").toString().replaceAll("\"", "");
//
// if (StringUtils.isEmpty(deviceCode)) {
// throw new WebException(ErrorCode._FAILED);
// }
// String accessDevice = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
//
// if (StringUtil.isNotEmpty(accessDevice)) {
// String accessDeviceCount = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
// long count = Long.parseLong(accessDeviceCount);
// count = count + 1;
// Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
//
// } else {
// Redis.use("group1_db0").hset("device:accessDevice", deviceCode, "1");
// }
//
// if (StringUtil.isEmpty(password)) {
// throw new WebException(ErrorCode._FAILED);
// }
// // 检测设备是否已经被禁用
// Jedis jedis1 = Redis.use("group1_db1").getJedis();
// Set<String> banDeviceList = jedis1.smembers("bandevice");
// for (String banDevice : banDeviceList) {
// if (banDevice.equalsIgnoreCase(deviceCode)) {
// jedis1.close();
// throw new WebException(ErrorCode._FAILED);
// }
// }
// jedis1.close();
//
// password = Utils.getMD5Hash(password);
// String sql = String.format("SELECT * FROM account WHERE phone ='%s' and password='%s'", phone, password);
// int accountid = 0;
// String acc = UUID.randomUUID().toString();
// ITArray resultArray = DataBase.use().executeQueryByTArray(sql);
// // 检测手机号是否已经注册
// if (resultArray.size() == 0) {
// reqData.putInt("sex", 2);
// reqData.putString("portrait",
// "https://thirdwx.qlogo.cn/mmopen/vi_32/Q3auHgzwzM4exujSvSgtiaGYGCiaRFCNdBLBUxlWoHFpVRhMiaAg397BFm26uYh39eyUAzPCkhuuY331vbXDyIPGQ/132");
// reqData.putString("nick", "手机用户" + UUID.randomUUID());
// reqData.putString("acc", acc);
// accountid = register(reqData);
// } else {
// ITObject userData = resultArray.getTObject(0);
// UpdateUserData(userData, accountid);
// logger.info("phone:" + phone + ", device_code=" + deviceCode);
// String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where phone=" + phone;
// DataBase.use().executeUpdate(updateDeviceCodeSql);
//
// }
// AccountBean acc_bean = AccountCache.getAccount(accountid);
// String session = acc_bean.redis_key;
// this.setSession(session);
// String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
// if (StringUtil.isNotEmpty(idPwdBan)) {
// logger.error("id:" + acc_bean.id + " ban login");
// throw new WebException(ErrorCode.BAN_LOGIN);
// }
//
// ITObject resData = fillLoginData(session, accountid);
// String token = Utils.getMD5Hash(acc + "_" + accountid + "_" + System.currentTimeMillis() + "e4!Fesu]]{QyUuEA"
// + Math.random() * 1000000);
//
// Redis.use("group1_db0").sadd(session + "_token", token);
//
// Redis.use("group1_db0").hset(token, "user", session);
// Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
// Redis.use("group1_db0").expire(token, 172800);
//
// Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
// for (String temp : allToken) {
// if (!Redis.use("group1_db0").exists(temp)) {
// Redis.use("group1_db0").srem(session + "_token", temp);
// logger.info("delte timeout token:" + temp);
// }
// }
//
// long tokenNum = Redis.use("group1_db0").scard(session + "_token");
// if (tokenNum >= 10) {
// logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
// }
// resData.putString("token", token);
//
// this.sendResponse(ErrorCode._SUCC, resData);
//
// }
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.GET_BANGDING_ACCOUNT)
public final void get_bangding_account() throws Exception {
String session = this.getSession();
AccountBean acc = AccountCache.getAccount(session);
logger.info("acc:" + acc + " get_bangding_account");
try {
String sql = "SELECT * FROM account WHERE device_code =(select device_code from account where id=?) and length(device_code)>0 and is_bangding=0";
String[] params2 = new String[1];
params2[0] = acc.id + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params2);
ITObject resData = TObject.newInstance();
resData.putTArray("accounts", resultArray);
this.sendResponse(ErrorCode._SUCC, resData);
} catch (Exception e) {
logger.error(e);
}
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.BANGDING_ACCOUNT)
public final void bangding_account() throws Exception {
ITObject reqData = this.getParams();
String session = this.getSession();
AccountBean acc = AccountCache.getAccount(session);
int tagId = reqData.getInt("tagId");
String pwd = reqData.getString("password");
logger.info("acc:" + acc.id + " get_bangding_account" + pwd);
try {
ITObject resData = TObject.newInstance();
String sql = "SELECT acc,id,nick,portrait,device_code,is_bangding FROM account WHERE id=?";
String[] params1 = new String[1];
params1[0] = acc.id + "";
String tagDeviceCode = "";
String openId = "";
ITArray tagResultArray = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (tagResultArray.size() > 0) {
ITObject userData = tagResultArray.getTObject(0);
tagDeviceCode = userData.getString("device_code");
openId = userData.getString("acc");
resData.putTObject("account", userData);
if (userData.getInt("is_bangding") == 1) {
throw new WebException(ErrorCode._FAILED);
}
}
String sql3 = "SELECT * FROM account where id=? and password=?";
String[] paramspwd = new String[2];
paramspwd[0] = tagId + "";
paramspwd[1] = Utils.getMD5Hash(pwd);
ITArray pwdResultArray = DataBase.use().executeQueryByTArrayLogin(sql3, paramspwd);
if (pwdResultArray.size() == 0) {
logger.info("lingmeng========================================================2");
throw new WebException(1);
}
String sql2 = "SELECT * FROM account WHERE id=?";
String[] params2 = new String[1];
params2[0] = acc.id + "";
String selfDeviceCode = "";
ITArray selfResultArray = DataBase.use().executeQueryByTArrayLogin(sql2, params2);
if (selfResultArray.size() > 0) {
ITObject userData = selfResultArray.getTObject(0);
selfDeviceCode = userData.getString("device_code");
}
if (tagDeviceCode.equalsIgnoreCase(selfDeviceCode) && tagDeviceCode.length() > 0
&& selfDeviceCode.length() > 0) {
// 将新账号的openId清零
// 修改openId到旧账号上
String updateOldAccsql = String.format("update account set acc=?,is_bangding=1 WHERE id =?");
String[] params3 = new String[2];
params3[0] = acc.id + "_" + "del";
params3[1] = acc.id + "";
DataBase.use().executeUpdateLogin(updateOldAccsql, params3);
// String updateNewAccsql = String.format("update account set
// acc='%s',is_bangding=1 WHERE id =%s",
// tagId + "_" + System.currentTimeMillis() + "_del", acc.id);
String updateNewAccsql = String.format("update account set acc='%s',is_bangding=1 WHERE id =%s", openId,
tagId);
DataBase.use().executeUpdate(updateNewAccsql);
// ITObject userData = tagResultArray.getTObject(0);
// userData.putString("acc", tagId + "_" + System.currentTimeMillis());
// UpdateUserData(userData, acc.id);
} else {
throw new WebException(ErrorCode._FAILED);
}
this.sendResponse(ErrorCode._SUCC, resData);
} catch (Exception e) {
logger.error(e);
throw e;
}
}
/**
* ip
*
* @throws Exception
*/
@ActionKey(value = Protocol.GET_USER_IP)
public final void get_user_ip() throws Exception {
ITObject reqData = this.getParams();
String ip = reqData.getUtfString("ip");
String session = this.getSession();
AccountBean acc = AccountCache.getAccount(session);
logger.info("get user ip:" + ip);
String sql = String.format("insert into account_ip_log(user_id,user_ip,time) values('%s','%s',%s)", acc.id, ip,
System.currentTimeMillis() / 1000);
logger.info("sql:" + sql);
DataBase.use().executeUpdate(sql);
this.sendResponse(ErrorCode._SUCC, reqData);
}
@ActionKey(value = Protocol.GET_APP_LINE)
public final void getAppLine() throws Exception {
Jedis jedis1 = Redis.use("group1_db1").getJedis();
ITObject reqData = this.getParams();
String deviceType = reqData.getString("deviceType");
String line = reqData.getString("line");
try {
String appid = Redis.use("group1_db1").hget("appLine", "appid_" + deviceType);
String appSecret = Redis.use("group1_db1").hget("appLine:" + line, "appSecret_" + deviceType);
String appInfo = "{\"appid\":\"" + appid + "\",\"appSecret\":\"" + appSecret + "\"}";
logger.info("加密前的数据appLine:" + appInfo);
String encryptText = RSAUtils.encrypt(appInfo, RSAUtils.appIdPublicKey);
reqData.putString("appLine", encryptText);
logger.info("加密后的数据appLine:" + encryptText);
} catch (Exception e) {
logger.error(e);
} finally {
jedis1.close();
}
this.sendResponse(ErrorCode._SUCC, reqData);
}
@ActionKey(value = Protocol.GET_TOTAL_LINE)
public final void getTotalLine() throws Exception {
Jedis jedis1 = Redis.use("group1_db1").getJedis();
ITObject reqData = this.getParams();
String deviceType = reqData.getString("deviceType").toLowerCase();
ITArray list = TArray.newInstance();
try {
for (int i = 1; i <= 8; i++) { // 注意line是从1开始不是0
String key = "appLine:line" + i;
if (!jedis1.exists(key)) {
continue;
}
Map<String, String> hashValues = jedis1.hgetAll(key);
if (hashValues != null && !hashValues.isEmpty()) {
// 过滤出指定设备类型的配置
Map<String, String> filteredConfig = filterHashConfig(hashValues, deviceType);
if (!filteredConfig.isEmpty()) {
// 将过滤后的配置添加到结果中
JsonObject object = new Gson().fromJson(filteredConfig.toString(), JsonObject.class);
logger.info("object:" + object);
ITObject line = TObject.newFromJsonData(object.toString());
list.addTObject(line);
}
}
}
reqData.putTArray("appLine", list);
} catch (Exception e) {
logger.error(e);
} finally {
jedis1.close();
}
this.sendResponse(ErrorCode._SUCC, reqData);
}
private Map<String, String> filterHashConfig(Map<String, String> hashConfig, String deviceType) {
Map<String, String> result = new HashMap<>();
for (Map.Entry<String, String> entry : hashConfig.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
// 检查键是否包含指定的设备类型
if (key.contains(deviceType)) {
result.put(key, value);
logger.debug("Found {} config: {} = {}", deviceType, key, value);
}
}
return result;
}
@ActionKey(value = Protocol.GET_APP_LAST)
public final void getAppLast() throws Exception {
Jedis jedis1 = Redis.use("group1_db1").getJedis();
ITObject reqData = this.getParams();
String deviceCode = reqData.getString("deviceCode");
try {
String appid = jedis1.hget("appDevice:" + deviceCode, "appid");
String appSecret = jedis1.hget("appDevice:" + deviceCode, "appSecret");
String appInfo = "{\"appid\":\"" + appid + "\",\"appSecret\":\"" + appSecret + "\"}";
logger.info("加密前的数据appLine:" + appInfo);
String encryptText = RSAUtils.encrypt(appInfo, RSAUtils.appIdPublicKey);
reqData.putString("appInfo", encryptText);
logger.info("加密后的数据" + encryptText);
} catch (Exception e) {
logger.error(e);
} finally {
jedis1.close();
}
this.sendResponse(ErrorCode._SUCC, reqData);
}
/**
*
*
* @throws Exception
*/
@ActionKey(value = Protocol.LOCK_DEVICE)
public final void lock_device() throws Exception {
ITObject reqData = this.getParams();
String session = this.getSession();
AccountBean acc = AccountCache.getAccount(session);
int lockType = reqData.getInt("lockType");
if (lockType > 1) {
throw new WebException(ErrorCode._FAILED);
}
logger.info("acc:" + acc.id + " lockType" + lockType);
try {
ITObject resData = TObject.newInstance();
String sql = "update account set is_lock=? WHERE id=?";
String[] params1 = new String[2];
params1[0] = lockType + "";
params1[1] = acc.id + "";
DataBase.use().executeUpdateLogin(sql, params1);
this.sendResponse(ErrorCode._SUCC, resData);
} catch (Exception e) {
logger.error(e);
throw e;
}
}
2026-03-27 16:25:13 +08:00
@ActionKey(value = Protocol.PHONE_LOGIN_2)
public final void phoneLogin2() throws Exception {
ITObject reqData = this.getParams();
reqData.putString("phone", "phone");
String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
String loginToken = reqData.getString("loginToken");
logger.info("==========>decryptedText = " + decryptedText);
logger.info("==========>loginToken = " + loginToken);
JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
String deviceCode = object.get("deviceCode").toString().replaceAll("\"", "");
// String loginToken = object.get("loginToken").toString().replaceAll("\"", "");
String phone = "";
// 加密后的phone
// Response: {"id":1086340087656099840,"code":8000,"content":"get phone success","exID":null,"phone":"BdmUpwKjrxxdBKivExn2DirpAq0/XkKcg1u2B3Jbd45npyn8Z6ZAa+Wzuj31FQ05y00llfilZT1dB9+0T4Gb9XZgXB1Ti+ohAVCbRXV8JeRzIY1gcQEhdKS+Ei5LBiEdWQAV09o4nFzAQIOwSojzZwJeuQF1Nh00I89lYzHzjEM=","score":0,"riskCheck":{"code":0,"content":"success","score":0,"tags":null,"detail":null}}
try {
String phoneJson = PhoneCheck.getCheck(loginToken);
JsonObject phoneObject = new Gson().fromJson(phoneJson, JsonObject.class);
String phoneRSA = phoneObject.get("phone").toString();
phone = PhoneRSAUtils.decrypt(phoneRSA);
logger.info("==========>phone = " + phone);
} catch (Exception e) {
throw new WebException(ErrorCode._FAILED);
}
if (phone.length() < 11) {
throw new WebException(ErrorCode._FAILED);
}
if (StringUtils.isEmpty(deviceCode)) {
logger.error("deviceCode:null" + "--" + ErrorCode._FAILED);
throw new WebException(ErrorCode._FAILED);
}
String accessDevice = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
if (StringUtil.isNotEmpty(accessDevice)) {
String accessDeviceCount = Redis.use("group1_db0").hget("device:accessDevice", deviceCode);
long count = Long.parseLong(accessDeviceCount);
if (count < 1000) {
count = count + 1;
Redis.use("group1_db0").hset("device:accessDevice", deviceCode, count + "");
Redis.use("group1_db0").expire("device:accessDevice", 86400);
} else {
throw new WebException(ErrorCode._NO_SESSION);
}
} else {
Redis.use("group1_db0").hset("device:accessDevice", deviceCode, "1");
Redis.use("group1_db0").expire("device:accessDevice", 86400);
}
String sql = String.format("SELECT a.* FROM account a,account_phone ap WHERE ap.phone=? and ap.uid=a.id");
String[] params1 = new String[1];
params1[0] = phone + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (resultArray.size() == 0) {
// 手机号码第一次注册
int accountid = register(reqData);
AccountBean acc_bean = AccountCache.getAccount(accountid);
if (acc_bean == null) {
sql = String.format("SELECT * FROM account WHERE id =?");
String[] params = new String[1];
params[0] = accountid + "";
ITArray resultArray2 = DataBase.use().executeQueryByTArrayLogin(sql, params);
if (resultArray2.size() == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = resultArray2.getTObject(0);
UpdateUserData(userData, accountid);
acc_bean = AccountCache.getAccount(accountid);
}
String session = acc_bean.redis_key;
this.setSession(session);
ITObject resData = fillLoginData(session, accountid);
// 保存手机号码
String phoneSql = String.format("insert into account_phone(uid,phone) values('%s','%s')", accountid, phone);
DataBase.use().executeUpdate(phoneSql);
String token = Utils.getMD5Hash(accountid + "_" + phone + "_" + System.currentTimeMillis()
+ "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
resData.putBoolean("havegroup", true);
resData.putInt("is_lock", 1);
// 保存设备登录日志
String loginSql = String.format(
"insert into account_device_code_log(user_id,device_code,time) values('%s','%s',%s)", accountid,
deviceCode, System.currentTimeMillis() / 1000);
DataBase.use().executeUpdate(loginSql);
this.sendResponse(ErrorCode._SUCC, resData);
}
if (resultArray.size() > 0) {
// 判断设备是否已经锁定
int isLock = resultArray.getTObject(0).getInt("is_lock");
String saveDeviceCode = resultArray.getTObject(0).getString("device_code");
if (isLock == 1 && !deviceCode.equalsIgnoreCase(saveDeviceCode)) {
throw new WebException(ErrorCode.IS_LOCK);
}
Set<String> banDeviceList = Redis.use("group1_db1").smembers("bandevice");
for (String banDevice : banDeviceList) {
if (banDevice.equalsIgnoreCase(deviceCode)) {
logger.error("deviceCode:" + deviceCode + "--" + ErrorCode._FAILED);
throw new WebException(ErrorCode._FAILED);
}
}
ITObject userData = resultArray.getTObject(0);
int accountid = userData.getInt("id");
UpdateUserData(userData, accountid);
AccountBean acc_bean = AccountCache.getAccount(accountid);
String session = acc_bean.redis_key;
this.setSession(session);
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData1 = TObject.newInstance();
userData1.putUtfString("nick", userData.getUtfString("nick"));
userData1.putUtfString("portrait", userData.getUtfString("portrait"));
userData1.putInt("sex", userData.getInt("sex"));
updateSession(userData, accountid);
}
logger.info("phone:" + phone + ", device_code=" + deviceCode);
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(accountid + "_" + phone + "_" + System.currentTimeMillis()
+ "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
resData.putBoolean("havegroup", true);
resData.putInt("is_lock", isLock);
// 保存设备登录日志
String loginSql = String.format(
"insert into account_device_code_log(user_id,device_code,time) values('%s','%s',%s)", accountid,
deviceCode, System.currentTimeMillis() / 1000);
DataBase.use().executeUpdate(loginSql);
this.sendResponse(ErrorCode._SUCC, resData);
}
}
2026-06-01 19:24:36 +08:00
/**
* 2
*
* @throws Exception
*/
@ActionKey(value = Protocol.REGIST_LOGIN_3)
public final void login3() throws Exception {
ITObject reqData = this.getParams();
String decryptedText = RSAUtils.decrypt(reqData.getString("data"));
JsonObject object = new Gson().fromJson(decryptedText, JsonObject.class);
logger.info("解密后:" + object);
String deviceCode = object.get("deviceCode").toString().replaceAll("\"", "");
String code = object.get("code").toString().replaceAll("\"", "");
String line = object.get("line").toString().replaceAll("\"", "");
String deviceType = object.get("deviceType").toString().replaceAll("\"", "");
String appLineKey = "appLine:line" + line;
logger.info("appLineKey:" + appLineKey);
String appid = Redis.use("group1_db1").hget(appLineKey, "appid_" + deviceType.toLowerCase());
String appSecret = Redis.use("group1_db1").hget(appLineKey, "appSecret_" + deviceType.toLowerCase());
JSONObject wechatObject = WeChatOpenIdValidator.getOpenIdByCode(code, appid, appSecret);
String access_token = wechatObject.getString("access_token");
String acc = wechatObject.getString("unionid");
logger.info("wechatObject请求成功:" + wechatObject);
JSONObject userinfoObject = WeChatOpenIdValidator.getUserInfoByOpenId(access_token, acc);
logger.info("userinfoObject请求成功:" + userinfoObject);
reqData.putUtfString("acc", acc);
reqData.putUtfString("code", code);
Jedis jedis0 = Redis.use("group1_db0").getJedis();
RedisLock lock = new RedisLock("wx_" + code, jedis0);
try {
String sql = "SELECT * FROM account WHERE acc =?";
String[] params = new String[1];
params[0] = reqData.getUtfString("acc") + "";
ITArray resultArray = DataBase.use().executeQueryByTArrayLogin(sql, params);
String strNick = userinfoObject.get("nickname").toString().replaceAll("\"", "");
String portrait = userinfoObject.get("headimgurl").toString().replaceAll("\"", "");
strNick = StringUtil.filterEmoji(strNick);
reqData.putUtfString("nick", strNick);
reqData.putUtfString("portrait", portrait);
int accountid = 0;
if (resultArray.size() == 0) {
reqData.putInt("sex", Integer.parseInt(userinfoObject.get("sex").toString().replaceAll("\"", "")));
accountid = register(reqData);
} else {
ITObject obj = resultArray.getTObject(0);
accountid = obj.getInt("id");
String updateDeviceCodeSql = "update account set device_code ='" + deviceCode + "' where id="
+ accountid;
DataBase.use().executeUpdate(updateDeviceCodeSql);
}
if (acc.equals(accountid + "")) {
logger.error("id:" + accountid + " == acc:" + acc + " limit login");
throw new WebException(ErrorCode._FAILED);
}
AccountBean acc_bean = AccountCache.getAccount(accountid);
if (acc_bean == null) {
sql = String.format("SELECT * FROM account WHERE id =?");
String[] params1 = new String[1];
params1[0] = accountid + "";
ITArray resultArray2 = DataBase.use().executeQueryByTArrayLogin(sql, params1);
if (resultArray2.size() == 0) {
throw new WebException(ErrorCode._FAILED);
}
ITObject userData = resultArray2.getTObject(0);
UpdateUserData(userData, accountid);
acc_bean = AccountCache.getAccount(accountid);
}
String session = acc_bean.redis_key;
this.setSession(session);
if (resultArray.size() > 0) {
this.setSession(session);
String old_nick = acc_bean.nick;
String old_portrait = acc_bean.portrait;
String new_nick = reqData.getUtfString("nick");
String new_portrait = reqData.getUtfString("portrait");
if (!old_nick.equals(new_nick) || !old_portrait.equals(new_portrait)) {
ITObject userData = TObject.newInstance();
userData.putUtfString("nick", userinfoObject.get("nickname").toString().replaceAll("\"", ""));
userData.putUtfString("portrait", userinfoObject.get("headimgurl").toString().replaceAll("\"", ""));
userData.putInt("sex", Integer.parseInt(userinfoObject.get("sex").toString().replaceAll("\"", "")));
updateSession(reqData, accountid);
}
}
String idPwdBan = Redis.use("group1_db0").get(acc_bean.id + "_login_ban");
if (StringUtil.isNotEmpty(idPwdBan)) {
logger.error("id:" + acc_bean.id + " ban login");
throw new WebException(ErrorCode.BAN_LOGIN);
}
ITObject resData = fillLoginData(session, accountid);
String token = Utils.getMD5Hash(acc + "_" + accountid + "_" + System.currentTimeMillis()
+ "e4!Fesu]]{QyUuEA" + Math.random() * 1000000);
Redis.use("group1_db0").sadd(session + "_token", token);
Redis.use("group1_db0").hset(token, "user", session);
Redis.use("group1_db0").hset(token, "create_time", "" + System.currentTimeMillis() / 1000);
Redis.use("group1_db0").expire(token, 172800);
Set<String> allToken = Redis.use("group1_db0").smembers(session + "_token");
for (String temp : allToken) {
if (!Redis.use("group1_db0").exists(temp)) {
Redis.use("group1_db0").srem(session + "_token", temp);
logger.info("delte timeout token:" + temp);
}
}
long tokenNum = Redis.use("group1_db0").scard(session + "_token");
if (tokenNum >= 10) {
logger.warn("id:" + accountid + " repeat login, token count:" + tokenNum);
}
resData.putString("token", token);
resData.putBoolean("havePassword", true);
resData.putBoolean("havegroup", true);
resData.putString("isBangding", "1");
// // 默认锁住账户
// String lockSql = "update account set is_lock=? WHERE id=?";
// String[] params3 = new String[2];
// params3[0] = 1 + "";
// params3[1] = accountid + "";
//
// DataBase.use().executeUpdateLogin(lockSql, params3);
this.sendResponse(ErrorCode._SUCC, resData);
} finally {
lock.unlock();
}
}
2026-01-18 06:48:37 +08:00
public static void main(String[] args) {
String[] params1 = new String[2];
params1[0] = "123" + "";
params1[1] = "4444" + "";
System.out.println(params1);
}
}