javaweb 图片验证码实现登录功能

5 篇文章 0 订阅
1 篇文章 0 订阅

展示

在这里插入图片描述

项目结构

在这里插入图片描述

jar包

主要用到是第一个和第二个
在这里插入图片描述

CodeServlet类

验证码请求(会创建二维码并保存)

package com.tmg.code;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

@WebServlet("/code.do")
public class CodeServlet extends HttpServlet {
    public static final int WIDTH = 110;
    public static final int HEIGHT = 42;
    public static final int FONT_SIZE = 25;
//    验证码设置为数字,字母
    public static final String CHARS = "1234567890abc";
    public static final Color[] COLORS = {Color.PINK,Color.YELLOW,Color.MAGENTA,Color.GREEN,Color.BLACK,Color.RED};

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        doGet(req,resp);
//        System.out.println("-------+++--------");
        String code = req.getParameter("doPost-》code");
//        System.out.println(code);
        //获得Session中的验证码
//        String code2 = (String) req.getSession().getAttribute("code");
//        if(code2 == null || !code2.equals(code)){
            //验证码错误
//            resp.getWriter().print("n");
//
//            return;
//        }
    }

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("----------------");
        //创建图片对象
        BufferedImage image = new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);
        //获得绘图对象
        Graphics graphics = image.getGraphics();
        //设置背景色
        graphics.setColor(Color.GRAY);
        //填充长方形
        graphics.fillRect(0,0,WIDTH,HEIGHT);
        //设置字体
        graphics.setFont(new Font("宋体", Font.ITALIC,FONT_SIZE));
        Random random = new Random();
        StringBuilder stringBuilder = new StringBuilder();
        //随机生成4个文字,绘制到图片上
        for (int i = 0; i < 4; i++) {
            char c = CHARS.charAt(random.nextInt(CHARS.length()));
            stringBuilder.append(c);
            //颜色随机
            graphics.setColor(COLORS[random.nextInt(COLORS.length)]);
            //绘制字母
            graphics.drawString(String.valueOf(c),FONT_SIZE * i + 10 ,FONT_SIZE);
        }
        //保存验证码到Session中
        req.getSession().setAttribute("code",stringBuilder.toString());
        //设置不缓存图片的响应头
        resp.addHeader("Cache-Control","no-cache");
        //将图片通过输出流发给浏览器
        ImageIO.write(image,"PNG",resp.getOutputStream());
    }
}

login.jsp

页面显示二维码,设置点击事件刷新验证码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<title>爱购登录页面</title>
		<link rel="icon" type="image/x-icon" href="img/title-icon.jpg"/>
		<link rel="stylesheet" href="css/reset.css" />
		<link rel="stylesheet" href="css/footer.css" />
		<link rel="stylesheet" href="css/login.css" />
	</head>
	<body>
		<!--登录/注册的头部-->
		<div class="lr-top w1230">
			<a href="index.jsp"><img src="img/logo.png" width="150px" height="60px"/></a>
			<div class="top-link">
				<a href="#"class="top-link1"></a>
				<a href="#" class="top-link2"></a>
				<a href="#" class="top-link3"></a>
			</div>
		</div>
		<!--登录/注册的中部-->
		<div class="lr-main">
			<div class="w1230">
				<div class="reg-div">
					<h3 class="login-title">登录爱购</h3>
					<p class="go-reg">还没有爱购账号?<a href="register.html">在此注册</a></p>
					<form action="/user.do?m=adduser" method="post">
<%--						<input type="hidden" name="m" value="adduser">--%>
						<p><span class="icon-account"></span><input type="text" name="username" placeholder="请输入已注册的账号"/></p>
						<p><span class="icon-pwd"></span><input type="password" name="password" placeholder="请输入密码"/></p>
						<p class="clear-float"><input type="text" placeholder="验证码" name="code" class="code"/>
							<img src="/code.do" id="code" width="110px" onclick="changeCode()" height="42px" class="code-img"/>
<%--							<img src="img/code.jpg" width="110px" height="42px" class="code-img"/>--%>
						</p>
<%--						<p><input type="checkbox" class="chk-login"/><span>7天免登录</span></p>--%>
						<input type="submit" value="登录" class="sum-btn" />
					</form>
				</div>
			</div>	
		</div>
		<!--登录/注册的底部-->
		<div class="lr-footer footer">
			<p class="w1230">
				<a href="#">关于爱购</a>
				<a href="#">合作伙伴</a>
				<a href="#">营销中心</a>
				<a href="#">廉正举报</a>
				<a href="#">联系客服</a>
				<a href="#">开发平台</a>
				<a href="#">诚征英才</a>
				<a href="#">联系我们</a>
				<a href="#">网站地图</a>
				<a href="#">知识产权</a><span>|</span>
				<span>&copy;2018-2020 igo.com 版权所有</span>
			</p>
		</div>
	</body>
<script>
	function changeCode() {
		document.getElementById("code").src = "/code.do?x="+Math.random();
	}
</script>
</html>

  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
# 该项目骨架集成了以下技术: - SpringBoot多环境配置 - SpringMVC - Spring - MyBaits - MyBatis Generator - MyBatis PageHelper - Druid - Lombok - JWT - Spring Security - JavaMail - Thymeleaf - HttpClient - FileUpload - Spring Scheduler - Hibernate Validator - Redis Cluster - MySQL主从复制,读写分离 - Spring Async - Spring Cache - Swagger - Spring Test - MockMvc - HTTPS - Spring DevTools - Spring Actuator - Logback+Slf4j多环境日志 - i18n - Maven Multi-Module - WebSocket - ElasticSearch # 功能们: ## 用户模块 - 获取图片验证码 - 登录:解决重复登录问题 - 注册 - 分页查询用户信息 - 修改用户信息 ## 站内信模块 - 一对一发送站内信 - 管理员广播 - 读取站内信(未读和已读) - 一对多发送站内信 ## 文件模块 - 文件上传 - 文件下载 ## 邮件模块 - 单独发送邮件 - 群发邮件 - Thymeleaf邮件模板 ## 安全模块 - 注解形式的权限校验 - 拦截器 ## 文章管理模块 - 增改删查 # 整合注意点 1. 每个Mapper上都要加@Mapper 2. yaml文件 @Value获取xx.xx.xx不可行,必须使用@ConfigurationProperties,指定prefix,属性设置setter和getter 3. logback日志重复打印:自定义logger上加上 ` additivity="false" ` 4. SpringBoot 项目没有项目名 5. 登录 Spring Security +JWT - 已登录用户验证token - 主要是在Filter中操作。 从requestHeader中取得token,检查token的合法性,检查这一步可以解析出username去查数据库; 也可以查询缓存,如果缓存中有该token,那么就没有问题,可以放行。 - 未登录用户进行登录 - 登录时要构造UsernamePasswordAuthenticationToken,用户名和密码来自于参数,然后调用AuthenticationManager的authenticate方法, 它会去调用UserDetailsService的loadFromUsername,参数是token的username,然后比对password,检查userDetails的一些状态。 如果一切正常,那么会返回Authentication。返回的Authentication的用户名和密码是正确的用户名和密码,并且还放入了之前查询出的Roles。 调用getAuthentication然后调用getPrinciple可以得到之前听过UserDetailsService查询出的UserDetails - 在Controller中使用@PreAuthorize等注解需要在spring-web配置文件中扫描security包下的类 6. 引用application.properties中的属性的方式:@ConfigurationProperties(prefix = "spring.mail") + @Component + setter + getter 7. 引用其他自定义配置文件中的属性的方式: - @Component - ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。
JavaWeb是基于 SpringBoot2+Layui2.5.6+Thymeleaf++Shiro+MybatisPlus 研发的权限(RBAC)及内容管理系统,致力于做更简洁的后台管理框架,包含系统管理、代码生成、权限管理、站点、广告、布局、字段、配置等一系列常用的模块,整套系统一键生成所有模块(包括前端UI),一键实现CRUD,简化了传统手动抒写重复性代码的工作。 同时,框架提供长大量常规组件,如上传单图、上传多图、上传文件、下拉选择、复选框按钮、单选按钮,城市选择、富文本编辑器、权限颗粒度控制等高频使用的组件,代码简介,使用方便,节省了大量重复性的劳动,降低了开发成本,提高了整体开发效率,整体开发效率提交80%以上,JavaWeb框架专注于为中小企业提供最佳的行业基础后台框架解决方案,执行效率、扩展性、稳定性值得信赖,操作体验流畅,使用非常优化,欢迎大家使用及进行二次开发。 JavaWeb介绍: 1、模块化:全新的架构和模块化的开发机制,便于灵活扩展和二次开发。 2、模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目可以实现差异化的功能,轻松实现诸如资讯、下载、讨论和图片等功能。通过分类信息和栏目绑定,可以自动建立索引表,轻松实现复杂的信息检索。 3、JavaWeb企业级开发框架是一套基于SpringBoot2 + Layui开发出来的框架。 4、支持SQLServer、MySQL、Oracle、PostgreSQLSQLite等多数据库类型。模块化设计,层次结构清晰。 5、Shiro权限认证,操作权限控制精密细致,对所有管理链接都进行权限验证,可控制到导航菜单、功能按钮。提高开发效率及质量。 6、常用类封装,日志、缓存、验证、字典、文件(本地、七牛云)。等等,目前兼容浏览器(Chrome、Firefox、360浏览器等) 7、适用范围:可以开发OA、ERP、BPM、CRM、WMS、TMS、MIS、BI、电商平台后台、物流管理系统、快递管理系统、教务管理系统等各类管理软件。 JavaWeb功能特性: 严谨规范: 提供一套有利于团队协作的结构设计、编码、数据等规范。 高效灵活: 清晰的分层设计、钩子行为扩展机制,解耦设计更能灵活应对需求变更。 严谨安全: 清晰的系统执行流程,严谨的异常检测和安全机制,详细的日志统计,为系统保驾护航。 组件化: 完善的组件化设计,丰富的表单组件,让开发列表和表单更得心应手。无需前端开发,省时省力。 简单上手快: 结构清晰、代码规范、在开发快速的同时还兼顾性能的极致追求。 自身特色: 权限管理、组件丰富、第三方应用多、分层解耦化设计和先进的设计思想。 高级进阶: 分布式、负载均衡、集群、Redis、分库分表。 命令行: 命令行功能,一键管理应用扩展。 基于SpringBoot 简化了大量项目配置和maven依赖,让您更专注于业务开发,独特的分包方式,代码多而不乱。 利用Thymeleaf模板引擎 对前台页面进行封装和拆分,使臃肿的html代码变得简洁,更加易维护。 JS封装 对常用js插件进行二次封装,使js代码变得简洁,更加易维护。 参数配置 灵活控制常用功能的开关,无需重启项目即可生效,实时刷新。 演示地址账号密码: 登录账号:admin 登录密码:123456 验证码:520

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值