JAVA用户登录图形验证码
时间:2021-08-05
本文章向大家介绍JAVA用户登录图形验证码,主要包括JAVA用户登录图形验证码使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
摘要: 由于公司需要做一个监控系统,然后需要一个简单的登录页面,所以就需要一个简单的登录并需要验证,所以就在网上查了一下简单的验证码制作,废话不多说,代码如下:
1.pom引用
<dependency> <groupId>com.github.penggle</groupId> <artifactId>kaptcha</artifactId> <version>2.3.2</version> </dependency>
2.配置参数代码
@Component public class KaptchaConfig { @Bean(name="captchaProducer") public DefaultKaptcha getDefaultKaptcha(){ DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", "no"); properties.setProperty("kaptcha.border.color", "105,179,90"); properties.setProperty("kaptcha.textproducer.font.color", "black"); properties.setProperty("kaptcha.image.width", "125"); properties.setProperty("kaptcha.image.height", "45"); properties.setProperty("kaptcha.textproducer.font.size", "35"); properties.setProperty("kaptcha.textproducer.char.length", "4"); properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; }
3.获取验证图片代码和登录代码,以及存储session和清除session退出代码
@Controller @RequestMapping("/user") public class GmpLoginController { private static final Logger logger = LoggerFactory.getLogger(GmpLoginController.class); private Producer captchaProducer = null; @Autowired public void setCaptchaProducer(Producer captchaProducer) { this.captchaProducer = captchaProducer; } @Autowired private GmpLoginService gmpUserService; /** * 获取验证码图片 * Gets captcha code. * * @param request the request * @param response the response * @return the captcha code * @throws IOException the io exception */ @RequestMapping("/captchaCode") public ModelAndView getCaptchaCode(HttpServletRequest request, HttpServletResponse response) throws IOException { HttpSession session = request.getSession(); 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(); session.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; } /** * 登录接口 */ @RequestMapping(value = "/login") @ResponseBody public ResponseVo login(UserInfo userInfo, HttpServletRequest request) throws IOException { String accountName = userInfo.getAccountName(); String password = userInfo.getPassword(); String captcha = userInfo.getCaptcha(); System.out.println("登录 |信息打印| 账号:"+accountName +"| 密码 :"+password); // 从session中获取之前保存的验证码跟前台传来的验证码进行匹配 HttpSession session = request.getSession(); String kaptcha = (String) request.getSession().getAttribute(Constants.KAPTCHA_SESSION_KEY); //System.out.println("##########################验证码打印 ::"+kaptcha); if (kaptcha == null) { return ResultUtil.error("验证码已失效"); } if (!captcha.equals(kaptcha)) { return ResultUtil.error("验证码不正确"); } // 用户信息 UserInfo user = gmpUserService.findUserByAccountName(userInfo); // 账号不存在、密码错误 if (user == null) { return ResultUtil.error("账号不存在"); } if (!user.getPassword().equals(password)) { return ResultUtil.error("密码不正确"); } //将用户信息存入session request.getSession().setAttribute("trustpointsUserInfo", user); return ResultUtil.success("查询成功", user); } /** * @param user * @param request * @param response * @desc: 修改密码 */ @RequestMapping(value = "/updateUserInfo") @ResponseBody public ResponseVo updateUserInfo(UserInfo user, HttpServletRequest request, HttpServletResponse response) { try { logger.info("密码修改 | 开始 | 接收到用户修改请求 "); if (verifyAdmin(request)) { //1. 判断完正在登录中以后即开始修改密码 //2. 调用修改密码接口 //3. 判断是否修改成功 long updateFlag = gmpUserService.updateUserInfo(user); if (updateFlag == 1) { logger.info("密码修改 | 成功 | 请重新登录! "); return ResultUtil.success("修改成功", "请重新登录"); } else { return ResultUtil.error("修改失败"); } // HttpSession session = request.getSession(); } else { logger.warn("密码修改 | 失败 | 用户未登录或登录已超时! "); return ResultUtil.error("当前未登录"); } } catch (Exception e) { logger.warn("密码修改 | 失败 | 用户未登录或登录已超时! " + e); return ResultUtil.error("修改失败"); } } /** * @param user * @param request * @param response * @return 退出登录, 返回到登录页面 */ @RequestMapping(value = "/logout") @ResponseBody public ResponseVo logout(UserInfo user, HttpServletRequest request, HttpServletResponse response) { try { logger.info("退出登录 | 开始 | 接收到用户退出请求 "); if (verifyAdmin(request)) { HttpSession session = request.getSession(); session.setAttribute("trustpointsUserInfo", null); } } catch (Exception e) { logger.info("退出登录 | 错误 | 请重试! "+e); } logger.info("退出登录 | 成功 | 成功退出用户 "); return ResultUtil.success("退出成功", "成功退出用户!"); } /** * @desc: 判断session是否过期 * @version: @1.0 */ private boolean verifyAdmin(HttpServletRequest request) { HttpSession session = request.getSession(); UserInfo user = (UserInfo) session.getAttribute("trustpointsUserInfo"); if (user == null) { String msg = "*当前未登录"; request.setAttribute("msg", msg); return false; } String accountName = user.getAccountName(); if (accountName == null || accountName.equals("")) { String msg = "*用户状态异常"; request.setAttribute("msg", msg); return false; } return true; }
4. 上面的代码已经完整的(不带权限)将一个简单的登录实现出来,供大家参考!
注意:配置文件和controller是分开的!
原文地址:https://www.cnblogs.com/wekong/p/15104228.html
- 浅析XSS的几种测试方法
- MongoDB 分片集群技术
- hadoop任务测试
- Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析
- Android查缺补漏(IPC篇)-- 进程间通讯基础知识热身
- Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
- Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
- Android查缺补漏(View篇)--布局文件中的“@+id”和“@id”有什么区别?
- Name node is in safe mode.
- Android查缺补漏(View篇)--事件分发机制源码分析
- Android查缺补漏(View篇)--事件分发机制
- Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解
- Android查缺补漏(View篇)--自定义 View 的基本流程
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Redis技术(附软件分享)
- Redis项目案例
- 前端测试题:(解析)关于JS中this关键字的说法,下面错误的是?
- PostgreSQL 内存消耗从LINUX 系统层次看
- RBAC模型与权限系统的梳理(附案例源码)
- Maven项目中常用jar包的坐标以及用法(个人总结)
- MyCat------基于java语言的数据库中间件
- Solr技术(附软件分享)
- VSFTPD技术
- Shiro——基于java的安全框架
- 电子圆二色谱(ECD)的理论计算
- 用 80 行 Javascript 代码构建自己的语音助手
- 手把手教你搭建分布式项目环境
- GraphQL两年实战避坑经验
- 基于Dubbo的服务提供者与消费者的发布(在虚拟机中)以及使用nginx对项目进行负载均衡优化