package com.fr.plugin.web.hander; import com.fanruan.api.log.LogKit; import com.fr.decision.authority.AuthorityContext; import com.fr.decision.authority.data.User; import com.fr.decision.fun.impl.BaseHttpHandler; import com.fr.decision.webservice.v10.login.LoginService; import com.fr.general.FRLogger; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.plugin.dao.MyEntityDao; import com.fr.plugin.entitys.YTUserEntity; import com.fr.plugin.entitys.YtOutputMyEntity; import com.fr.plugin.utils.UserSync; import com.fr.plugin.utils.YiTuanMaManager; import com.fr.plugin.utils.YiTuanMaUtils; import com.fr.plugin.yt.MyDecisionDBAccess; import com.fr.stable.StringUtils; import com.fr.stable.db.action.DBAction; import com.fr.stable.db.dao.DAOContext; import com.fr.stable.query.QueryFactory; import com.fr.stable.query.restriction.RestrictionFactory; import com.fr.third.springframework.web.bind.annotation.RequestMethod; import com.fr.web.utils.WebUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; public class H5LoginHandler extends BaseHttpHandler { @Override public RequestMethod getMethod() { return null; } @Override public String getPath() { return "/yt/h5login"; } @Override public boolean isPublic() { return true; } private boolean autoLogin(HttpServletRequest req, HttpServletResponse res) throws Exception { String authCode = WebUtils.getHTTPRequestParameter(req, "authCode"); String clientId = WebUtils.getHTTPRequestParameter(req, "clientId"); if (StringUtils.isBlank(clientId)) { String id = req.getParameter("callBack"); clientId = getClientIdById(id); } if (StringUtils.isEmpty(authCode)) { FRLogger.getLogger().error("==================== 获取xx码authCode失败!"); FineLoggerFactory.getLogger().info("登陆用户失败,响应:" + res); return false; } String access_token = YiTuanMaUtils.getAccessToken(clientId); String yiTuanMaUserId = YiTuanMaUtils.getCurrentUserId(clientId, authCode, access_token); YTUserEntity userEntity = UserSync.findById(yiTuanMaUserId); String fsUserName = ""; if (userEntity != null) { String phone = userEntity.getPhone(); User user = getUserByPhone(phone); if (user != null) { fsUserName = user.getUserName(); } } if (StringUtils.isNotBlank(fsUserName)) { String callBack = req.getParameter("callBack"); LoginService.getInstance().login(req, res, fsUserName); if ("false".equalsIgnoreCase(callBack)) { callBack = ""; } if (StringUtils.isNotBlank(callBack)) { if (!callBack.startsWith("http")) { callBack = getCallbackUrlById(callBack); } sendRedirect(req, res, callBack); } else { String header = req.getHeader("user-agent"); String cloudHost = YiTuanMaManager.getInstance().getUrl(); if (isH5(header)) { cloudHost += "/url/mobile"; } sendRedirect(req, res, cloudHost); } } return false; } private String getCallbackUrlById(String id) { try { return MyDecisionDBAccess.getAccessor().runDMLAction(new DBAction() { @Override public String run(DAOContext daoContext) throws Exception { MyEntityDao dao = daoContext.getDAO(MyEntityDao.class); YtOutputMyEntity myEntity = dao.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id))); LogKit.error("查询到:{} 回调地址为:{}", id, myEntity.getGoUrl()); return myEntity.getGoUrl(); } }); } catch (Exception e) { LogKit.error("查询配置失败", e); } return ""; } private boolean isH5(String header) { //Mozilla/5.0 (iPhone; CPU iPhone OS 13_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 TencentMTA/1 ESENYUN_TOKEN:cd97af45-7c7b-4da7-81ca-655347629c79 if (StringUtils.isNotBlank(header)) { return header.contains("ESENYUN_TOKEN"); } return false; } private void sendRedirect(HttpServletRequest req, HttpServletResponse res, String url) { res.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY); res.setHeader("Location", url); } private User getUserByPhone(String phone) { try { return AuthorityContext.getInstance().getUserController().findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("mobile", phone))); } catch (Exception e) { e.printStackTrace(); } return null; } @Override public void handle(HttpServletRequest req, HttpServletResponse httpServletResponse) throws Exception { String authCode = req.getParameter("authCode"); String clientId = req.getParameter("clientId"); if (StringUtils.isNotBlank(authCode)) { boolean login = autoLogin(req, httpServletResponse); JSONObject jsonObject = new JSONObject(); if (login) { jsonObject.put("status", -1); jsonObject.put("message", "登录失败"); com.fr.web.utils.WebUtils.flushSuccessMessageAutoClose(req, httpServletResponse, jsonObject); return; } } else { HashMap hashMap = new HashMap<>(); if (StringUtils.isBlank(clientId)) { String id = req.getParameter("callBack"); clientId = getClientIdById(id); } hashMap.put("ticket", YiTuanMaUtils.getTicket(clientId)); hashMap.put("clientId", clientId); hashMap.put("servletURL", req.getContextPath() + req.getServletPath()); WebUtils.writeOutTemplate("/com/fr/plugin/web/login.tpl", httpServletResponse, hashMap); } } private String getClientIdById(String id) { try { return MyDecisionDBAccess.getAccessor().runQueryAction(new DBAction() { @Override public String run(DAOContext daoContext) throws Exception { MyEntityDao dao = daoContext.getDAO(MyEntityDao.class); YtOutputMyEntity myEntity = dao.findOne(QueryFactory.create().addRestriction(RestrictionFactory.eq("id", id))); return myEntity.getClientId(); } }); } catch (Exception e) { e.printStackTrace(); } return ""; } }