登录界面+验证码

做一个登录界面+验证码的界面

实现效果:


第一部分、 页面:

<div class="container" >
	<h2 style="text-align:center">会员登录 </h2>
	<br>
	<form action="<%=path %>/user/login" method="post" role="form" class="form-horizontal" οnsubmit="return on_submit()" >
		<div class="form-group">
			<label class="col-md-4 control-label" style="text-align:right">登录名称</label>
			<div class="col-md-4">
				<input name="user.userName" id="userName" value="${user.userName}" type="text" class="form-control" placeholder="请输入账号">
			</div>
			<div class="col-md-4"><label class="error" id="userEr">
			<c:if test="${er==4 }">用户名不存在</c:if>
			</label></div>
		</div>
		<div class="form-group">
			<label class="col-md-4 control-label" style="text-align:right">登录密码</label>
			<div class="col-md-4">
			  	<input name="user.pswd" id="pswd" value="${user.pswd }" type="password" class="form-control" placeholder="请输入密码">
			</div>
			<div class="col-md-4"><label class="error" id="pswdEr">
			<c:if test="${er==5 }">密码错误</c:if>
			</label></div>
		</div>
		<div class="form-group">
			<label class="col-md-4 control-label" style="text-align:right">验  证  码</label>
			<div class="col-md-2">
			  	<input name="vali" id="loginCode" type="text" class="form-control" placeholder="请输入验证码">
			</div>
			<div class="col-md-2">
				<img id='imgVcode' src=" <%=path %>/user/checkCode " title="点击图片切换" style="cursor: pointer;" />
			</div>
			<div class="col-md-4"><label class="error" id="codeEr">
			<c:if test="${er==3 }">验证码错误</c:if>
			</label></div>
		</div>
		<div class="form-group">
			<div class="col-md-3 col-md-offset-4">
				<a href="javascript:void(0);" id="checkCode">看不清楚,换一张</a>
			</div>
		</div>
		<div class="form-group">
			<div class="col-md-2 col-md-offset-4">
				<input type="submit" class="btn btn-primary btn-block" value="登录" />	
			</div>
			<div class="col-md-2">
				<a class="btn btn-default btn-block" href="">取消</a>
			</div>
		</div>
	</form>
</div>

第二部分、jquery:

$(function(){
	//刷新验证码
	$("#checkCode").click(function(){
		$("#loginCode").val('');
		$("#imgVcode").attr("src", getContextPath()+"/user/checkCode?dt="+new Date().getTime());
	});
	$("#userName").keydown(function(){
		$("#userEr").html("");$("#pswdEr").html("");
	});
	$("#pswd").keydown(function(){
		$("#userEr").html("");$("#pswdEr").html("");
	});
});
function on_submit(){
	if($("#userName").val() == "") {
		$("#userEr").html("请输入用户名");
		//$("#userName").focus();
		return false;
	}
	else if($("#pswd").val() == "") {
		$("#pswdEr").html("请输入密码");
		//$("#pswd").focus();
		return false;
	}
	else if($("#loginCode").val() == "") {
		$("#codeEr").html("请输入验证码");
		//$("#loginCode").focus();
		return false;
	}
}

【重点在于刷新验证码,重新申请验证码】

第三部分、后台:

省略版:只写一个匹配验证码的,匹配账号面的就不写了

String checkCode =(String) session.get("checkCode");
if (checkCode==null || checkCode.equals("")) {
	return "login";
}
System.out.println("验证码:"+ checkCode +" "+vali);
if(!checkCode.equals(vali)){
	//没输验证码,验证码不匹配
	er = 3;
	return "login";
}
生成验证码图片的action

private InputStream imageStream;
public String execute(){
	//从 图片工具类 中生成图片
	Map<String,BufferedImage> map = ImageUtil.createImage();
	//获取验证码图片上的字符
	String key = map.keySet().iterator().next();
	session.put("checkCode", key);//   ← 这个是正确答案
	//获取  BufferedImage 对象
	BufferedImage image = map.get(key);
	//将      BufferedImage 赋值给    imageStream
	ByteArrayOutputStream bos = new ByteArrayOutputStream();
	JPEGImageEncoder imageEncoder = JPEGCodec.createJPEGEncoder(bos);
	//System.out.println("codeAction : " + key);
	
	try {
		imageEncoder.encode(image);
		byte[] imageBt = bos.toByteArray();
		imageStream = new ByteArrayInputStream(imageBt);
		return "success" ;
	} catch (Exception e) {
		e.printStackTrace();
		return "fail";
	}
}
public InputStream getImageStream() {
	return imageStream;
}
public void setImageStream(InputStream imageStream) {
	this.imageStream = imageStream;
}


第四部分、生成验证码的图片工具类

private static final String[] chars = { "0", "1", "2", "3", "4", "5", "6",
		"7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H","J","K","L","M","N","P"};
private static final int SIZE = 5;       //图像中 数字或字母   的个数
private static final int LINES = 7;      //图片中     线      的个数
private static final int WIDTH = 100;    //图像的宽度
private static final int HEIGHT = 35;    //图像的高度
private static final int FONT_SIZE = 30; //字体大小

public static Map<String,BufferedImage> createImage() {
	StringBuffer sb = new StringBuffer();//字符串常量 ,要配对的 正确答案
	BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);//加载一张图片
	Graphics graphic = image.getGraphics(); //绘制图片
	graphic.setColor(Color.WHITE);     //底色
	graphic.fillRect(0, 0, WIDTH, HEIGHT);  //填充
	Random ran = new Random(); //随机函数
	//随机生成 SIZE个数字
	for(int i=1;i<=SIZE;i++){
		int r = ran.nextInt(chars.length);  //在数组长度范围内的随机一个数
		graphic.setColor(getRandomColor()); //随机 数字字母 颜色 
		graphic.setFont(new Font(null, Font.BOLD+Font.ITALIC, FONT_SIZE));
		graphic.drawString(chars[r],(i-1)*WIDTH/SIZE , HEIGHT/3*2);
		sb.append(chars[r]);// Session
	}
	//随机在图片上画线
	for(int i=1;i<=LINES;i++){
		graphic.setColor(getRandomColor());//随机 线 的颜色
		graphic.drawLine(ran.nextInt(WIDTH), ran.nextInt(HEIGHT), ran.nextInt(WIDTH),ran.nextInt(HEIGHT));//随机画线
	}
	Map<String,BufferedImage> map = new HashMap<String,BufferedImage>();
	map.put(sb.toString(), image);
	return map;
}
//生成随机颜色
public static Color getRandomColor(){
	Random ran = new Random();
	Color color = new Color(ran.nextInt(156),ran.nextInt(156),ran.nextInt(156));
	return color;
}









  • 5
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1.项目介绍 典型电子商务系统(在线购物平台)。模拟了当当系统部分功能。 2.功能需求 1)用户管理模块(3天)user 实现登录、注册功能 2)产品浏览模块(2天)main 实现主界面和类别浏览功能 3)购物车模块(1.5天)cart 实现购买、变更数量、删除等功能 4)生成订单模块(1.5天)order 订单确认、填写送货地址、生成订单功能 3.技术应用 1)技术架构 Struts2,JDBC(连接池),jQuery,Ajax 2)设计思想 MVC和分层设计思想 a.显示层:JSP组件(jQuery,Ajax) b.控制层:Struts2控制器组件、Action组件 c.业务层:Bean组件 d.数据访问层:DAO组件(JDBC) 4.数据库设计 1)数据库导入 create database dangdang; //创建库 use dangdang; //进入dangdang库 set names utf8; //设置连接和发送SQL编码 source 路径/dangdang.sql; //导入sql文件 2)数据表功能 a.d_user(用户信息表) 存储了用户信息,涉及登录和注册功能 b.d_receive_address(收货地址信息表) 存储了收货地址信息,涉及填写送货地址功能 c.d_category(类别信息表) 存储了图书的类别信息,涉及主界面左侧类别菜单功能 d.d_book(图书信息表) 存储了图书的特有信息,涉及产品浏览等功能 e.d_product(产品信息表) 存储了各类型产品的共通信息字段。 f.d_category_product(类别和产品对应关系表) 存储了类别和产品之间包含关系,涉及产品浏览功能 g. d_order(订单信息表) 存储了订单信息,涉及创建订单功能 h. d_item(订单明细表) 存储了订单中所购买的商品信息,涉及创建订单功能。 5. 搭建工程结构 1)引入需要的开发包 struts2开发包 jdbc开发包 dbcp连接池开发包 2)src文件结构 org.tarena.dang.action :控制层 org.tarena.dang.action.user :用户模块的action org.tarena.dang.action.main :产品浏览的action org.tarena.dang.action.order :订单的action org.tarena.dang.action.cart :购物车的action org.tarena.dang.service :业务层 org.tarena.dang.dao :数据访问层 org.tarena.dang.entity :实体类 org.tarena.dang.util :工具类 org.tarena.dang.interceptor :拦截器 3)struts配置文件结构 web.xml(配置Filter控制器) struts.xml (struts主配置文件) struts-user.xml(用户模块配置文件) struts-main.xml(浏览模块配置文件) struts-order.xml(订单模块配置文件) struts-cart.xml(购物车模块配置文件) 4)WebRoot文件结构 /user/* :用户管理的JSP /cart/* :购物车的JSP /order/* :订单的JSP /main/* :产品浏览的JSP /common/* :页眉、页脚等共同JSP /js/* : 放置js脚本文件 /css/* :放置css样式文件 /images/* :放置页面图片文件 /productImages/* :放置产品图片 -----------------连接池的优点----------------- a.可以管理Connection对象,并且将Connection数量控制在一个安全范围内。提高数据库的访问安全性。 b.连接池中的Connection对象与数据库保持连接状态,避免频繁的建立和销毁连接。 ============用户管理模块============== 1.注册需求 1)表单验证(采用js+Ajax) 邮箱:非空、格式、唯一性(ajax) 昵称:非空、格式 密码:非空、格式 确认密码:非空、与密码一致 验证码:非空、正确性(ajax) 2)将表单信息写入数据表d_user 编写实体类、DAO、Action 3)给用户邮箱发送验证码 引入commons-email.jar,email.jar 参考EmailUtil工具类代码 4)进入邮箱验证页面verify_form.jsp 2.邮箱验证 1)表单验证 验证码:非空、正确性(ajax) 正确后跳转到成功提示界面:window.location = "register_ok.jsp"; 2)Action逻辑 a.利用验证码去d_user检查 b.如果正确,将d_user的is_email_verify字段更新成Y;不正确在verify_form.jsp提示“验证失败” c.跳转到register_ok.jsp 3.用户登录 1)表单验证 邮箱:非空、格式 密码:非空 2)Action逻辑 a.检测Email和密码是否正确,失败回到login_form.jsp提示 b.检测is_email_verify邮箱是否通过验证,未通过进入verify_form.jsp c.更新最后一次登录时间last_login_time和IP地址last_login_ip。 d.将用户信息放入session。 e.都正确进入/main/main.jsp 4.main.jsp页面的页眉部分,显示用户是否登录的状态 如果用户已登录,显示"欢迎XXX,【登出】" 如果用户未登录,显示"【登录】【注册】" 数据库 模型 其实项目目 还有不少缺陷 需要完整、大家可以自行修改、里面有一处bug关于购物车的,注入问题、大家自己找找吧

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值