java登陆验证码与JS无刷新验证
最近公司的项目的登陆模块由我负责,所以就做了个登陆小功能进行练手,其包括了用jQuery对用户名和密码进行不为null验证,和出于安全性考虑加了一个验证码的校验
别的不说先上代码
controller层
CreateImage.java
package com.controller; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random; import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class CreateImage extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { // 获取session
HttpSession session = null;
// 控制图片不被缓存
response.setHeader("expires", -1+"");
response.setHeader("cache-control", "no-cache");
response.setHeader("pragma", "no-cache"); // 在内存中创建一个图片对象
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
// 设置图片
Graphics gra = image.getGraphics(); // 设置背景
gra.setColor(Color.BLACK);
gra.fillRect(0, 0, 80, 20); // 设置字体和颜色
gra.setColor(Color.WHITE);
gra.setFont(new Font(null,Font.BOLD,14)); // 给图片上绘制随机的数据
String code = createStr(4);
gra.drawString(code, 5, 15); // 存储到session
session = request.getSession(true);
session.setAttribute("code", code);
// 获取字节输出流
ServletOutputStream out = response.getOutputStream(); // 输出图片到浏览器客户端
ImageIO.write(image, "jpg", out); // 释放资源
out.close(); // 目标是生成一个图片【数字和文本】
} private String createStr(int i) {
// 定义随机数据的范围
String data = "ABCDEFGHJKLMNabcretfghwYyk1234567890";
// 定义一个随机对象
Random random = new Random(); // 定义可变的字符串缓冲区对象
StringBuffer sb = new StringBuffer(); // 循环
for (int j = 0; j < i; j++) {
int index = random.nextInt(data.length() - 1);
char c = data.charAt(index);
sb.append(c);
}
return sb.toString();
} public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doGet(request, response);
} }
该java代码创建一个image对象,也就是画一个图,图的上面添加了4(注:这4不是固定的,可以是5,6,7等,随你定)个随机数,再把这个验证码code放到session域中
在登陆验证的时候与jsp页面传过来的验证码进行校验,相等的话就验证成功。
下面是登陆页面:
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登陆</title>
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript" src="js/jquery.validate.js"></script></head>
<script type="text/javascript">
$(function(){
$("form").validate({
debug : false,
rules : {
name : {
required : true,
},
password : {
required : true
}
},
messages : {
name : {
required : "用户名不能为空!",
},
password : {
required : "密码不能为空!"
}
} });
});
</script> <body>
<center>
<h1>登陆页面</h1>
<form action="login.action" method="post">
用户名:<input type="text" name="name"><br>
密 码:<input type="password" name="password"><br>
验证码:<input type="text" name="code" /><br>
<img src="${pageContext.request.contextPath}/CreateImage"/> <a href="loginForward.action">看不清,换一张</a><br>
<input type="submit" value="登陆">
</form>
<h2><font color="red">${error }</font></h2>
</center>
</body>
</html>
以上代码有js验证,可以无刷新的校验用户和密码是否为空。(注:需要添加jquery-1.3.2.min.js和jquery.validate.js两个插件)这里很有趣,我遇到了一个问题(以前都没注意),那就是这两个插件调用的时候是要有顺序的,jquery-1.3.2.min.js要放在jquery.validate.js前面,才能生效。
UserController.java
package com.controller; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.List;
import java.util.Random; import javax.ejb.CreateException;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import com.bean.User;
import com.dao.UserDaoImpl; /**
* 基于注解的SpringMVC+ibatis的CRUD
* @author Saiteam
*
*/
@Controller
public class UserController { private UserDaoImpl userDao = new UserDaoImpl(); @RequestMapping(value="/list.action")
public String list(HttpServletRequest request) throws Exception{
List<User> user = userDao.list();
request.setAttribute("users", user);
return "list";
}
@RequestMapping(value="/saveForward.action")
public String saveForward(HttpServletRequest request){
return "add";
}
@RequestMapping(value="/add.action")
public String add(HttpServletRequest request) throws Exception{
request.setCharacterEncoding("UTF-8");
User user = new User();
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
user.setSex(request.getParameter("sex"));
user.setAddress(request.getParameter("address"));
user.setPhone(request.getParameter("phone"));
user.setEmail(request.getParameter("email"));
userDao.save(user);
request.setAttribute("users", userDao.list());
return "list";
} @RequestMapping(value="/delete.action")
public String delete(HttpServletRequest request) throws Exception{
int id = Integer.parseInt(request.getParameter("id"));
userDao.delete(id);
request.setAttribute("users", userDao.list());
return "list";
} @RequestMapping(value="/update.action")
public String update(HttpServletRequest request) throws Exception{
request.setCharacterEncoding("UTF-8");
User user = new User();
user.setId(Integer.parseInt(request.getParameter("id")));
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
user.setSex(request.getParameter("sex"));
user.setAddress(request.getParameter("address"));
user.setPhone(request.getParameter("phone"));
user.setEmail(request.getParameter("email"));
userDao.update(user);
request.setAttribute("users", userDao.list());
return "list";
} @RequestMapping(value="/get.action")
public String get(HttpServletRequest request) throws Exception{
int id = Integer.parseInt(request.getParameter("id"));
request.setAttribute("user", userDao.get(id));
return "update";
} /*
* 登陆功能
*/
@RequestMapping(value="login.action")
public String login(HttpServletRequest request) throws Exception{ request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String password = request.getParameter("password");
String userCode = request.getParameter("code"); //测试
System.out.println("-------name-----------"+name);
System.out.println("-------password-----------"+password);
System.out.println("-------userCode-----------"+userCode); User model = userDao.login(name, password);
//测试
System.out.println("-------------model--------"+model);
if(model != null && !model.equals("")){
//判断验证码是否为空
if(userCode==null || "".equals(userCode)){
request.setAttribute("error", "请填写验证码!");
return "forward:/login.jsp";
}
//从session中获取code验证码 1.先获取session
HttpSession session = request.getSession(false);
//判断session是否为空
if(session == null){
System.out.println("服务器session为null不处理添加用户的逻辑。");
return "forward:/login.jsp";
}
//2.获取session中的code
String serverCode = (String) session.getAttribute("code");
//判断
if(serverCode == null || "".equals(serverCode)){
System.out.println("服务器中的校验码为null不处理添加用户的逻辑!");
return "forward:/login.jsp";
} //判断jsp页面传来的验证码与后台服务器session中带的验证码是否相等
if(userCode.equals(serverCode)){
request.setAttribute("users", userDao.list());
return "list";
}else{
request.setAttribute("error", "验证码错误!");
return "forward:/login.jsp";
}
}else{
request.setAttribute("error", "用户或密码错误!");
return "forward:/login.jsp";
} } //实现注册功能
@RequestMapping(value="register.action")
public String register(HttpServletRequest request) throws Exception{
request.setCharacterEncoding("UTF-8");
User user = new User();
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
user.setSex(request.getParameter("sex"));
user.setAddress(request.getParameter("address"));
user.setPhone(request.getParameter("phone"));
user.setEmail(request.getParameter("email"));
userDao.save(user);
return "forward:/index.jsp";
} /**
* 跳转到登陆页面
* @param request
* @return
*/
@RequestMapping(value="loginForward.action")
public String loginForwad(HttpServletRequest request){
return "forward:/login.jsp";
}
/**
* 转发到注册页面
* @param request
* @return
*/
@RequestMapping(value="rgf.action")
public String registerForwad(HttpServletRequest request){
return "forward:/register.jsp";
} }
我在controller层使用了SpringMVC框架,在DAO层使用了Ibatis框架,做了CRUD的功能,代码就比较乱了,该层获取浏览器传来的参数,包括name(用户名),password(密码)和code(验证码),对他们进行校验,校验成功就能获得下一步的操作了。
以上仅仅是个人的一些经验,欢迎大家一起交流。
java登陆验证码与JS无刷新验证的更多相关文章
- ajaxFileUpload.js 无刷新上传图片,支持多个参数同时上传,支持 ie6-ie10
/* 131108-xxj-ajaxFileUpload.js 无刷新上传图片 jquery 插件,支持 ie6-ie10 依赖:jquery-1.6.1.min.js 主方法:ajaxFileUpl ...
- JAVA EE 中之AJAX 无刷新地区下拉列表三级联动
JSP页面 <html> <head> <meta http-equiv="Content-Type" content="text/html ...
- [Asp.net mvc]jquery.form.js无刷新上传
写在前面 最近在自己的网盘项目中想用ajax.beginform的方式做无刷新的操作,提交表单什么的都可以,但针对文件上传,就是个鸡肋.在网上查找了发现很多人都遇到了这个问题,大部分都推荐使用jque ...
- 【转】 ASP.NET使用ICallbackEventHandler无刷新验证用户名是否可用
功能说明:当用户在用户名输入框输入字符并焦点离开此输入框时,自动到数据库用户表中验证此用户名是否已被注册,如果已被注册,显示[不可用],反之,显示[可用],期间页面不刷新,读者也可以考虑将提示文字换成 ...
- 使用ajax和js无刷新改变页面内容和地址栏URL
发现一个可以改变地址栏,而不导致页面刷新的东东. Chrome, FF测试通过,不支持IE. 实现目标 页面的跳转(前进后退,点击等)不重新请求页面 页面URL与页面展现内容一致(符合人们对传统网页的 ...
- SSH(Struts 2.3.31 + Spring 4.1.6 + Hibernate 5.0.12 + Ajax)框架整合实现简单的增删改查(包含分页,Ajax 无刷新验证该用户是否存在)
软件152 余建强 该文将以员工.部门两表带领大家进入SSH的整合教程: 源码下载:http://download.csdn.net/detail/qq_35318576/9877235 SSH 整合 ...
- view+element+java登陆验证码
一.前端: 1.页面标签: <el-row :gutter="20"> <el-col :span="24"> <el-input ...
- js无刷新上传文件
传统的文件上传方式 <form action="" method="POST" enctype="multipart/form-data&quo ...
- js 无刷新文件上传 (兼容IE9 )
之前项目中有个文件上传了需求,于是直接就使用了FormData对象异步上传,但是在测试得时候发现ie9无法正常上传(项目要求兼容IE9+),无奈,查资料得知IE9- 版本不支持formdata对象得异 ...
随机推荐
- .net(c#) winform文本框只能输入数字,不能其他非法字符
private void textBox3_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { //阻止从键盘输入键 ...
- linux的7种运行级别
Linux有7个运行级别(runlevel)运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆运行级别2:多用户 ...
- [大牛翻译系列]Hadoop(7)MapReduce:抽样(Sampling)
4.3 抽样(Sampling) 用基于MapReduce的程序来处理TB级的数据集,要花费的时间可能是数以小时计.仅仅是优化代码是很难达到良好的效果. 在开发和调试代码的时候,没有必要处理整个数据集 ...
- TDirectory.GetDirectories 获取指定目录下的目录
使用函数: System.IOUtils.TDirectory.GetDirectories 所有重载: class function GetDirectories(const Path: strin ...
- 二,WPF的布局
所有WPF布局窗口都派生自System.WIndows.Controls.Panel抽象类的面板. 不能在布局容器中放置字符串内容,而是需要一个继承自UIElement的类对字符串进行包装,如Text ...
- 【转】Web标准中的常见问题
本文转自http://www.tracefact.net/Misc/Common-Problems-Of-Web-Standard.aspx 引言 大概在2004年的时候,Web标准的概念藉由一本名为 ...
- mysql简单操作一
MySQL的一些简单管理: 启动MySQL服务: sudo start mysql 停止MySQL服务: sudo stop mysql 修改 MySQL 的管理员密码: sudo mysqladmi ...
- cocos2dx中的定时器及其分类
cocos2dx中的定时器分三大类: 1.帧循环定时器 2.一次性定时器 3.自定义定时器 一.帧循环定时器,顾名思义,每一帧都会执行一次,用于实时性要求比较高的场合,如碰撞检测 void sched ...
- 两行代码搞定UITableView无数据无网络显示-b
不知是否有像我一样的,每次写TableView在监听网络和无数据源时逻辑处理提示视图都是一堆代码,很繁琐也很重复的垃圾代码(可能就只有我这样
- Android ADB 端口占用问题解决方案
问题描述: The connection to adb is down, and a severe error has occured. You must restart adb and Eclips ...