修改验证码

master
linjj 2 years ago
parent 71b663e9c3
commit 56bc3c6cbf

@ -53,6 +53,13 @@
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>

@ -36,6 +36,7 @@ import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@ -912,4 +913,9 @@ public class FontController {
}
return Msg.correctMessage();
}
@RequestMapping(value = "text")
public String textPage(){
throw new RuntimeException("出现了一个异常");
}
}

@ -15,15 +15,23 @@ package com.manage.controller;
import com.alibaba.fastjson.support.spring.FastJsonJsonView;
import com.manage.util.ExceptionPrintUtil;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.NoHandlerFoundException;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NoHandlerFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public ModelAndView runtimeHandler404(Exception e) {
return return404(e, "服务器出错了,请联系系统管理员");
}
@ExceptionHandler(value = Exception.class)//指定拦截的异常
public ModelAndView errorHandler(Exception e) {
@ -35,6 +43,9 @@ public class GlobalExceptionHandler {
return returnMv(e, "服务器出错了,请联系系统管理员");
}
private ModelAndView returnMv(Exception e, String msg) {
ModelAndView mv = new ModelAndView();
/* 使用FastJson提供的FastJsonJsonView视图返回不需要捕获异常 */
@ -48,4 +59,21 @@ public class GlobalExceptionHandler {
e.printStackTrace();
return mv;
}
private ModelAndView return404(Exception e, String msg) {
ModelAndView mv = new ModelAndView();
/* 使用FastJson提供的FastJsonJsonView视图返回不需要捕获异常 */
FastJsonJsonView view = new FastJsonJsonView();
Map<String, Object> attributes = new HashMap<>(1);
attributes.put("code", "404");
attributes.put("msg", msg);
view.setAttributesMap(attributes);
mv.setView(view);
ExceptionPrintUtil.printException(e);
e.printStackTrace();
return mv;
}
}

@ -2,6 +2,8 @@ package com.manage.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.code.kaptcha.Constants;
import com.google.code.kaptcha.Producer;
import com.manage.bean.LoginVoRedis;
import com.manage.dao.Power_Login_SetMapper;
import com.manage.encrypt.Base64;
@ -21,13 +23,20 @@ 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.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import redis.clients.jedis.Jedis;
import sun.security.provider.MD5;
import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
@ -35,6 +44,9 @@ import java.util.*;
@Controller
public class LoginController {
@Autowired
private Producer captchaProducer;
@Value("${TOKEN_EXPIRE_TIME}")
private long TOKEN_EXPIRE_TIME;
@Value("${sysFlag}")
@ -62,9 +74,7 @@ public class LoginController {
@Value("${EMRMEDICALRECORD_PORT}")
private String port;
//
// @Autowired
// private JedisPool jedisPool;
@Value("${POWER_PORT}")
private String POWER_PORT;
@ -79,128 +89,126 @@ public class LoginController {
@RequestMapping(value = "login", method = RequestMethod.POST)
@ResponseBody
public Msg login(Power_User powerUser, HttpServletResponse response, HttpServletRequest request, Model model) {
public Msg login(Power_User powerUser, HttpServletResponse response, HttpServletRequest request, Model model,String code) {
//判断是否在可登录时间内
Power_Log unlockDate = logService.getUnlockDate(powerUser.getUserName());
//不等于空说明账号次数过多被锁定
if (unlockDate != null) {
return Msg.failUnlockUser(unlockDate.getUnlockDate());
}
//正确的验证码
String original =(String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY);
String userName = powerUser.getUserName();
String userPwd = powerUser.getUserPwd();
if (!code.equalsIgnoreCase(original)) {
return Msg.codeUser();
}
if (!userName.equals("admin")) {
String s = "00" + userName;
powerUser.setUserName(s);
}
Jedis redis = JedisPoolUtil.getJedisPoolInstance().getResource();
String userInfo = redis.get(userName);
String errorPwsCount = "0";
if (userInfo == null) {
redis.set(userName, errorPwsCount);
}
int i = Integer.parseInt(redis.get(userName));
if (i < 5) {
try {
Power_UserVo user = powerUserService.findPowerUserByUserNameAndUserPwd(powerUser);
//添加进操作日志
Power_Log log = new Power_Log();
if (user != null) {
//存session密码置空
//是否记住密码功能
MyCookieUtil.remember(request, response);
//设置token缓存
String token = UUID.randomUUID().toString();
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 powerMenu : list) {
User_Dept_Menu deptMenu = new User_Dept_Menu();
String menuUrl = powerMenu.getMenuUrl();
if (StringUtils.isNotBlank(menuUrl)) {
BeanUtils.copyProperties(powerMenu, deptMenu);
deptMenu.setMethodParent(powerMenu.getParentId());
menuList.add(deptMenu);
}
if (StringUtils.isNotBlank(powerMenu.getMethod())) {
menus.add(powerMenu.getMenuUrl());
}
try {
Power_UserVo user = powerUserService.findPowerUserByUserNameAndUserPwd(powerUser);
//添加进操作日志
Power_Log log = new Power_Log();
if (user != null) {
//存session密码置空
//是否记住密码功能
MyCookieUtil.remember(request, response);
//设置token缓存
String token = UUID.randomUUID().toString();
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 powerMenu : list) {
User_Dept_Menu deptMenu = new User_Dept_Menu();
String menuUrl = powerMenu.getMenuUrl();
if (StringUtils.isNotBlank(menuUrl)) {
BeanUtils.copyProperties(powerMenu, deptMenu);
deptMenu.setMethodParent(powerMenu.getParentId());
menuList.add(deptMenu);
}
}
user.setMenuList(menuList);
user.setMenus(menus);
//设置科室
StringBuilder powerDepts = new StringBuilder();
List<Power_Dept> powerDeptsList = power_deptService.selectByPrimaryKeys(user.getDeptId());
for (int j = 0; j < powerDeptsList.size(); j++) {
if (j < powerDeptsList.size() - 1) {
powerDepts.append(powerDeptsList.get(j).getDeptName()).append(",");
} else {
powerDepts.append(powerDeptsList.get(j).getDeptName());
if (StringUtils.isNotBlank(powerMenu.getMethod())) {
menus.add(powerMenu.getMenuUrl());
}
}
Integer roleId = user.getRoleId();
if (null != roleId && roleId != 0 && roleId != -100) {
user.setRemark(powerDepts.toString());
}
//清除用户登录错误次数缓存
CacheManager.clearOnly(powerUser.getUserName());
//设置进缓存
CacheManager.putCache(token, new Cache(user, System.currentTimeMillis(), TOKEN_EXPIRE_TIME * 1000));
ActionScopeUtils.setSessionAttribute("token", token, Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
ActionScopeUtils.setSessionAttribute("CURRENT_USER", user, Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
//检测弱密码强制跳转修改密码
//大小写,中文,数据,特殊符号必须存在三种
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);
}
//单点登录跳转
String url = "";
if (sysFlag == 2) {
url = EMRMEDICALRECORD_URLHEAD + "/login?token=" + token + "&userName=" + user.getUserName() + "&flag=1";
}
user.setMenuList(menuList);
user.setMenus(menus);
//设置科室
StringBuilder powerDepts = new StringBuilder();
List<Power_Dept> powerDeptsList = power_deptService.selectByPrimaryKeys(user.getDeptId());
for (int j = 0; j < powerDeptsList.size(); j++) {
if (j < powerDeptsList.size() - 1) {
powerDepts.append(powerDeptsList.get(j).getDeptName()).append(",");
} else {
//获取本地端口
int POWER_PORT = request.getLocalPort();
url = "http://" + ip + ":" + POWER_PORT + "/power/gatewayPage";
powerDepts.append(powerDeptsList.get(j).getDeptName());
}
}
Integer roleId = user.getRoleId();
if (null != roleId && roleId != 0 && roleId != -100) {
user.setRemark(powerDepts.toString());
}
//清除用户登录错误次数缓存
CacheManager.clearOnly(powerUser.getUserName());
//设置进缓存
CacheManager.putCache(token, new Cache(user, System.currentTimeMillis(), TOKEN_EXPIRE_TIME * 1000));
ActionScopeUtils.setSessionAttribute("token", token, Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
ActionScopeUtils.setSessionAttribute("CURRENT_USER", user, Integer.valueOf(String.valueOf(TOKEN_EXPIRE_TIME)));
//检测弱密码强制跳转修改密码
//大小写,中文,数据,特殊符号必须存在三种
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);
if (msg == false) {
String url = "http://" + SERVER_IP + ":" + SERVER_PORT + "/power" + "/font/updatePassword";
return Msg.success().add("url", url);
}
//单点登录跳转
String url = "";
if (sysFlag == 2) {
url = EMRMEDICALRECORD_URLHEAD + "/login?token=" + token + "&userName=" + user.getUserName() + "&flag=1";
} else {
//登录失败
Integer wrongNum = 1;
Cache cache = CacheManager.getCacheInfo(powerUser.getUserName());
if (cache != null) {
//缓存中错误次数
Integer currentNum = (Integer) cache.getValue();
//叠加1
wrongNum += currentNum;
}
//添加缓存
CacheManager.putCache(powerUser.getUserName(), new Cache(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();
//获取本地端口
int POWER_PORT = request.getLocalPort();
url = "http://" + ip + ":" + POWER_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;
}
} catch (Exception e) {
e.printStackTrace();
CacheManager.addExcCount("exc");
//添加缓存
CacheManager.putCache(powerUser.getUserName(), new Cache(wrongNum));
log.setCreater(powerUser.getUserName());
log.setLogTitle("登录");
log.setLogContent("用户密码错误");
log.setRemark("已错误【" + wrongNum + "】次");
//如果错误次数=5添加锁定时间
if (wrongNum == 5) {
SimpleDateFormat UnlockFmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
log.setUnlockDate(UnlockFmt.format(new Date().getTime() + 15 * 60 * 1000));
}
logService.insert(log);
request.setAttribute("msg", "用户名或密码不正确");
return Msg.failUser();
}
} else {
//失败次数大于五时锁十五分钟
redis.setex(userName, 900, i + "");
JedisPoolUtil.close(redis);
return Msg.failUser2();
} catch (Exception e) {
e.printStackTrace();
CacheManager.addExcCount("exc");
}
return null;
}
@ -225,4 +233,45 @@ public class LoginController {
return null;
}
}
/**
*
*
* @param model
* @param request
* @param response
* @param timestamp
* @return
* @throws IOException
*/
@RequestMapping(value = "/getCaptchaImage", method = RequestMethod.GET)
public ModelAndView getCaptchaImage(Model model, HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "timestamp", required = false) String timestamp) throws IOException {
if (StringUtils.isEmpty(timestamp)) {
//System.out.println("没有时间戳\ttimestamp:" + timestamp);
model.addAttribute("timestamp", System.currentTimeMillis());
} else {
//System.out.println("有时间戳\ttimestamp:" + timestamp);
model.addAttribute("timestamp", timestamp);
}
response.setDateHeader("Expires", 0);
response.setHeader("Cache-Control", "no-store, no-cache, must-revalidate");
response.addHeader("Cache-Control", "post-check=0, pre-check=0");
response.setHeader("Pragma", "no-cache");
response.setContentType("image/jpeg");
String capText = captchaProducer.createText();
request.getSession().setAttribute(Constants.KAPTCHA_SESSION_KEY, capText);
BufferedImage bi = captchaProducer.createImage(capText);
ServletOutputStream out = response.getOutputStream();
ImageIO.write(bi, "jpg", out);
try {
out.flush();
} finally {
out.close();
}
return null;
}
}

@ -29,34 +29,33 @@
<property name="url" value="${jdbc.url}"/> <!--数据库地址-->
<property name="username" value="${jdbc.username}"/> <!--用户名-->
<property name="password" value="${jdbc.password}"/> <!--密码-->
<property name = "filters" value = "${filters}" />
<property name="filters" value="${filters}"/>
<!-- 最大并发连接数 -->
<property name = "maxActive" value = "${maxActive}" />
<property name="maxActive" value="${maxActive}"/>
<!-- 初始化连接数量 -->
<property name = "initialSize" value = "${initialSize}" />
<property name="initialSize" value="${initialSize}"/>
<!-- 配置获取连接等待超时的时间 -->
<property name = "maxWait" value = "${maxWait}" />
<property name="maxWait" value="${maxWait}"/>
<!-- 最小空闲连接数 -->
<property name = "minIdle" value = "${minIdle}" />
<property name="minIdle" value="${minIdle}"/>
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name = "timeBetweenEvictionRunsMillis" value ="${timeBetweenEvictionRunsMillis}" />
<property name="timeBetweenEvictionRunsMillis" value="${timeBetweenEvictionRunsMillis}"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name = "minEvictableIdleTimeMillis" value ="${minEvictableIdleTimeMillis}" />
<property name = "validationQuery" value = "${validationQuery}" />
<property name = "testWhileIdle" value = "${testWhileIdle}" />
<property name = "testOnBorrow" value = "${testOnBorrow}" />
<property name = "testOnReturn" value = "${testOnReturn}" />
<property name = "maxOpenPreparedStatements" value ="${maxOpenPreparedStatements}" />
<property name="minEvictableIdleTimeMillis" value="${minEvictableIdleTimeMillis}"/>
<property name="validationQuery" value="${validationQuery}"/>
<property name="testWhileIdle" value="${testWhileIdle}"/>
<property name="testOnBorrow" value="${testOnBorrow}"/>
<property name="testOnReturn" value="${testOnReturn}"/>
<property name="maxOpenPreparedStatements" value="${maxOpenPreparedStatements}"/>
<!-- 打开 removeAbandoned 功能 -->
<property name = "removeAbandoned" value = "${removeAbandoned}" />
<property name="removeAbandoned" value="${removeAbandoned}"/>
<!-- 1800 秒,也就是 30 分钟 -->
<property name = "removeAbandonedTimeout" value ="${removeAbandonedTimeout}" />
<property name="removeAbandonedTimeout" value="${removeAbandonedTimeout}"/>
<!-- 关闭 abanded 连接时输出错误日志 -->
<property name = "logAbandoned" value = "${logAbandoned}" />
<property name="logAbandoned" value="${logAbandoned}"/>
</bean>
<!-- ====================== 配置和MyBatis的整合 ======================== -->
<!--配置session工厂MyBatis的整合-->
@ -70,10 +69,10 @@
</bean>
<!-- mapper扫描 -->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="basePackage" value="com.manage.dao"></property>
</bean>-->
<!-- <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
<property name="basePackage" value="com.manage.dao"></property>
</bean>-->
<!-- 配置扫描器将mybatis接口的实现加入到IOC容器中 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
@ -115,6 +114,45 @@
</tx:attributes>
</tx:advice>
<!-- 验证码配置 -->
<bean id="captchaProducer" class="com.google.code.kaptcha.impl.DefaultKaptcha">
<property name="config">
<bean class="com.google.code.kaptcha.util.Config">
<constructor-arg>
<props>
<!-- 验证码宽度 -->
<prop key="kaptcha.image.width">150</prop>
<!-- 验证码高度 -->
<prop key="kaptcha.image.height">50</prop>
<!-- 生成验证码内容范围 -->
<prop key="kaptcha.textproducer.char.string">123456789abcDeFGHjkLmnoQqrsTUVWXYZ</prop>
<!-- 验证码个数 -->
<prop key="kaptcha.textproducer.char.length">4</prop>
<!-- 是否有边框 -->
<prop key="kaptcha.border">no</prop>
<!-- 边框颜色 -->
<prop key="kaptcha.border.color">105,179,90</prop>
<!-- 边框厚度 -->
<prop key="kaptcha.border.thickness">1</prop>
<!-- 验证码字体颜色 -->
<prop key="kaptcha.textproducer.font.color">black</prop>
<!-- 验证码字体大小 -->
<prop key="kaptcha.textproducer.font.size">30</prop>
<!-- 验证码所属字体样式 -->
<prop key="kaptcha.textproducer.font.names">楷体</prop>
<!-- 干扰线颜色 -->
<prop key="kaptcha.noise.color">black</prop>
<!-- 验证码文本字符间距 -->
<prop key="kaptcha.textproducer.char.space">3</prop>
<!-- 图片样式 :阴影-->
<prop key="kaptcha.obscurificator.impl">com.google.code.kaptcha.impl.ShadowGimpy</prop>
</props>
</constructor-arg>
</bean>
</property>
</bean>
<!-- Spring配置文件的核心点数据源、与 mybatis的整合事务控制 -->
@ -124,6 +162,6 @@
<!-- 使用annotation定义事务 -->
<!-- <tx:annotation-driven transaction-manager="transactionManager"/> -->
<!-- 定义切面功能 -->
<!-- <aop:aspectj-autoproxy />-->
<!-- <aop:aspectj-autoproxy />-->
<!-- 引入websocket -->
</beans>

@ -1,7 +1,7 @@
# \u62E6\u622A\u83DC\u5355\u914D\u7F6E\u6587\u4EF6 ljx 2019-4-27
#interceptRequest \u672A\u767B\u5F55\u4E4B\u524D\u653E\u884C\u3002\u9ED8\u8BA4\u4E3Anone
#ajaxRequest ajax\u8BF7\u6C42\u6CA1\u6709\u5BF9\u5E94\u6A21\u5757\uFF0C\u9700\u8981\u653E\u884C\u3002 \u9ED8\u8BA4\u4E3Anone
releaseRequest = /login,/logout,/services,/font,/refuse,/swagger-ui.html,/webjars,/swagger-resources,/v2,/ssoLogin,/getQRcode,/qRCodeLogin
releaseRequest = /login,/logout,/services,/font,/refuse,/swagger-ui.html,/webjars,/swagger-resources,/v2,/ssoLogin,/getQRcode,/qRCodeLogin,/check,/checkcode,/captcha,/getCaptchaImage
ajaxRequest = none
#session\u8FC7\u671F\u65F6\u95F4,\u5355\u4F4D\u79D2
@ -12,7 +12,7 @@ TOKEN_EXPIRE_TIME = 7200
#SERVER_IP = localhost
#SERVER_PORT = 8081
SERVER_IP = 10.100.23.1
SERVER_IP = localhost
SERVER_PORT = 8081
#power\u6743\u9650\u7CFB\u7EDFip
@ -23,11 +23,11 @@ POWER_PORT = ${SERVER_PORT}
#\u75C5\u6848\u5F52\u6863\u7CFB\u7EDFip
EMRMEDICALRECORD_IP = ${SERVER_IP}
#\u75C5\u6848\u5F52\u6863\u7CFB\u7EDF\u7AEF\u53E3
EMRMEDICALRECORD_PORT = ${SERVER_PORT}
EMRMEDICALRECORD_PORT = 8084
#\u75C5\u6848\u7BA1\u7406\u7CFB\u7EDFip
EMRRECORD_IP = ${SERVER_IP}
#\u75C5\u6848\u7BA1\u7406\u7CFB\u7EDF\u7AEF\u53E3
EMRRECORD_PORT = ${SERVER_PORT}
EMRRECORD_PORT = 8083
#\u75C5\u6848\u590D\u5370\u9884\u7EA6ip
EMRAPPLYCOPY_IP = ${SERVER_IP}

@ -1,8 +1,8 @@
#jdbc.url=jdbc\:mysql\://200.100.104.40\:3306/power?useUnicode\=true&characterEncoding\=utf-8
#jdbc.password=AbcXyz123
jdbc.url=jdbc\:mysql\://localhost\:3306/gmpower?useUnicode\=true&characterEncoding\=utf-8
jdbc.password=docus702
jdbc.url=jdbc\:mysql\://localhost\:3306/fs_power?useUnicode\=true&characterEncoding\=utf-8&serverTimezone\=GMT
jdbc.password=root
jdbc.driver=com.mysql.jdbc.Driver
jdbc.username=root

@ -0,0 +1,12 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>操作失败</title>
<meta name="author" content="pan_junbiao的博客">
</head>
<body>
<div align="center">
<h1>服务器异常,请联系管理员处理</h1>
</div>
</body>
</html>

@ -4,18 +4,18 @@
<%@ include file="/WEB-INF/jspf/common.jspf" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
String password="";
String userName="";
String checked="";
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
String password = "";
String userName = "";
String checked = "";
Cookie[] cookies = request.getCookies(); //取出cookie对象组
for(int i = 0; cookies != null && i < cookies.length;i++){
for (int i = 0; cookies != null && i < cookies.length; i++) {
Cookie cookie = cookies[i]; // 取出其中的一个对象含有name ,value
if(cookie != null && "name".equals(cookie.getName())){ //获取第一个cookie对象的name
if (cookie != null && "name".equals(cookie.getName())) { //获取第一个cookie对象的name
userName = URLDecoder.decode(cookie.getValue(), "UTF-8");//进行解码
checked = "checked";
}
if(cookie != null && "password".equals(cookie.getName())){
if (cookie != null && "password".equals(cookie.getName())) {
password = cookie.getValue();
password = Base64.decodeBase64(password);
}
@ -29,18 +29,20 @@
<title>嘉时软件</title>
</head>
<style>
*{
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.login{
.login {
width: 100%;
height: 100vh;
display: flex;
}
#banar{
#banar {
width: 300px;
height: 50px;
background-color: #999;
@ -53,12 +55,14 @@
margin: 10px;
display: inline-block;
}
#chang{
#chang {
font-size: 14px;
color: darkgreen;
cursor: pointer;/* 鼠标经过变成小手 */
cursor: pointer; /* 鼠标经过变成小手 */
}
#txt{
#txt {
font-size: 22px;
font-family: Source Han Sans CN;
font-weight: 400;
@ -68,31 +72,37 @@
/*height: 40px;*/
/*outline: none;!* 鼠标聚焦文本框没有边框线*!*/
}
.login .left{
.login .left {
width: 1100px;
height: 100%;
}
.login .left img{
.login .left img {
width: 100%;
height: 100%;
}
.login .right{
.login .right {
margin: 0 auto;
margin-top: 30px;
}
.logo{
.logo {
margin-top: 74px;
margin-bottom: 123px;
display: flex;
align-items: center;
}
.title{
.title {
text-align: center;
font-size: 40px;
font-weight: 500;
margin-top: 34px;
}
.shuru{
.shuru {
width: 500px;
height: 50px;
background: #EFF0F4;
@ -102,23 +112,28 @@
padding-left: 20px;
font-size: 16px;
}
.shuru:focus{
.shuru:focus {
border-color: #09f !important;
}
.item{
.item {
margin-bottom: 20px;
}
.item1{
.item1 {
margin-bottom: 30px;
}
.item-name{
.item-name {
font-size: 22px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #555555;
margin: 10px 0;
}
.btn{
.btn {
width: 500px;
height: 64px;
background: linear-gradient(90deg, #00AFFF 0%, #007CFF 100%);
@ -130,12 +145,14 @@
font-family: Source Han Sans CN;
font-weight: 400;
color: #FFFFFF;
margin-top: 108px;
margin-top: 4px;
}
.boxCss{
.boxCss {
margin-top: 60px;
}
.bottom{
.bottom {
width: 500px;
text-align: center;
font-size: 14px;
@ -151,39 +168,42 @@
<img src="./static/img/login/login_bg.png" alt="">
</div>
<div class="right">
<c:if test="${loginSet.logoPath != ''}">
<img src="${path}/${loginSet.logoPath}" width="${loginSet.logoWidth}px" height="${loginSet.logoHeight}px">
</c:if>
<c:if test="${loginSet.logoPath != ''}">
<img src="${path}/${loginSet.logoPath}" width="${loginSet.logoWidth}px" height="${loginSet.logoHeight}px">
</c:if>
<div class="title">
账号登录
</div>
<div class="boxCss">
<form action="">
<div class="item item1">
<div class="item-name">用户名</div>
<input type="text" placeholder="请输入" class="shuru" id="userName" name="userName" >
</div>
<div class="item">
<div class="item-name">用户密码</div>
<input type="password" placeholder="请输入" class="shuru" id="userPwd" name="userPwd">
</div>
<div class="item">
<div class="item-name" id="txt1">验证码</div>
<input type="text" placeholder="请输入" class="shuru" id="txt" name="txt">
</div>
<%--验证码:<input type="text" id="txt"><br>--%>
<div id="banar"></div>
<span id="chang">看不清换一张</span><br>
<%--<input type="submit" value="验证" id="sub">--%>
<div >
<input type="checkbox" name="" id="">
<span>记住密码</span>
</div>
</form>
<form action="">
<div class="item item1">
<div class="item-name">用户名</div>
<input type="text" placeholder="请输入" class="shuru" id="userName" name="userName">
</div>
<div class="item">
<div class="item-name">用户密码</div>
<input type="password" placeholder="请输入" class="shuru" id="userPwd" name="userPwd">
</div>
<div class="item">
<div class="item-name" id="txt1">验证码</div>
<input type="text" placeholder="验证码" class="shuru" id="imageContent" name="imageContent"
maxlength="4">
</div>
<div class="item">
<img id="imgObj" alt="验证码" src="getCaptchaImage">
<input id="timestamp" name="timestamp" value="${timestamp }" type="hidden">
<span id="chang">看不清换一张</span><br>
</div>
<div>
<input type="checkbox" name="" id="">
<span>记住密码</span>
</div>
</form>
<div class="btn" onclick="login()">立即登录</div>
</div>
<div class="btn" onclick="login()">立即登录</div>
<div class="bottom">
<div class="top">技术支持:厦门嘉时软件科技有限公司 </div>
<div class="top">技术支持:厦门嘉时软件科技有限公司</div>
<div class="bot">Copyright © 2019-2090 厦门嘉时软件. All rights reserved.</div>
</div>
</div>

@ -1,191 +1,36 @@
/**
* Created by ljx on 2019/4/25.
*/
$(function () {
//cookie数据保存格式是key=value;key=value;形式loginInfo为保存在cookie中的key值具体看controller代码
/*if(str != ""){
var userName = str.split("#")[0];
var userPwd = str.split("#")[1];
//自动填充用户名和密码
$("#userName").val(userName);
$("#userPwd").val(userPwd);
//并且选中复选框
$("#rememberMe").attr("checked", true);
}*/
//获取cookie
/*function getCookie(cname) {
var name = cname + "=";
var ca = document.cookie.split(';');
for(var i=0; i<ca.length; i++) {
var c = ca[i];
while (c.charAt(0)==' ') c = c.substring(1);
if (c.indexOf(name) != -1) return c.substring(name.length, c.length);
}
return "";
}*/
$("#forgetPwd").on("click", function () {
alert("请联系管理员进行修改密码!");
});
});
var banar = document.getElementById('banar');
var txt = document.getElementById('txt');
var sub = document.getElementById('sub');
var chang = document.getElementById('chang');
//创建一个数组,里面包含着随机验证码所能出现的全部字符
var allchar = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, "a", "b", "c", "d", "e",
"f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r",
"s", "t", "u", "v", "w", "x", "y", "z"];
var result;
function randomChar() {
result = "";//创建空的字符串,方便等下接收值
//循环找出4的字符
for (var i = 0; i < 4; i++) {
//随机生成一个0-61的数字
var index = Math.floor(Math.random() * 36);
//将随机生成的数字作为数组的索引然后赋给result
//每次赋一个数组值循环4次最后就是4个字符
result += allchar[index];
}
//把随机生成的4个字符添加到ID为banar的div里面
banar.innerHTML = result;
//点击验证按钮,判断我们输入的值和随机生成的值是否一样?
//一样就弹出验证成功,不一样就弹出验证错误。
// sub.onclick = function () {
// if (txt.value == result) {
// alert("验证成功!!!");
// } else {
// alert("验证错误!!!");
// randomChar();//如果错误执行randomChar方法重新随机生成4个字符
// txt.value = "";//如果错误,我们输入的验证码等于空,方便我们再次输入
// }
// };
}
randomChar();
//点击"看不见换一张"时,执行randomChar方法重新随机生成4个字符我们输入的验证码等于空方便我们再次输入
chang.onclick = function () {
txt.value = "";
randomChar();
}
function login() {
var userName = $("#userName").val();
var userPwd = $("#userPwd").val();
var txt = $("#txt").val();
// userPwd = hex_md5(userPwd, userPwd);
//验证码
var imageContent = $("#imageContent").val().trim();
var rememberMeChecked = $("input[type='checkbox']").is(':checked');
var rememberMe = '';
if (rememberMeChecked) {
rememberMe = 'yes';
}
if (userName == '') {
toastr.warning("用户名不能为空!");
} else {
if (userPwd == '') {
toastr.warning("密码不能为空!");
} else {
if (txt == '') {
toastr.warning("验证码不能为空!");
} else {
if (result != txt) {
toastr.warning("验证码错误!")
randomChar();
} else {
$.ajax({
type: "POST",
url: path + "/login",
data: {userName: userName, userPwd: userPwd, rememberMe: rememberMe},
dataType: 'json',
success: function (data) {
if (data.code == 100) {
window.location.href = data.extend.url;
} else {
toastr.warning(data.msg);
}
}
})
}
}
}
return toastr.warning("用户名不能为空!");
}
if (userPwd == '') {
return toastr.warning("密码不能为空!");
}
if (imageContent.length == 0) {
return toastr.warning("请输入验证码!");
}
}
var interval = "";
var qrCodeIdentity = "";
//获取扫码登录二维码
function handoffLogin() {
$.ajax({
type: "POST",
data: {loginTypeBitValue: 16, type: 3, projectUid: "cloudkey-fstth", ApplicationId: "fstth-wzh"},
url: path + '/font/getQRcode',
url: path + "/login",
data: {userName: userName, userPwd: userPwd, rememberMe: rememberMe,code:imageContent},
dataType: 'json',
success: function (data) {
qrCodeIdentity = data.qrCodeIdentity;
$("#QRcordImg").prop("src", "data:image/jpeg;base64," + data.qrCodeBase64);
//轮询监听用户扫码
interval = setInterval(scanCodeLogin, 1000, qrCodeIdentity);
}
})
$("#switchHandoff").css("display", "none");
$("#switchHandoff2").css("display", "block");
}
function scanCodeLogin() {
$.ajax({
type: "POST",
data: {qrCodeIdentity: qrCodeIdentity},
url: path + '/font/getScanCode',
success: function (body) {
if (body.verifyStatus == 0) {
//扫码认证成功后撤销监听
clearInterval(interval);
$.ajax({
type: "POST",
data: {userToken: body.userToken},
url: path + '/font/getUserInfo',
success: function (tlte) {
if (tlte.msgType == 1) {
$.ajax({
type: "POST",
data: {userName: tlte.uid},
url: path + '/font/qRCodeLogin',
success: function (tltel) {
if (tltel.code == 100) {
window.location.href = tltel.extend.url;
} else {
$("#msg").text(tltel.msg);
}
}
})
} else {
alert("登录失败请重新登录")
}
}
})
if (data.code == 100) {
window.location.href = data.extend.url;
} else {
changeImg();
toastr.warning(data.msg);
}
}
})
}
function handoffLogin2() {
$("#switchHandoff").css("display", "block");
$("#switchHandoff2").css("display", "none");
clearInterval(interval);
}
@ -201,6 +46,38 @@ if (top.location != location) {
top.location.href = location.href;
}
/**
* 更换验证码
*/
function changeImg() {
var imgSrc = $("#imgObj");
var src = imgSrc.attr("src");
imgSrc.attr("src", chgUrl(src));
};
/**
* 时间戳
* 为了使每次生成图片不一致即不让浏览器读缓存所以需要加上时间戳
*/
function chgUrl(url) {
var timestamp = (new Date()).valueOf();
var stamp = $("#timestamp");
// alert(url);
url = url.substring(0, 60);
if ((url.indexOf("&") >= 0)) {
url = url + "×tamp=" + timestamp;
} else {
url = url + "?timestamp=" + timestamp;
stamp.val(timestamp);
}
return url;
};
var chang = document.getElementById('chang');
//看不起换一张
chang.onclick = function () {
changeImg();
}

@ -31,4 +31,8 @@ public interface Power_LogMapper {
List<Power_LogVo> selectAllByIds(@Param("checks")String checks);
void deleteLogByIds(@Param("str")String str);
}
Power_Log getUnlockDate(@Param("userName")String userName);
}

@ -1,8 +1,25 @@
package com.manage.entity;
public class Power_Log {
private String unlockDate;
private Integer logId;
public String getUnlockDate() {
return unlockDate;
}
public void setUnlockDate(String unlockDate) {
this.unlockDate = unlockDate;
}
public String getGetUnlockDate() {
return getUnlockDate;
}
public void setGetUnlockDate(String getUnlockDate) {
this.getUnlockDate = getUnlockDate;
}
private String logTitle;
private String ip;
@ -18,6 +35,7 @@ public class Power_Log {
private String creater;
private String remark;
private String getUnlockDate;
public Integer getLogId() {
return logId;

@ -203,4 +203,8 @@
<delete id="deleteLogByIds">
delete from power_log where log_id in (${str})
</delete>
<select id="getUnlockDate" resultType="com.manage.entity.Power_Log">
SELECT * FROM power_log where log_title='登录' and unlock_date>=sysdate() and creater=#{userName}
</select>
</mapper>

@ -30,6 +30,22 @@ public class Msg {
return result;
}
public static Msg failUnlockUser(String unlockDate){
Msg result=new Msg();
result.setCode(200);
result.setMsg("登录账号失败次数过多,请在"+unlockDate+"后在登录");
return result;
}
public static Msg codeUser(){
Msg result=new Msg();
result.setCode(200);
result.setMsg("验证码错误,请重新登录");
return result;
}
public static Msg fail(){
Msg result=new Msg();
result.setCode(200);

@ -18,4 +18,6 @@ public interface LogService {
int delLogsByDate(String date);
void deleteLogByIds(String str);
Power_Log getUnlockDate(String userName);
}

@ -83,6 +83,12 @@ public class LogServiceImpl implements LogService {
logMapper.deleteLogByIds(str);
}
@Override
public Power_Log getUnlockDate(String userName) {
return logMapper.getUnlockDate(userName);
}
private String getAddressIp( HttpServletRequest request){
// 获取访问真实IP
String ipAddress = request.getHeader("x-forwarded-for");

Loading…
Cancel
Save