求JSP编写验证码程序的小程序代码注释释

在Web程序中,验证码是经常使用的技术之一。Web程序永远面临未知用户和未知程序的探测。为了防止恶意脚本的执行,验证码技术无疑是首选方案之一。本文将讨论如何在JSP和Servlet中使用验证码技术。
验证码的产生思路很简单,在Servlet中随机产生验证码字符序列,并计入session中,JSP中以图片的形式进行显示。当用户在JSP表单中输入验证码并提交时,在相应的Servlet中验证是否与session中保存的验证码一致。下面通过代码,一次演示验证码产生和实现的验证的过程。
1. 验证码的产生
我们需要创建一个名为ValcodeServlet的servlet并在其doGet()方法中完成验证码的产生。首先通过随机数的产生类Random随机产生一个4位的验证码,并将其存入session;然后使用BufferedImage和Graphics类把验证码转为图片,当然为了起到较好的效果,我们需要添加一些干扰线;最后使用ImageIO将图片输出。详细代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
&&&&&& // 告知浏览当作图片处理
&&&&&& response.setContentType("image/jpeg");
&&&&&& // 告诉浏览器不缓存
&&&&&& response.setHeader("pragma", "no-cache");
&&&&&& response.setHeader("cache-control", "no-cache");
&&&&&& response.setHeader("expires", "0");
&&&&&& // 产生由4位数字构成的验证码
&&&&&& int length = 4;
&&&&&& String valcode = "";
&&&&&& Random rd = new Random();
&&&&&& for(int i=0; i& i++)
&&&&&&&&&& valcode+=rd.nextInt(10);
&&&&&& // 把产生的验证码存入到Session中
&&&&&& HttpSession session = request.getSession();
&&&&&& session.setAttribute("valcode", valcode);
&&&&&& // 产生图片
&&&&&& int width = 80;
&&&&&& int height = 25;
&&&&&& BufferedImage img = newBufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
&&&&&& // 获取一个Graphics
&&&&&& Graphics g = img.getGraphics();
&&&&&& // 填充背景色
&&&&&& g.setColor(Color.WHITE);
&&&&&& g.fillRect(0, 0, width, height);
&&&&&& // 填充干扰线50
&&&&&& for(int i=0; i&50; i++){
&&&&&&&&&& g.setColor(new Color(rd.nextInt(100)+155,rd.nextInt(100)+155,rd.nextInt(100)+155));
&&&&&&&&&& g.drawLine(rd.nextInt(width), rd.nextInt(height),rd.nextInt(width), rd.nextInt(height));
&&&&&& // 绘制边框
&&&&&& g.setColor(Color.GRAY);
&&&&&& g.drawRect(0, 0, width-1, height-1);
&&&&&& // 绘制验证码
&&&&&& Font[] fonts = {new Font("隶书",Font.BOLD,18),new Font("楷体",Font.BOLD,18),new Font("宋体",Font.BOLD,18),new Font("幼圆",Font.BOLD,18)};
&&&&&& for(int i=0; i& i++){
&&&&&&&&&& g.setColor(new Color(rd.nextInt(150),rd.nextInt(150),rd.nextInt(150)));
&&&&&&&&&& g.setFont(fonts[rd.nextInt(fonts.length)]);
&&&&&&&&&& g.drawString(valcode.charAt(i)+"", width/valcode.length()*i+2, 18);
&&&&&& // 输出图像
&&&&&& g.dispose();
&&&&&& ImageIO.write(img, "jpeg", response.getOutputStream());
上面的代码只是产生了一个常规的验证码,我们可以根据自己的需要对验证码的产生策略和干扰线进行调整。Servlet编写完毕,别忘了在web.xml中进行配置以便能在JSP中调用,其代码如下:
&description&&/description&
&display-name&ValcodeServlet&/display-name&
&servlet-name&ValcodeServlet&/servlet-name&&servlet-class&org.icer.jee.valcode.servlet.ValcodeServlet&/servlet-class&
&/servlet&
&servlet-mapping&
&servlet-name&ValcodeServlet&/servlet-name&
&url-pattern&/ValcodeServlet&/url-pattern&
&/servlet-mapping&
2. 验证码的显示
产生验证码的servlet编写完毕,并且已经web.xml中进行了配置,那么我们在input.jsp中使用&img /&标记以图片的方式调用servlet即可显示验证码。
当然为了能起到验证效果,本例中还包含了简单的表单。为了放置验证码无法识别,此处还提供了看不清点击换一张功能,用户点击图片时重新加载验证码图片(问号是为了放置浏览器缓存而不能实现重新请求图片)。JSP中表单部分代码如下:
&formname="form1"method="post"action="LoginServlet"&
&inputname="vcode"type="text"class="input02"id="vcode"&
&imgsrc="ValcodeServlet"align="absmiddle"title="看不清,点击换一张"onClick="this.src=this.src+'?'"/&
&inputtype="submit"name="button"id="button"value=" 提交 "&
3. 实现验证功能
当表单提交到CheckServlet时,对用户填写的验证码和session中存储的验证码进行比对,根据结果给出不同提示。代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
&&&&&& // 获取验证码
&&&&&& String valcode = request.getSession().getAttribute("valcode").toString();
&&&&&& // 获取用户填写的验证码
&&&&&& String vcode = request.getParameter("vcode");
&&&&&& // 进行验证
&&&&&& if(!valcode.equals(vcode))
&&&&&&&&&& System.out.println("&&&验证码错误!");
&&&&&& else
&&&&&&&&&& System.out.println("&&&验证码正确!");
上面只是根据验证情况在控制台进行了输出,使用时根据实际的业务逻辑需求进行修改即可。
&&& 总起来说,验证码技术本质上就是利用Java绘图技术把随机产生的验证码字符图形化,并在JSP中以图形调用,最后在用户提交表单后在对应的servlet中进行验证。本文只是提供验证码的基本实现思路,希望大家能灵活应用。
阅读(...) 评论() &简单的登陆注册的实现+验证码和表单验证
昨天做了一个登录注册的小实例今天回忆一遍并且通过博客的方式写下来
首先先po上Web 的经典三层框架
注意 的是每个层都应该完成自己应该完成的不能完成别的层该做的事,不然耦合性太高vcD4NCjxwPsrXz8jPyMi3tqi1x8K9us3XorLh0OjSqsG9uPbSs8PmIGxvZ2luLmpzcCByZWdpc3QuanNwINTZvNPJz9K7uPa7ttOtytfSsyB3ZWxjb21lLmpzcCC1x8K9s8m5prLFxNy/tLz7IChzZXNzaW9uIMq1z9YpPC9wPg0KPHA+0OjSqkxvZ2luU2VydmxldC5qYXZhILrNIFJlZ2lzdFNlcnZsZXQuamF2YTxiciAvPg0K0vLOqtPQ0enWpMLrIMv50tTU2bS0vajSu7j2IFZlcmlmeUNvZGVTZXJ2bGV0LmphdmE8YnIgLz4NCnNlcnZsZXQg08PAtLSmwO3Ss8Pmx+vH8yDIu7rztffTw7e9t6ggsNG94bn7z+zTprW90rPD5jxiciAvPg0KyLu687S0vajSu7j2yrXM5cDgINPrtcfCvdeisuHPyLnYtcTKtczlwOAgVXNlci5qYXZhPC9wPg0KPHA+0rXO8cLfvK2y48q1z9bT67XHwr3XorLhz+C52NK1zvE8L3A+DQo8cD7K/b7dsuMg0tR4bWwgtPrM5jwvcD4NCjxwcmUgY2xhc3M9"brush:">
分析完了然后导入项目所需要的包
commons-logging-1.1.3 jar //用来把map中的数据封装到bean对象中
commons-beanutils-1.9.2.jar
dom4j-1.6.1.jar //以下两个是解析xml用
jaxen-1.1.6.jar
ashin-utils.jar // 自己生成的工具包 里面有生成验证码的代码
自定义jar包中的代码:
public static T toBean(Map map,Class clazz){
* 创建指定类型的javabean对象
//System.out.println(map); //有值{Ben=whoami2, Ashin=whoami, Aken=whoami3}
clazz.newInstance();
* 把数据封装到bean中
BeanUtils.populate(bean,map);
//System.out.println(bean); //无值
* 返回javabean对象
} catch (Exception e) {
throw new RuntimeException(e);
public class VerifyCode {
private int w =70;
private int h =35;
private Random r = new Random();
//定义有那些字体
private String[] fontNames ={&宋体&,&华文楷体&,&黑体&,&微软雅黑&,&楷体_GB2312&};
//定义有那些验证码的随机字符
private String codes = &abcdefghjkmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ&;
//生成背景色
private Color bgColor = new Color(250,250,250);
//用于gettext 方法 获得生成的验证码文本
//生成随机颜色
private Color randomColor(){
int red =r.nextInt(150);
int green =r.nextInt(150);
int blue =r.nextInt(150);
return new Color(red,green,blue);
//生成随机字体
private Font randomFont(){
int index = r.nextInt(fontNames.length);
String fontName = fontNames[index];
int style =r.nextInt(4);
int size =r.nextInt(5)+24;
new Font(fontName, style, size);
//画干扰线
private void drawLine(BufferedImage image){
int num = 3;
Graphics2D g2 = (Graphics2D) image.getGraphics();
for(int i =0;i
com.ashin.beans
对应实体类
& User.java
&verifycode
com.ashin.service
&UserService.java
&UserException.java
//自定义异常类
com.ashin.web.servlet
&LoginServlet.java
&RegistServlet.java
&VerifyCodeServlet
com.ashin.dao
&UserDao.java
下面贴部分代码 并会注释
实体类就不多写了 只是多了个VerifyCode 属性用于验证码
先把userservice 贴出来以便后面的理解
* 第一个方法通过名字查询用户返回一个用户对象 调用的是userdao的findUserByName()方法
* 并通过adduser()在中添加一个用户
* 第二个方法 登陆时调用 来判断用户名是否存在 密码是否正确
* 返回的userexception都来自自定义异常类
* @param user
* @throws UserException
private UserDao userdao = new UserDao();
public void regist(User user) throws UserException{
User _user = userdao.findUserByName(user.getUsername());
if(_user != null ) throw new UserException(&用户名&+user.getUsername()+&,已经被注册了&);
userdao.addUser(user);
public User login(User form) throws UserException
User _user = userdao.findUserByName(form.getUsername());
if(_user == null)
throw new UserException(&用户名&+form.getUsername()+&,不存在请去注册&);
if( ! _user.getPassword().equals(form.getPassword())) throw new UserException(&密码不正确&);
自定义异常类
创建UserException 类 只需继承Exception 类并实现父类构造方法即可
&script type="text/javascript"&
function _change(){
var ele = document.getElementById("verifyCode");
ele.src="http://blog.csdn.net/ashinli/article/details/?xxx="+new Date().getTime();
//只要后面的参数变化的话就会再次发送请求实现验证码换一张的效果
这边的${msg } 用于显示错误信息 如果RegistServlet 捕获到错误会把异常加入request 域 并转发到 次页面进行输出
需要引入标签库 &%@ taglib prefix=&c& uri=&/jsp/jstl/core& %&
input标签中的el表达式用于回显 用户名及密码 后面的${errors.password }是显示表单验证时返回的错误信息
*/注册${msg }
用户名:${errors.username }
密 码:${errors.password }
src=&http://blog.csdn.net/ashinli/article/details/&
指向/项目名/VerifyCodeServlet
${errors.verifycode }
Regist.servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(&utf-8&);
response.setContentType(&text/charset=utf-8&);
UserService userService = new UserService();
//将表单信息封装到user对象中
User form = CommonUtils.toBean(request.getParameterMap(), User.class);
//创建一个map对象用来存储错误信息
Map errors = new HashMap();
* 下面三段都是表单验证
String username = form.getUsername();
if(username == null || username.trim().isEmpty()){
errors.put(&username&, &用户名不能为空&);
}else if(username.length()&3 || username.length()&13){
errors.put(&username&, &用户名长度应该为3~13位&);
String password = form.getPassword();
if(password == null || password.trim().isEmpty()){
errors.put(&password&, &密码不能为空&);
}else if(password.length()&3 || password.length()&13){
errors.put(&password&, &密码长度应该为3~13位&);
String createverify = (String) request.getSession().getAttribute(&session_vf&);
String verifycode = form.getVerifyCode();
if(verifycode == null || verifycode.trim().isEmpty()){
errors.put(&verifycode&, &验证码不能为空&);
}else if(verifycode.length() != 4){
errors.put(&verifycode&, &验证码必须是四位&);
}else if(!verifycode.equalsIgnoreCase(createverify)){
errors.put(&verifycode&, &验证码错误&);
* 查看是否有异常 没就执行下面的代码 有就保存异常 保存用于回显的信息
并转发到注册页面 注意return
if(errors != null && errors.size() & 0){
request.setAttribute(&errors&, errors);
request.setAttribute(&user&, form);
request.getRequestDispatcher(&/user/Regist.jsp&).forward(request, response);
//不往下执行
//上面没有异常 就执行
调用 业务逻辑类的 regist方法
如果没有异常就显示成功
有异常就保存异常信息 转发到注册页面 同上
userService.regist(form);
response.getWriter().print(&注册成功
response.getWriter().print(&&);
} catch (UserException e) {
request.setAttribute(&msg&, e.getMessage());
request.setAttribute(&user&, form);
request.getRequestDispatcher(&/user/Regist.jsp&).forward(request, response);
LoginServlet
//与注册的servlet 类似 调用的业务逻辑方法不同
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding(&utf-8&);
response.setContentType(&text/charset:utf-8&);
UserService userService = new UserService();
User form = CommonUtils.toBean(request.getParameterMap(), User.class);
User user = userService.login(form);
request.getSession().setAttribute(&sessionUser&, user);
response.sendRedirect(request.getContextPath()+&/user/Welcome.jsp&);
} catch (UserException e) {
request.setAttribute(&msg&, e.getMessage());
request.setAttribute(&user&, form);
request.getRequestDispatcher(&/user/Login.jsp&).forward(request, response);
//get方法 因为前面刷新验证码 采用的是 +参数的形式
//所用的类在开头自定义jar包中的代码
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
* 创建验证码类
VerifyCode vf = new VerifyCode();
* 生成验证码图片
BufferedImage
image = vf.createImage();
* 把验证码文本存在session中
request.getSession().setAttribute(&session_vf&, vf.getText());
* 把图片相应给客户端
VerifyCode.output(image, response.getOutputStream());
最后贴上userdao 的代码
package com.ashin.
import java.io.FileOutputS
import java.io.OutputStreamW
import org.dom4j.D
import org.dom4j.DocumentE
import org.dom4j.E
import org.dom4j.io.OutputF
import org.dom4j.io.SAXR
import org.dom4j.io.XMLW
import com.ashin.domain.U
* @author Ashin
public class UserDao {
String path =&F://users.xml&;
public User findUserByName(String username){
* 获得一个解析器
SAXReader reader = new SAXReader();
* 通过路径取得一个文档对象
Document doc = reader.read(path);
* 通过xpah查询得到element
Element element = (Element) doc.selectSingleNode(&//user[@username='&+username+&']&);
* 查看是否存在 返回null则不存在
if(element == null)
* 把element数据封装到user对象中
User u = new User();
String attrUsername = element.attributeValue(&username&);
String attrPassword = element.attributeValue(&password&);
u.setUsername(attrUsername);
u.setPassword(attrPassword);
} catch (Exception e) {
throw new RuntimeException(e);
public boolean addUser(User user ){
SAXReader reader = new SAXReader();
Document document = reader.read(path);
* 获得文档的根节点
Element root = document.getRootElement();
* 在根节点下添加子元素
Element userEle = root.addElement(&user&);
* 设置元素的属性
userEle.addAttribute(&username&, user.getUsername());
userEle.addAttribute(&password&, user.getPassword());
* 保存文档
OutputFormat outputFormat = new OutputFormat(&\t&,true); //缩进使用\t
换行选择true
outputFormat.setTrimText(true);//是否删除原有的换行和缩进
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(path), &utf-8&),outputFormat);
writer.write(document);
writer.close();
} catch (Exception e) {
throw new RuntimeException(e);
} catch (DocumentException e) {
throw new RuntimeException(e);
此次实例让我很直观的理解到了三层框架的好处,每个层都各司其职 完成对应的功能Java实现验证码具体代码
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了Java实现验证码具体代码,有需要的朋友可以参考一下
这里实现我使用到了struts2模拟一个登录功能来验证java实现的验证码功能。
Java实现验证码的步骤:
1、创建RandomImageGenerator.java类,该类实现验证码图片的生成
2、创建一个servlet类,RandomImageServlet.java,将生成的验证码输出到页面
3、创建一个Action类,LoginAction.java,控制登录
4、配置struts.xml一个web.xml文件
5、编写页面
具体实现用代码表达
1、创建RandomImageGenerator.java类
代码如下:package com.tenghu.
import java.awt.Cimport java.awt.Fimport java.awt.Graphics2D;import java.awt.image.BufferedIimport java.io.FileNotFoundEimport java.io.FileOutputSimport java.io.IOEimport java.io.OutputSimport java.util.Rimport javax.imageio.ImageIO;
/**&* 验证码生成类&* @author xiaohu&*&*/public class RandomImageGenerator {&//创建Random对象&static Random random=new Random();&//随机生成包含验证码字符串&public static String random(int num){&&//初始化种子&&String[] str={"0","1","2","3","4","5","6","7","8","9",&&&&&& "a","b","c","d","e","f","g","h","i","j",&&&&&& "k","l","m","n","p","q","r","s","t"};&&int number=str.&&//接收随机字符&&String text = "";&&//随机产生4个字符的字符串&&for(int i=0;i&i++){&&&text+=str[random.nextInt(number)];&&}&&&}&/**& * 随机产生定义的颜色& * & * @return& */&private static Color getRandColor() {&&Random random = new Random();&&Color color[] = new Color[10];&&color[0] = new Color(32, 158, 25);&&color[1] = new Color(218, 42, 19);&&color[2] = new Color(31, 75, 208);&&color[3] = new Color(0, 102, 182);&&color[4] = new Color(171, 0, 85);&&return color[random.nextInt(5)];&}&/**& * 产生随机字体& * & * @return& */&private static Font getFont() {&&Random random = new Random();&&Font font[] = new Font[5];&&font[0] = new Font("Ravie", Font.BOLD, 30);&&font[1] = new Font("Antique Olive Compact", Font.BOLD, 30);&&font[2] = new Font("Forte", Font.BOLD, 30);&&font[3] = new Font("Wide Latin", Font.BOLD, 30);&&font[4] = new Font("Gill Sans Ultra Bold", Font.BOLD, 30);&&return font[random.nextInt(5)];&}&/**& * 生成图片& * @throws IOException & */&public static void render(String randomStr,OutputStream out,int width,int height) throws IOException{&&//在内存中创建图像&&BufferedImage bi=new BufferedImage(width, height, BufferedImage.TYPE_BYTE_INDEXED);&&//获取图形上下文&&Graphics2D g=(Graphics2D) bi.getGraphics();&&//话边框&&g.setColor(Color.white);&&g.fillRect(0, 0, width, height);&&g.setFont(getFont());&&g.setColor(Color.BLACK);&&//画认证码,每个认证码在不同的水平位置&&String str1[]=new String[randomStr.length()];&&for(int i=0;i&str1.i++){&&&str1[i]=randomStr.substring(i,i+1);&&&int w=0;&&&int x=(i+1)%3;&&&//随机生成验证码字符水平偏移量&&&if(x==random.nextInt(7)){&&&&w=30-random.nextInt(7);&&&}else{&&&&w=30+random.nextInt(7);&&&}&&&//随机生成颜色&&&g.setColor(getRandColor());&&&g.drawString(str1[i], 20*i+10, w);&&}&&//随机产生干扰点,并用不同的颜色表示,事图像的认证码不易被其他程序探测到&&for(int i=0;i&100;i++){&&&int x=random.nextInt(width);&&&int y=random.nextInt(height);&&&Color color=new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));&&&//随机画各种颜色的线&&&g.setColor(color);&&&g.drawOval(x, y, 0, 0);&&}&&//画干扰线&&for(int i=0;i&15;i++){&&&int x=random.nextInt(width);&&&int y=random.nextInt(height);&&&int x1=random.nextInt(width);&&&int y1=random.nextInt(height);&&&Color color=new Color(random.nextInt(255), random.nextInt(255), random.nextInt(255));&&&//随机画各种颜色线&&&g.setColor(color);&&&g.drawLine(x, y, x1, y1);&&}&&//图像生效&&g.dispose();&&//输出页面&&ImageIO.write(bi, "jpg", out);&}&public static void main(String[] args) throws FileNotFoundException, IOException {&&//获取随机字符串&&String randomStr=random(5);&&System.out.println(randomStr);&&//生成图片&&render(randomStr, new FileOutputStream("D:\\test.jpg"),130,40);&}}
2、创建RandomImageServlet.java
代码如下:package com.tenghu.code.
import java.io.IOEimport javax.servlet.ServletEimport javax.servlet.http.HttpSimport javax.servlet.http.HttpServletRimport javax.servlet.http.HttpServletRimport javax.servlet.http.HttpS
import com.tenghu.code.RandomImageG
public class RandomImageServlet extends HttpServlet {&//图片宽度&int width=0;&//图片高度&int height=0;&//图片上随机字符个数&int randomStrNum=0;&public void destroy() {&}&public void doGet(HttpServletRequest request, HttpServletResponse response)&&&throws ServletException, IOException {&&doPost(request, response);&}&public void doPost(HttpServletRequest request, HttpServletResponse response)&&&throws ServletException, IOException {&&request.setCharacterEncoding("UTF-8");&&//获取HttpSession对象&&HttpSession session=request.getSession();&&//获取随机字符串&&String randomStr=RandomImageGenerator.random(randomStrNum);&&if(null!=session){&&&//设置参数&&&session.setAttribute("randomStr", randomStr);&&&//设置响应类型,输出图片客户端不缓存&&&response.setDateHeader("Expires", 1L);& &&&response.setHeader("Cache-Control", "no-cache, no-store, max-age=0");&&&response.addHeader("Pragma", "no-cache");&&&response.setContentType("image/jpeg");&&&&//输出到页面&&&RandomImageGenerator.render(randomStr, response.getOutputStream(), width, height);&&}&}&public void init() throws ServletException {&&//获取宽度&&width=Integer.parseInt(this.getInitParameter("width"));&&//获取高度&&height=Integer.parseInt(this.getInitParameter("height"));&&//获取个数&&randomStrNum=Integer.parseInt(this.getInitParameter("num"));&}}&&&
3、创建LoginAction.java类
代码如下:package com.tenghu.code.
import java.io.ByteArrayInputSimport java.io.InputSimport com.opensymphony.xwork2.ActionCimport com.opensymphony.xwork2.ActionS
public class LoginAction extends ActionSupport{&//用户名&private String userN&//密码&private S&//验证码&private S&private InputStream inputS&public InputStream getResult(){&&return inputS&}&//成功&public String success() throws Exception{&&return SUCCESS;&}&//测试登录&public String testLogin() throws Exception{&&//获取图片的验证码&&String randomStr=(String) ActionContext.getContext().getSession().get("randomStr");&&if(code.trim().equalsIgnoreCase(randomStr)){&&&if("admin".equals(userName.trim())&&"admin".equals(password.trim())){&&&&//成功&&&&inputStream=new ByteArrayInputStream("1".getBytes("UTF-8"));&&&}else{&&&&//用户名或密码错误&&&&inputStream=new ByteArrayInputStream("2".getBytes("UTF-8"));&&&}&&}else{&&&//验证码错误&&&inputStream=new ByteArrayInputStream("0".getBytes("UTF-8"));&&}&&return "result";&}&public String getUserName() {&&return userN&}&public void setUserName(String userName) {&&this.userName = userN&}&public String getPassword() {&&&}&public void setPassword(String password) {&&this.password =&}&public String getCode() {&&&}&public void setCode(String code) {&&this.code =&}}
4、配置struts.xml、web.xml文件
代码如下:&?xml version="1.0" encoding="UTF-8"?&&!DOCTYPE struts PUBLIC&"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"&"http://struts.apache.org/dtds/struts-2.3.dtd"&&struts&&&&package name="installs" extends="struts-default"&&&&action name="login" class="com.tenghu.code.action.LoginAction"&&&&&!-- 登录成功到success.jsp页面 --&&&&&result name="success"&success.jsp&/result&&&&&!-- 登录验证返回的数据 --&&&&&result name="result" type="stream"&&&&&&param name="contentType"&text/html&/param&&&&&&param name="inputName"&result&/param&&&&&/result&&&&/action&&&/package&&/struts&
代码如下:&?xml version="1.0" encoding="UTF-8"?&&web-app version="2.5" &xmlns="/xml/ns/javaee" &xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" &xsi:schemaLocation="/xml/ns/javaee &/xml/ns/javaee/web-app_2_5.xsd"&& &servlet&&&& &description&This is the description of my J2EE component&/description&&&& &display-name&This is the display name of my J2EE component&/display-name&&&& &servlet-name&RandomImageServlet&/servlet-name&&&& &servlet-class&com.tenghu.code.servlet.RandomImageServlet&/servlet-class&&&& &!-- 初始化图片宽度 --&&&& &init-param&&&& &&param-name&width&/param-name&&&& &&param-value&130&/param-value&&&& &/init-param&&&& &!-- 初始化图片高度 --&&&& &init-param&&&& &&param-name&height&/param-name&&&& &&param-value&40&/param-value&&&& &/init-param&&&& &!-- 初始化图片随机数个数 --&&&& &init-param&&&& &&param-name&num&/param-name&&&& &&param-value&4&/param-value&&&& &/init-param&& &/servlet&
& &servlet-mapping&&&& &servlet-name&RandomImageServlet&/servlet-name&&&& &url-pattern&/verification.do&/url-pattern&& &/servlet-mapping&& &!-- 配置struts核心过滤器 --&& &filter&& &&filter-name&struts2&/filter-name&& &&filter-class&org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter&/filter-class&& &/filter&& &filter-mapping&& &&filter-name&struts2&/filter-name&& &&url-pattern&/*&/url-pattern&& &/filter-mapping&& &welcome-file-list&&&& &welcome-file&index.jsp&/welcome-file&& &/welcome-file-list&&/web-app&
5、编写测试页面
代码如下:&%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%&&!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&&html&& &head&&&& &base href="&%=basePath%&"&&&& &title&My JSP 'index.jsp' starting page&/title&&&script type="text/javascript" src="js/jquery-1.10.2.min.js"&&/script&&&script type="text/javascript" src="js/jquery.form.js"&&/script&&&script type="text/javascript"&&&$(document).ready(function(){&&&CODE.initCode();&&&//验证输入&&&function checkInput(){&&&&if($('#userName').val()==''){&&&&&alert('用户名不能为空!');&&&&&&&&&}&&&&if($('#password').val()==''){&&&&&alert('密码不能为空!');&&&&&&&&&}&&&&if($('#code').val()==''){&&&&&alert('验证码不能为空!');&&&&&&&&&}&&&&&&&}&&&//点击按钮&&&$('#btn').click(function(){&&&&if(checkInput()==true){&&&&&$('#login_request').ajaxSubmit({&&&&&&url:'login!testLogin',&&&&&&cache:false,&&&&&&type:'POST',&&&&&&success:function(data){&&&&&&&if(data==0){&&&&&&&&alert('验证码错误!');&&&&&&&&//改变验证码&&&&&&&&CODE.initCode();&&&&&&&}else if(data==1){&&&&&&&&alert('登录成功!');&&&&&&&&//提交到登录成功页面&&&&&&&&$('#login_request')[0].submit();&&&&&&&}else if(data==2){&&&&&&&&alert('用户名或密码错误!');&&&&&&&&//改变验证码&&&&&&&&CODE.initCode();&&&&&&&}&&&&&&},&&&&&&error:function(e){&&&&&&&alert('出错了!');&&&&&&}&&&&&});&&&& }&&&});&&});&&var CODE={&&&&//初始化化验证码&&&&initCode:function(){&&&&&$("#code_img").attr("src","verification.do?rmd="+new Date().getTime())//如果需要点击图片改变图片的内容,则必须添加时间搓&&&&&.click(function(){&&&&&&$(this).attr("src","verification.do?rmd="+new Date().getTime());&&&&&});&&&&&}};&&/script&& &/head&& &body&& &&form action="login!success" id="login_request" method="post"&& &&UserName:&input type="text" id="userName" name="userName"/&&br/&& &&Password:&input type="password" id="password" name="password"/&&br&& &&Verification_Code:&input type="text" id="code" name="code"/&&img id="code_img" style="position:top:8height:25px"&&br&& &&&input type="button" id="btn" value="登录"/&& &&/form&& &/body&&/html&
成功页面就部贴出来了,就是一段文字而已显示结果:
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 如何编写程序代码 的文章

 

随机推荐