LoginController.java 5 KB
package com.huaheng.pc.system.user.controller;

import com.huaheng.common.utils.ServletUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.framework.web.controller.BaseController;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.domain.RetCode;
import com.huaheng.pc.system.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * 登录验证
 *
 * @author huaheng
 */

@Controller
public class LoginController extends BaseController
{
    //解密用的
    private static String base64hash = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    @Autowired
    private IUserService userService;
//    @Autowired
//    private ICompanyService companyService;


    @GetMapping("/login")
    public String login(HttpServletRequest request, HttpServletResponse response)
    {
        // 如果是Ajax请求,返回Json字符串。
        if (ServletUtils.isAjaxRequest(request))
        {
            AjaxResult ajaxResult = AjaxResult.setResult(RetCode.UNAUTHORIZED,"未登录或登录超时。请重新登录", null);
            return ServletUtils.renderString(response, ajaxResult.toString());
        }
        return "login";
    }

//    @PostMapping(value = "/login")
//    @ResponseBody
//    public AjaxResult ajaxLogin(String username, String password, String warehouse, Boolean rememberMe)
//    {
//        String[] warehouseArray = warehouse.split(",");
//        Integer warehouseId = Integer.valueOf(warehouseArray[0]);
//        String warehouseCode = warehouseArray[1];
//        AjaxResult ajaxResult = ajaxLogin(username, password, warehouseId, warehouseCode, false);
//        return  ajaxResult;
//    }

    /**
     * 网页session登录
     * */
    @PostMapping(value = "/login")
    @ResponseBody
    public AjaxResult ajaxLogin(String loginName, String password, String warehouse, String warehouseCode, Boolean rememberMe, HttpServletRequest request) {
        // 解码 loginName 和 password
        String name = LoginController.atob(loginName);
        String passwd = LoginController.atob(password);

        // 解析 warehouseCode
        if (StringUtils.isNotEmpty(warehouse)) {
            String[] warehouseArray = warehouse.split(",");
            warehouseCode = warehouseArray[1];
        }

        // 检查并截取 loginName
        if (name.length() >= 6) {
            loginName = name.substring(3, name.length() - 3);
        } else {
            throw new IllegalArgumentException("loginName 解析错误:长度不足,可能是乱码了:"+name);
        }

        // 检查并截取 password
        if (passwd.length() >= 18) {
            password = passwd.substring(13, passwd.length() - 5);
        } else {
            throw new IllegalArgumentException("password 解析错误:长度不足");
        }

        // 执行登录操作
        AjaxResult ajaxResult = userService.login(loginName, password, warehouseCode, rememberMe);
        return ajaxResult;
    }


    @GetMapping("/unauth")
    public String unauth()
    {
        return "/error/unauth";
    }


    //解密
    public static String atob(String inStr) {
        if (inStr == null)
            return null;
        inStr = inStr.replaceAll("\\s|=", "");
        StringBuilder result = new StringBuilder();
        int cur;
        int prev = -1;
        int mod;
        int i = 0;
        while (i < inStr.length()) {
            cur = base64hash.indexOf(inStr.charAt(i));
            mod = i % 4;
            switch (mod) {
                case 0:
                    break;
                case 1:
                    result.append(String.valueOf((char) (prev << 2 | cur >> 4)));
                    break;
                case 2:

                    result.append(String.valueOf((char) ((prev & 0x0f) << 4 | cur >> 2)));
                    break;
                case 3:

                    result.append(String.valueOf((char) ((prev & 3) << 6 | cur)));
                    break;
            }
            prev = cur;
            i++;
        }
        return result.toString();
    }



    /**
     * 通过用户名获取可以登陆的仓库列表
     */
    @PostMapping("/getWarehouseByUserCode")
    @ResponseBody
    public AjaxResult getWarehouseByUserCode(String loginName)
    {
        if (StringUtils.isNotEmpty(loginName))
        {
            List<Map<String, Object>> list = userService.getWarehouseByUserCode(loginName);
            return  AjaxResult.success(list);
        }
        else
        {
            return  AjaxResult.error("用户名不能为空");
        }
    }
}