You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

228 lines
10 KiB
Java

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package com.manage.controller;
import com.alibaba.fastjson.JSON;
import com.manage.dao.Power_UserMapper;
import com.manage.encrypt.Base64;
import com.manage.encrypt.MD5;
import com.manage.entity.*;
import com.manage.service.*;
import com.manage.service.cache.Cache;
import com.manage.service.cache.CacheManager;
import com.manage.service.webSocket.WsPool;
import com.manage.util.*;
import com.manage.vo.*;
import org.apache.commons.lang3.StringUtils;
import org.java_websocket.WebSocket;
import org.jetbrains.annotations.NotNull;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import redis.clients.jedis.Jedis;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.*;
@Controller
public class LoginController {
@Value("${TOKEN_EXPIRE_TIME}")
private long TOKEN_EXPIRE_TIME;
@Value("${SERVER_IP}")
private String SERVER_IP;
@Value("${SERVER_PORT}")
private String SERVER_PORT;
@Value("${EMRRECORD_URLHEAD}")
private String EMRRECOD_URLHEAD;
@Autowired
private Power_UserService powerUserService;
@Autowired
private Power_MenuService powerMenuService;
@Autowired
private LogService logService;
@Autowired
private Power_DeptService power_deptService;
@Autowired
LoginService loginService;
@Autowired
private Power_UserMapper power_userMapper;
@RequestMapping(value = "login",method = RequestMethod.GET)
public String toLogin(Model model ,HttpServletRequest request){
CacheManager.addExcCount("noExc");
//同一浏览器打开login直接触发注销登录session
// loginService.removeOldUserOnLogin(request);
return "loginDir/login";
}
@RequestMapping(value = "login",method = RequestMethod.POST)
@ResponseBody
public Msg login(Power_User powerUser,HttpServletResponse response, HttpServletRequest request,Model model) throws Exception {
Jedis redis = JedisPoolUtil.getJedisPoolInstance().getResource();
try {
String userPwd = powerUser.getUserPwd();
String userName = powerUser.getUserName();
String userInfo = redis.get(userName);
//用来记录错误的次数
String errorPwsCount = "0";
//没有这个id的话新建一个
if (userInfo == null) {
redis.set(userName, errorPwsCount);
}
//获取已经记录错误次数
int i = Integer.parseInt(redis.get(userName));
//小于5可以继续登录,大于5
if (i < 5) {
try {
Power_UserVo user = powerUserService.findPowerUserByUserNameAndUserPwd(powerUser);
//添加进操作日志
Power_Log log = new Power_Log();
if( user != null){
//如处于登录状态,先清除缓存
//CacheManager.removeCacheByObject(user);
//记住
MyCookieUtil.remember(request, response);
//清除用户登录错误次数缓存
CacheManager.clearOnly(powerUser.getUserName());
//存session密码置空
//是否记住密码功能
MyCookieUtil.remember(request, response);
//设置token缓存
String date = String.valueOf(DateUtils.getDate());
String token = UUID.randomUUID().toString();
ActionScopeUtils.setSessionAttribute("token",token,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME))/1000);
//设置用户登录次数缓存
SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
CacheManager.addloginUserCount(fmt.format(new Date()),user.getUserName());
CacheManager.addExcCount("noExc");
List<Power_Menu> list = null;
List<User_Dept_Menu> menuList = new ArrayList<>();
Set<String> menus = new LinkedHashSet<>();
if (user.getRoleId().equals(0) || user.getRoleId().equals(-100)) {
list = powerMenuService.queryAllPowerMenu(null,user.getRoleId());
} else {
list = powerMenuService.selectUserAndRoleMenuListPower(user.getUserId(),null);
}
if(null != list && !list.isEmpty()){
for (Power_Menu power_menu : list) {
User_Dept_Menu deptMenu = new User_Dept_Menu();
String menuUrl = power_menu.getMenuUrl();
if (StringUtils.isNotBlank(menuUrl)) {
BeanUtils.copyProperties(power_menu, deptMenu);
deptMenu.setMethodParent(power_menu.getParentId());
menuList.add(deptMenu);
}
if (StringUtils.isNotBlank(power_menu.getMethod())) {
menus.add(power_menu.getMenuUrl());
}
}
}
user.setMenuList(menuList);
user.setMenus(menus);
//设置科室
StringBuilder power_depts = new StringBuilder();
List<Power_Dept> power_depts1 = power_deptService.selectByPrimaryKeys(user.getDeptId());
for(int j=0;j<power_depts1.size();j++){
if(j<power_depts1.size()-1){
power_depts.append(power_depts1.get(j).getDeptName()).append(",");
}else{
power_depts.append(power_depts1.get(j).getDeptName());
}
}
user.setRemark(power_depts.toString());
StringBuilder power_depts3 = new StringBuilder();
if (user.getDeptIdQuality()!=null){
List<Power_Dept> power_depts2 = power_deptService.selectByPrimaryKeys(user.getDeptIdQuality());
for(int a=0;a<power_depts2.size();a++){
if(a<power_depts2.size()-1){
power_depts3.append(power_depts2.get(a).getDeptCode()).append(",");
}else{
power_depts3.append(power_depts2.get(a).getDeptCode());
}
}
user.setDeptIdQuality(power_depts3.toString());
}
//设置进缓存
CacheManager.putCache(token,new Cache(date,user,TOKEN_EXPIRE_TIME));
ActionScopeUtils.setSessionAttribute("CURRENT_USER",user,Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME))/1000);
String reg = "^(?![A-Za-z]+$)(?![A-Z\\d]+$)(?![A-Z\\W]+$)(?![a-z\\d]+$)(?![a-z\\W]+$)(?![\\d\\W]+$)\\S{8,20}$";
boolean msg=userPwd.matches(reg);
redis.del(userName);
JedisPoolUtil.close(redis);
if (msg==false){
String url = "http://" + SERVER_IP + ":" + SERVER_PORT +"/power"+ "/font/updatePassword";
return Msg.success().add("url", url);
}else {
String url = "http://" + SERVER_IP + ":" + SERVER_PORT + "/power/gatewayPage";
return Msg.success().add("url", url);
}
}else{
//登录失败
Integer wrongNum = 1;
Cache cache = CacheManager.getCacheInfo(powerUser.getUserName());
if(cache != null){
//缓存中错误次数
Integer currentNum = (Integer)cache.getValue();
//叠加1
wrongNum += currentNum;
}
//先清除后添加缓存
CacheManager.clearOnly(powerUser.getUserName());
CacheManager.putCache(powerUser.getUserName(),new Cache(powerUser.getUserName(),wrongNum));
log.setCreater(powerUser.getUserName());
log.setLogTitle("登录");
log.setLogContent("用户密码错误");
log.setRemark("已错误【"+wrongNum+"】次");
logService.insert(log);
request.setAttribute("msg", "用户名或密码不正确");
redis.incr(userName);
JedisPoolUtil.close(redis);
return Msg.failUser();
}
}catch (Exception e){
ExceptionPrintUtil.printException(e);
e.printStackTrace();
CacheManager.addExcCount("exc");
}
}else {
//失败次数大于五时锁十五分钟
redis.setex(userName, 900, i + "");
JedisPoolUtil.close(redis);
return Msg.failUser2();
}
return null;
} catch (NumberFormatException e) {
throw new RuntimeException(e);
}finally {
JedisPoolUtil.close(redis);
}
}
@RequestMapping("refuse")
public String refuse(){
return "refuse";
}
//获取session所剩时间
@RequestMapping(value = "getSessionRemainingTime",method = RequestMethod.GET,produces = {"text/json;charset=UTF-8"})
@ResponseBody
public String getSessionRemainingTime(HttpServletRequest request)throws Exception{
long lastAccessTime = 0L;
String sessionId = request.getSession().getId();
lastAccessTime = (long)request.getSession().getAttribute(sessionId);
return JSON.toJSONString(TOKEN_EXPIRE_TIME-(System.currentTimeMillis()-lastAccessTime));
}
}