ludc
2024-12-04 e405b861b9521f5ea38c5402203a5b05988f9de2
Source/plt-web/plt-web-parent/plt-web/src/main/java/com/vci/web/controller/OsLoginController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,186 @@
package com.vci.web.controller;
import com.vci.bo.LoginResultBO;
import com.vci.dto.LoginUserDTO;
import com.vci.starter.web.annotation.controller.VciUnCheckRight;
import com.vci.starter.web.annotation.log.VciBusinessLog;
import com.vci.starter.web.constant.TokenKeyConstant;
import com.vci.starter.web.pagemodel.BaseResult;
import com.vci.starter.web.pagemodel.RequestClientInfo;
import com.vci.starter.web.pagemodel.SessionInfo;
import com.vci.starter.web.util.MessageUtils;
import com.vci.starter.web.util.VciBaseUtil;
import com.vci.starter.web.util.WebThreadLocalUtil;
import com.vci.web.service.OsLoginServiceI;
import eu.bitwalker.useragentutils.*;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.util.Locale;
import java.util.Map;
/**
 * ç™»å½•控制器
 * @author weidy
 * @date 2021-1-28
 */
@Controller
@RequestMapping("/framework/loginController")
@VciBusinessLog(modelName="登录服务")
public class OsLoginController {
   /**
    * ç™»å½•服务
    */
   @Autowired
   private OsLoginServiceI loginService;
   /**
    * æ—¥å¿—
    */
   private Logger logger = LoggerFactory.getLogger(getClass());
   /**
    * ç™»å½•,这个地方主要是为了登录后单独的业务
    * @param userDTO ç”¨æˆ·çš„对象
    * @param request è¯·æ±‚对象
    * @param clientInfo å®¢æˆ·ç«¯çš„信息
    * @return æ‰§è¡Œç»“æžœ
    */
   @VciBusinessLog(operateName="登录")
   @PostMapping(value = "/login")
   @ResponseBody
   @VciUnCheckRight()
   public BaseResult login(LoginUserDTO userDTO, HttpServletRequest request, RequestClientInfo clientInfo){
      VciBaseUtil.alertNotNull(userDTO,"用户对象",clientInfo,"请求客户端信息");
      try {
         wrapperBrowserInfo(clientInfo,request);
         LoginResultBO loginResultBO = loginService.login(userDTO,clientInfo);
         if(loginResultBO.isSuccess()){
            return BaseResult.success(loginResultBO);
         }else{
            BaseResult result = BaseResult.fail(loginResultBO.getFailMsg());
            result.setCode(200);//状态码不是200前端无法获取到obj中的信息
            if(StringUtils.isBlank(loginResultBO.getFailMsg())){
               result.setMsg(MessageUtils.get(loginResultBO.getFailCode(),loginResultBO.getFailMsgArray()));
            }
            result.setObj(loginResultBO);
            return result;
         }
      }catch (Exception e){
         e.printStackTrace();
         String msg = "调用登录方法时出现错误,原因:"+VciBaseUtil.getExceptionMessage(e);
         logger.error(msg);
         return BaseResult.fail(msg);
      }
   }
   /**
    * èŽ·å–å®¢æˆ·ç«¯è¯·æ±‚ä¿¡æ¯,为了隔绝在server层使用request
    * @param request è¯·æ±‚对象
    * @param clientInfo å®¢æˆ·ç«¯ä¿¡æ¯
    */
   private void wrapperBrowserInfo(RequestClientInfo clientInfo,HttpServletRequest request) {
      UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent"));
      if(StringUtils.isBlank(clientInfo.getIpaddress())){
         //找IP地址
         clientInfo.setIpaddress(getIpAddressFromRequest(request));
      }
      if(userAgent !=null) {
         Browser browser = userAgent.getBrowser();
         OperatingSystem os = userAgent.getOperatingSystem();
         clientInfo.setOsversion(os != null ? os.getName() : "");
         clientInfo.setBrowser(browser != null ? browser.getName() : "IE");
         String version = "";
         if (browser != null) {
            Version version1 = browser.getVersion(request.getHeader("User-Agent"));
            if (version1 != null) {
               version = version1.getVersion();
            }
         }
         clientInfo.setBrowserversion(version);
         if (os != null) {
            clientInfo.setRequestType(os.getDeviceType().getName());
            if (DeviceType.COMPUTER.getName().equals(clientInfo.getRequestType())) {
               clientInfo.setRequestType("browser");
            }
         }
         Locale loc = Locale.getDefault();
         clientInfo.setCountry(loc.getCountry());
         clientInfo.setLanguage(loc.toLanguageTag());
         Map<String,String> map = System.getenv();
         clientInfo.setMachine(map.get("COMPUTERNAME"));
         clientInfo.setOsUser(map.get("USERNAME"));
      }
   }
   /**
    * ä»Žè¯·æ±‚中获取ip地址,为了隔绝在server层使用request
    * @param request è¯·æ±‚对象
    * @return ip地址,没有找到默认为127.0.0.1
    */
   private String getIpAddressFromRequest(HttpServletRequest request){
      String ip = request.getHeader("X-Forwarded-For");
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("Proxy-Client-IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("WL-Proxy-Client-IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("HTTP_CLIENT_IP");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getHeader("HTTP_X_FORWARDED_FOR");
      }
      if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
         ip = request.getRemoteAddr();
      }
      if (ip == null || ip.length() == 0 || ip.indexOf("0:0:0:0:0:0:0:1") >-1) {
         //0:0:0:0:0:0:0:1是本机在访问
         ip = "127.0.0.1";
      }
      return ip;
   }
   /**
    * èŽ·å–ç”¨æˆ·çš„ä¼šè¯ä¿¡æ¯
    * @return success为true表示获取成功,否则msg是错误信息,obj属性是获取的会话对象信息
    */
   @VciUnCheckRight
   @PostMapping("/getSessionInfo")
   @ResponseBody
   public BaseResult getSessionInfo(){
      BaseResult<SessionInfo> json = new BaseResult<>();
      SessionInfo sessionInfo = WebThreadLocalUtil.getCurrentUserSessionInfoInThread();
      if(sessionInfo != null){
         json = json.success(sessionInfo);
      }
      return json;
   }
   /**
    * æ‰§è¡Œé€€å‡º
    * @param request è¯·æ±‚对象
    * @return success为true表示退出成功,前端不需要判断结果
    */
   @VciUnCheckRight
   @PostMapping("/logout")
   @ResponseBody
   public BaseResult logout(HttpServletRequest request){
      String userToken = request.getHeader(TokenKeyConstant.USER_TOKEN_KEY);
      loginService.logout(userToken);
      return BaseResult.success();
   }
}