package servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* Servlet implementation class ImageServlet
*/
public class ImageServlet extends HttpServlet {
// 定义可选择的字符
private static final String CHARS = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
static Random random = new Random();
// 得到一个随机的字符串
private String getRandomString() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 4; i++) { // 生成四个字符
buffer.append(CHARS.charAt(random.nextInt(CHARS.length())));}
return buffer.toString();
}
// 随机背景颜色
public static Color getRandomColor() { // 得到随机颜色
return new Color(random.nextInt(128) + 127, random.nextInt(128) + 127,random.nextInt(128) + 127);
}
public static Color getReverseColor(Color c) { // 得到颜色的反色
return new Color(255 - c.getRed(), 255 - c.getGreen(),
255 - c.getBlue());
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg"); // 设置输出类型
// 得到随机字符串
String randomString = getRandomString();
// 将getSession()设置为true,当会话不存在是返回null
request.getSession(true).setAttribute("randomString", randomString);
// 设置图片的宽、高
int width = 80;
int height = 30;
Color bcolor = getRandomColor(); // 设置背景色
Color fcolor = getReverseColor(bcolor); // 前景色
// 创建一个彩色图片
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
// 创建绘图对象,从bimage上得到的绘制对象,会把数据绘制到bimage上
Graphics2D g = bimage.createGraphics();
// 字体样式为宋体,加粗,20磅
g.setFont(new Font("Vijaya", Font.BOLD, 20));
// 先画出背景色
g.setColor(bcolor);
g.fillRect(0, 0, width, height);
// 再画出前景色
g.setColor(fcolor);
for (int i = 0; i < randomString.length(); i++) {
// 绘制随机字符
g.drawString(randomString.charAt(i) + "", 10 + i * 12, 22);
}
// 画出干扰点
for (int i = 0, n = random.nextInt(100); i < n; i++) {
g.fillRect(random.nextInt(width), random.nextInt(height), 1, 1);
}
// 将图像输出到浏览器
ServletOutputStream outstream = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outstream);
encoder.encode(bimage);
outstream.flush();
outstream.close();
}
}
现在说到核心的Ajax技术:
传统web页面的服务是基于http协议的,所以它永远也改变不了“请求—响应”的模式。你必须“点”一下,它才能动一下,而且每次都必须刷新整个页面,这也意味着服务器要将所有页面上的数据传送下来,即使你的点击只是需要改变页面上一行十个字的内容; AJAX代码运行在浏览器和服务器之间,通过编程,你可以让ajax代码仅从服务器上提取需要改变的数据,也只改变页面中需要改变的某一部分:某一个div层、表格中的某一个单元格。用户不会看到页面全部被刷新了;当使用了ajax技术时,用户发送请求时(点击事件)将交由ajax代码处理,用户请求即完成。AJAX代码随后自己将请求发送给服务器,一旦服务器返回的响应,AJAX代码即根据返回的业务更新页面上的某个部分,这部分是由AJAX处理完成,与用户操作流程无关。
我们以一个典型的示例:即时验证是否有重复用户名的AJAX应用为例,讲解AJAX编写的基本步骤
1,当用户输入用户名后,焦点离开输入框,即触发输入框的onBlur事件,这个事件将调用js编写的ajax代码,将用户输入发送给服务器验证,并将服务器返回的结果消息显示在输入框下面的div层上。
这个流程将由三部分组成:
login.html:用户填写用户名的页面:
CheckUserNameServlet.java:服务器上用来验证用户名的Servlet,返回一个字符串作为结果;
Js编写的AJAX代码:请送请求,并更新页面
AJAX第一步:创建XMLHTTPRequest对象;
XMLHTTPRequest是AJAX应用中的核心API,它被js调用以向服务器发送请求,并异步接收服务器返回的数据后,更新局部页面。使用AJAX功能时,首先要在js中创建XMLHTTPRequest对象:
<script type="text/javascript">
//定义了XMLHttpRequest对象
var request;
//创建XMLHttpRequest对象函数
function getRequestObject() {
if (window.ActiveXObject) {
request=new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
request=new XMLHttpRequest();
} else {
window.alert("你的浏览器不支持XMLHTTPRequest,将无使用AJAX功能!");
}
}
</script>
在这段脚本中,getRequestObject函数调用后,将创建一个XMLHTTPRequest对象。注意其中的if判断,因为这世界还不是平的,IE和FireFox是有差别的;第一个if判断如果是IE浏览器,则调用MS的请求对象,第二个在浏览器是FireFox、Netscape的情况下会有效;当然,最后实在不行了,就告诉用户这玩不成啦。
AJAX第二步:编写回调方法;
现在我们有了请求对象,接下来要考虑的是XMLHTTPRequest对象向服务器发送请求后,服务器返回的结果应该如何处理,即AJax中的回调方法;在实现这个处理逻辑前先看一下页面的html代码:
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>AJAX检测重复用户名 蓝杰信息@NetJava.cn</title>
</head>
<body>
<br>注册用户名:<input type="text" name="userName"/>
<!-- 这个div层内将显示ajax从服务器返回的消息 -->
<div id=divErrorName" style="color:red;"></div>
<br>注册 密码:<input type="password" name="userPWD"/>
<br><input type="button" name="regUser" value="注册"/>
</body>
</html>
回调方法要实现的逻辑很简单,就是将CheckUserNameServlet.java这个Servlet返回的消息显示到名字为divErrorName的div中。如下代码:
//回调方法实现:将服务器返回的消息更新到div中
function processResult() {
if ((request.readyState == 4) &&
(request.status == 200)) {
//1.弹出对话框以便调试
alert("服务器返回的是: "+request.responseText);
//显示到指定的组件中
document.getElementById("divErrorName").innerHTML=request.responseText;
}
}
上面这段代码,关键在if判断语句,请求对象的readyState属性值代表请求对象的当前状态,为4时,代表己处理完成;而status为http应答代码,200表示服务器响应OK,如果是404呢?
如果请求对象己处理完毕,服务器返回的应答码也是OK的了,就请求对象的responseText属性值就代表了服务器返回给客户端的文本内容。
AJAX第三步:发送异步请求
必须清楚的知道,AJAX发送的请求也是通过HTTP协议传送着,这意味着ajax也可以发送get或post请求,请看如下代码:
function sendRequest() {
//创建XMLHTTPRequest对象
getRequestObject();
//绑定回调方法,
request.onreadystatechange=processResult;
//发送请求
// request.open("GET", "index.jsp", true);
//发送Post请求
request.open("POST", "servlet/CheckUserNameServlet", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var userName=document.getElementById("userName").value;
//将userName做为请求参数发送上去
request.send("userName="+userName);
}
CheckUserNameServlet代码如下:
public class CheckUserNameServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("userName");
System.out.println("收到了请求"+username);
PrintWriter out = response.getWriter();
if(userName.equals("newer")){
out.write("用户名已经被占用");
}else{
out.write("该用户名可以被使用");
}
out.flush();
}
}
完整的html页面完整代码如下:
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
<title>AJAX检测重复用户名 蓝杰信息@NetJava.cn</title>
</head>
<body>
<script type="text/javascript">
//定义了XMLHttpRequest对象
var request;
//创建XMLHttpRequest对象函数
function getRequestObject() {
if (window.ActiveXObject) {
request=new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
request=new XMLHttpRequest();
} else {
window.alert("你的浏览器不支持XMLHTTPRequest,将无使用AJAX功能!");
}
}
//回调方法实现:将服务器返回的消息更新到div中
function processResult() {
if ((request.readyState == 4) &&
(request.status == 200)) {
//1.弹出对话框以便调试
alert("服务器返回的是: "+request.responseText);
//显示到指定的组件中
document.getElementById("divErrorName").innerHTML=request.responseText;
}
}
//发送请求,绑定回调方法
function sendRequest() {
//创建XMLHTTPRequest对象
getRequestObject();
//绑定回调方法,
request.onreadystatechange=processResult;
//发送请求
// request.open("GET", "index.jsp", true);
//发送Post请求
request.open("POST", "servlet/CheckUserNameServlet", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
var userName=document.getElementById("userName").value;
//将userName做为请求参数发送上去
request.send("userName="+userName);
}
</script>
<br>注册用户名:<input type="text" name="userName" onBlur="sendRequest();"/>
<!-- 这个div层内将显示ajax从服务器返回的消息 -->
<div id="divErrorName" style="color:red;"></div>
<br>注册 密码:<input type="password" name="userPWD"/>
<br><input type="button" name="regUser" value="注册"/>
</body>
</html>
4,通过上面的Ajax三部曲,现在回到验证码刷新和验证
1,页面实现:
<%@ 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">
<script type="text/javascript">
function refresh(){
document.getElementById("picture").src="ImageServlet?id="+Math.random();
}
var request;//异步请求对象
function createXMLHttpRequest() {
if (window.ActiveXObject) {
request = new ActiveXObject("Microsoft.XMLHTTP");
} else if (window.XMLHttpRequest) {
request = new XMLHttpRequest();
} else {
window.alert("你的浏览器不支持XMLHTTPRequest,将无使用AJAX功能!");
}
}
//回调函数[响应之后执行的函数]
function processResult() {
if ((request.readyState == 4) && (request.status == 200)) {
var str = request.responseText;
if(str=="true"){
//显示到指定的组件中
alert("恭喜你!!!验证码正确");
}else{
//显示到指定的组件中
alert("验证码错误!!!!");
}
}
}
//发送请求,绑定回调方法
function sendRequest() {
//创建XMLHTTPRequest对象
createXMLHttpRequest();
//绑定回调方法,
request.onreadystatechange = processResult;
//获得输入框中的内容
var validate = document.getElementById("Validate").value;
//发送请求
// request.open("GET", "AccountCheckServlet?username="+username, true);
//发送Post请求
request.open("POST", "validateServlet", true);
request.setRequestHeader("Content-Type",
"application/x-www-form-urlencoded");
//将userName做为请求参数发送上去
request.send("validate=" + validate);
//request.send(null);
}
</script>
<body>
用户名:<input type="text" name="userName"><br/>
验证码:<input type="text" name="Validate" value="Validate" onblur="sendRequest()">< img src="ImageServlet" id="picture"><span style='color:#0000cc' onclick="refresh()">看不清,换一张</span>
2,ImageServlet获取图片,代码见本文档开始处;
package servlet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* Servlet implementation class ImageServlet
*/
public class ImageServlet extends HttpServlet {
// 定义可选择的字符
private static final String CHARS = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ";
static Random random = new Random();
// 得到一个随机的字符串
private String getRandomString() {
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < 4; i++) { // 生成六个字符
buffer.append(CHARS.charAt(random.nextInt(CHARS.length())));
}
return buffer.toString();
}
// 随机背景颜色
public static Color getRandomColor() { // 得到随机颜色
return new Color(random.nextInt(128) + 127, random.nextInt(128) + 127,
random.nextInt(128) + 127);
}
public static Color getReverseColor(Color c) { // 得到颜色的反色
return new Color(255 - c.getRed(), 255 - c.getGreen(),
255 - c.getBlue());
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg"); // 设置输出类型
// 得到随机字符串
String randomString = getRandomString();
// 将getSession()设置为true,当会话不存在是返回null
request.getSession(true).setAttribute("randomString", randomString);
// 设置图片的宽、高
int width = 80;
int height = 30;
Color bcolor = getRandomColor(); // 设置背景色
Color fcolor = getReverseColor(bcolor); // 前景色
// 创建一个彩色图片
BufferedImage bimage = new BufferedImage(width, height,
BufferedImage.TYPE_INT_BGR);
// 创建绘图对象,从bimage上得到的绘制对象,会把数据绘制到bimage上
Graphics2D g = bimage.createGraphics();
// 字体样式为宋体,加粗,20磅
g.setFont(new Font("Vijaya", Font.BOLD, 20));
// 先画出背景色
g.setColor(bcolor);
g.fillRect(0, 0, width, height);
// 再画出前景色
g.setColor(fcolor);
for (int i = 0; i < randomString.length(); i++) {
// 绘制随机字符
g.drawString(randomString.charAt(i) + "", 10 + i * 12, 22);
}
// 画出干扰点
for (int i = 0, n = random.nextInt(100); i < n; i++) {
g.fillRect(random.nextInt(width), random.nextInt(height), 1, 1);
}
// 将图像输出到浏览器
ServletOutputStream outstream = response.getOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(outstream);
encoder.encode(bimage);
outstream.flush();
outstream.close();
}
}
3,服务器对于Ajax请求是如何处理的呢?即validateServlet
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class validateServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String validate= request.getParameter("validate");
String randomString=(String)request.getSession(true).getAttribute("randomString");
PrintWriter out=response.getWriter();
if(validate.equalsIgnoreCase(randomString)){
out.write("true");
}else{
out.write("false");
}
}
}
相关推荐
"AJAX+jsp无刷新验证码实例"就是一个展示如何利用AJAX(异步JavaScript和XML)和JSP(JavaServer Pages)技术实现验证码的无刷新验证的具体应用。下面将详细介绍这个实例中的相关知识点。 首先,验证码的主要目的是...
Ajax异步无刷新验证码是一种常见的Web安全验证技术,它结合了Ajax(Asynchronous JavaScript and XML)与验证码(CAPTCHA)的特性,为用户提供更流畅、更友好的网页交互体验。在传统的网页验证过程中,用户每次提交...
总结来说,"ajax无页面刷新验证、struts结构+ajax+验证码jsp页面"这个主题探讨了如何在Struts2框架下利用Ajax技术实现验证码的无刷新更新和验证,为用户提供更流畅的交互体验,同时也增加了应用的安全性。...
通过本文的介绍,我们可以看到使用AJAX技术实现验证码局部刷新的方法不仅简单易行,而且能显著提升用户体验。无论是使用原生JavaScript还是借助ASP.NET的UpdatePanel控件,都可以有效地达到目的。在未来开发中,灵活...
总的来说,局部刷新验证码的实现不仅提升了用户体验,也简化了开发流程,尤其对于不熟悉Ajax技术的开发者,这是一个很好的实践案例。通过这种方式,用户无需等待整个页面重载,就能快速获取新的验证码,提高了交互...
### jsp+ajax实现的局部刷新验证验证码...通过上述方法,我们可以利用JSP+Ajax技术实现一个简单而有效的验证码局部刷新验证功能。这种方式不仅提高了用户体验,还减少了服务器资源的消耗,是非常实用的一种开发技巧。
现在的登录界面大多数都带...1.验证码后台访问部分上一篇博客已经介绍多了,这里介绍如何利用img中src实现局部刷新验证码的功能。 html部分: <p><label class=lbright>验证码: <input type=text name=validcode
标题和描述中提到的“jsp+ajax实现的局部刷新较验验证码(onblur事件触发较验)”技术涉及的知识点主要包括了JSP页面技术、AJAX无刷新数据交互技术、以及验证码图片的生成和验证方法。下面将对这些知识点进行详细说明...
【描述】:“实现局部刷新验证码,ajax登录功能”这部分描述说明了该登录界面有两个关键特性:一是验证码的局部刷新,二是利用Ajax进行登录操作。局部刷新验证码是防止机器人自动登录的有效手段,它要求用户在输入...
总结来说,结合Ajax和JSP技术,我们可以创建一个高效且用户体验良好的无刷新验证码系统。这个系统通过异步通信更新验证码,降低了对服务器资源的需求,同时也减少了用户的等待时间,提升了网页的交互性。在实际开发...
标题提到的“只更新验证码,不刷新页面”就是这样的一个技术实践,它利用了HTML中的`<iframe>`元素来实现特定内容(如验证码)的局部刷新,而无需整个页面重新加载。 验证码的主要目的是防止自动化脚本或机器人进行...
总结来说,.NET环境下实现验证码刷新或局部刷新的方法有多种,可以通过纯JavaScript或者引入外部JavaScript文件来实现。在具体实现时,应根据实际需求选择合适的实现方式。此外,为了确保网站的安全性,生成的验证码...
在ASP.NET中,Ajax技术被广泛用于创建交互性更强、响应速度更快的Web应用程序。本教程将探讨如何在ASP.NET中结合Ajax实现用户注册...在实际项目中,还可以考虑使用AJAX局部刷新、模态对话框等技术进一步提升交互效果。
在本文中,我们将深入探讨如何使用jQuery和Ajax技术实现一个简单的登录验证系统。这个系统能够实时检查用户输入的用户名和密码是否有效,而无需页面刷新,从而提供更流畅的用户体验。 首先,jQuery是一个轻量级的...
总结起来,PHP验证码的实现包括生成随机字符串、创建验证码图像、在网页中展示以及利用AJAX实现局部刷新。理解这些核心概念对于构建安全的Web应用至关重要。通过不断学习和实践,你可以根据需求调整验证码的复杂度,...
1. **Ajax(异步JavaScript和XML)**:Ajax的核心是通过JavaScript在后台与服务器进行数据交换,无需刷新整个页面即可更新局部内容。在本案例中,当用户在输入用户名字段时,JavaScript监听到输入事件,触发Ajax请求...
无刷新验证码的实现通常依赖于AJAX(Asynchronous JavaScript and XML)技术,它可以实现在用户与服务器交互时页面的局部更新,而无需整体刷新页面。 在ASP.NET环境中,验证码的实现主要涉及到以下几个关键技术点:...
通过Ajax技术,系统能实现页面局部更新,提升用户交互体验,同时结合后台强大的业务处理能力和合理的数据库设计,确保系统的稳定运行和数据的安全。这样的系统在现代企业中有着广泛的应用前景,能有效提升企业的信息...
这通常是通过AJAX技术实现的,例如使用jQuery或其他JavaScript库发送异步请求到服务器,服务器返回新的验证码图片,然后更新页面上的验证码图像。 实现此功能的具体步骤包括: - 在`CheckCode.aspx`中添加一个方法...