diff --git a/src/main/java/com/ljsd/controller/GetUserController.java b/src/main/java/com/ljsd/controller/GetUserController.java index d4912ee..5e0e4a7 100644 --- a/src/main/java/com/ljsd/controller/GetUserController.java +++ b/src/main/java/com/ljsd/controller/GetUserController.java @@ -67,8 +67,7 @@ public class GetUserController extends HttpServlet { * */ - public void doGet(HttpServletRequest request, HttpServletResponse response) - throws ServletException, IOException { + public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { DBObject res = new BasicDBObject(); String openId = request.getParameter("openId"); if (openId == null || openId.isEmpty()) { diff --git a/src/main/java/com/ljsd/controller/HaoGameGetUserController.java b/src/main/java/com/ljsd/controller/HaoGameGetUserController.java new file mode 100644 index 0000000..cd2adac --- /dev/null +++ b/src/main/java/com/ljsd/controller/HaoGameGetUserController.java @@ -0,0 +1,164 @@ +package com.ljsd.controller; + +import com.ljsd.redis.RedisKey; +import com.ljsd.util.BaseGlobal; +import com.mongodb.BasicDBObject; +import com.mongodb.DBObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.List; +import java.util.Random; + +/** + * 好游戏SDK + */ +public class HaoGameGetUserController extends HttpServlet { + private final static String _COLLECTION_NAME = "user_info"; + private static final Logger LOGGER = LoggerFactory.getLogger(HaoGameGetUserController.class); + + public HaoGameGetUserController() { + super(); + } + + public void destroy() { + super.destroy(); + } + + + /** + * 好游戏登录 + */ + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + DBObject res = new BasicDBObject(); + String openId = request.getParameter("openId"); + if (openId == null || openId.isEmpty()) { + returnErrorToFront(res, response, "openId is empty"); + return; + } + try { + String banInfo = BaseGlobal.getInstance().redisApp.get(RedisKey.Ban_Open_Id, openId, String.class, -1); + if (banInfo != null) { + String[] split = banInfo.split("\\|"); + long currentTimeMillis = System.currentTimeMillis(); + if (Long.parseLong(split[0]) > currentTimeMillis) { + returnErrorToFront(res, response, banInfo); + LOGGER.info("doGet can not login Ban_Open_Id=>{} openId=>{} banInfo==null ? {}", RedisKey.Ban_Open_Id, openId, banInfo); + return; + } else { + BaseGlobal.getInstance().redisApp.del(RedisKey.Ban_Open_Id, openId); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + String serverId = request.getParameter("serverId"); + if (serverId == null || serverId.isEmpty()) { + returnErrorToFront(res, response, "serverId is empty"); + return; + } + String token = request.getParameter("token"); + if (token == null || token.isEmpty()) { + returnErrorToFront(res, response, "token is empty"); + return; + } + String platform = request.getParameter("platform"); //平台类型 + if (platform == null || platform.isEmpty()) { + returnErrorToFront(res, response, "platform is empty"); + return; + } + String gid = request.getParameter("gid"); //gid + String pid = request.getParameter("pid"); //pid + + + LOGGER.info("the opendId = {},token={},platform={}", openId, token, platform); + try { + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=utf-8"); + DBObject dbObject = new BasicDBObject(); + dbObject.put("openId", openId); + dbObject.put("serverId", serverId); + dbObject.put("platform", platform); + DBObject serverDBObject = new BasicDBObject(); + serverDBObject.put("server_id", serverId); + List server_info = BaseGlobal.getInstance().mongoDBPool.find("server_info", serverDBObject); + if (server_info.size() == 0) { + returnErrorToFront(res, response, "服务器信息获取错误"); + return; + } + int uid = 0; + //加分布式锁 + List userInfos = BaseGlobal.getInstance().mongoDBPool.find(_COLLECTION_NAME, dbObject); + if (userInfos.size() == 0) { + try { + boolean getLock = false; + while (!getLock) { + getLock = BaseGlobal.getInstance().redisApp.tryGetDistributedLock(RedisKey.REGISTER_LOCK, "", "get", 800); + if (!getLock) { + continue; + } + userInfos = BaseGlobal.getInstance().mongoDBPool.find(_COLLECTION_NAME, dbObject); + //双重校验 + if (userInfos.size() == 0) { + DBObject next = server_info.iterator().next(); + Object register_state = next.get("register_state"); + if (register_state != null && register_state.equals("0")) { + returnErrorToFront(res, response, "该服务器已停止注册,请选择其他服务器游戏"); + return; + } + uid = BaseGlobal.getInstance().mongoDBPool.inc("uid") + 10000000; + dbObject.put("uid", uid); + dbObject.put("_id", uid); + userInfos.add(dbObject); + if (gid != null && !gid.isEmpty()) { + dbObject.put("gid", gid); + } + if (pid != null && !pid.isEmpty()) { + dbObject.put("pid", pid); + } + BaseGlobal.getInstance().mongoDBPool.save(_COLLECTION_NAME, dbObject); + } + } + } finally { + BaseGlobal.getInstance().redisApp.releaseDistributedLock(RedisKey.REGISTER_LOCK, "", "get"); + } + } + Random random = new Random(); + int utoken = Math.abs(random.nextInt()); + uid = (int) userInfos.get(0).get("uid"); + res.put("uid", uid); + res.put("token", utoken); + res.put("errorCode", 0); + BaseGlobal.getInstance().redisApp.set(RedisKey.TOKEN, String.valueOf(uid), utoken, -1, false); + BaseGlobal.getInstance().redisApp.set(RedisKey.PIDGIDTEMP, String.valueOf(uid), pid + "#" + gid, -1, false); + + PrintWriter out = response.getWriter(); + out.print(res); + out.flush(); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void returnErrorToFront(DBObject res, HttpServletResponse response, String errorReason) throws IOException { + res.put("errorCode", -1); + res.put("reason", errorReason); + PrintWriter out = response.getWriter(); + out.print(res); + out.flush(); + out.close(); + } + + + public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + this.doGet(request, response); + + } +} diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 6ee6282..dc327cc 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -153,6 +153,17 @@ + + getHaoGameUserInfo + com.ljsd.controller.HaoGameGetUserController + + + + getHaoGameUserInfo + /getHaoGameUserInfo + + + com.ljsd.listener.WebContextListener