您的位置:首页 > 编程语言 > Java开发

登陆验证码(struts2实现)

2013-07-30 17:05 253 查看


登陆验证码(struts2实现)

登陆验证码(struts2实现)

1.login.jsp

Java代码


<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>

<%@ taglib prefix ="s" uri="/struts-tags"%>

<html>

<head>

<script type="text/javascript">

function changeValidateCode(obj) {

/***

* 获取当前的时间作为参数,无具体意义

* 每次请求需要一个不同的参数,否则可能会返回同样的验证码

* 这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。

*/

var timenow = new Date().getTime();

obj.src="randPic.action?d="+timenow;

}

</script>

</head>

<body>

<form name="" action="Login">

验证码:<s:textfield name="code"></s:textfield><img src="randPic.action" onclick="changeValidateCode(this)" title="点击图片刷新验证码"/>

<br/><input type="submit" value="登陆"/><input type="reset" value="重置"/>

</form>

</body>

</html>

2.web.xml

Java代码


<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4"

xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>

<welcome-file>index.jsp</welcome-file>

</welcome-file-list>

<filter>

<filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

</filter>

<filter-mapping>

<filter-name>struts2</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

</web-app>

3.struts.xml

Java代码


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="iamge" extends="struts-default" namespace="/">

<action name="randPic" class="com.org.momo.action.RandomAction">

<result type="stream">

<param name="contentType">image/jpeg</param>

<param name="inputName">inputStream</param>

</result>

</action>

<action name="Login" class="com.org.momo.action.LoginAction">

<result name="success">/success.jsp</result>

<result name="error">/fail.jsp</result>

</action>

</package>

</struts>

4.RandomNumUtil.java

Java代码


package com.org.momo.util ;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.util.Random;

import javax.imageio.ImageIO;

import javax.imageio.stream.ImageOutputStream;

public class RandomNumUtil {

private ByteArrayInputStream image;//图像

private String str;//验证码

private RandomNumUtil(){

init();//初始化属性

}

/*

* 取得RandomNumUtil实例

*/

public static RandomNumUtil Instance(){

return new RandomNumUtil();

}

/*

* 取得验证码图片

*/

public ByteArrayInputStream getImage(){

return this.image;

}

/*

* 取得图片的验证码

*/

public String getString(){

return this.str;

}

private void init() {

// 在内存中创建图象

int width=85, height=20;

BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

// 获取图形上下文

Graphics g = image.getGraphics();

// 生成随机类

Random random = new Random();

// 设定背景色

g.setColor(getRandColor(200,250));

g.fillRect(0, 0, width, height);

// 设定字体

g.setFont(new Font("Times New Roman",Font.PLAIN,18));

// 随机产生155条干扰线,使图象中的认证码不易被其它程序探测到

g.setColor(getRandColor(160,200));

for (int i=0;i<155;i++)

{

int x = random.nextInt(width);

int y = random.nextInt(height);

int xl = random.nextInt(12);

int yl = random.nextInt(12);

g.drawLine(x,y,x+xl,y+yl);

}

// 取随机产生的认证码(6位数字)

String sRand="";

for (int i=0;i<4;i++){

String rand=String.valueOf(random.nextInt(10));

sRand+=rand;

// 将认证码显示到图象中

g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));

// 调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成

g.drawString(rand,13*i+6,16);

}

//赋值验证码

this.str=sRand;

//图象生效

g.dispose();

ByteArrayInputStream input=null;

ByteArrayOutputStream output = new ByteArrayOutputStream();

try{

ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);

ImageIO.write(image, "JPEG", imageOut);

imageOut.close();

input = new ByteArrayInputStream(output.toByteArray());

}catch(Exception e){

System.out.println("验证码图片产生出现错误:"+e.toString());

}

this.image=input;/* 赋值图像 */

}

/*

* 给定范围获得随机颜色

*/

private Color getRandColor(int fc,int bc){

Random random = new Random();

if(fc>255) fc=255;

if(bc>255) bc=255;

int r=fc+random.nextInt(bc-fc);

int g=fc+random.nextInt(bc-fc);

int b=fc+random.nextInt(bc-fc);

return new Color(r,g,b);

}

}

5.RandomAction.java和LoginAction.java

Java代码


package com.org.momo.action ;

import java.io.ByteArrayInputStream;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

import com.org.momo.util.RandomNumUtil;

public class RandomAction extends ActionSupport{

private ByteArrayInputStream inputStream;

public String execute() throws Exception{

RandomNumUtil rdnu=RandomNumUtil.Instance();

this.setInputStream(rdnu.getImage());//取得带有随机字符串的图片

ActionContext.getContext().getSession().put("sessionCode", rdnu.getString());//取得随机字符串放入HttpSession

return SUCCESS;

}

public void setInputStream(ByteArrayInputStream inputStream) {

this.inputStream = inputStream;

}

public ByteArrayInputStream getInputStream() {

return inputStream;

}

}

package com.org.momo.action;

import com.opensymphony.xwork2.ActionContext;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction extends ActionSupport{

private String code;

public String getCode() {

return code;

}

public void setCode(String code) {

this.code = code;

}

public String execute() throws Exception{

String sessionCode=(String)(ActionContext.getContext().getSession().get("sessionCode"));

if(sessionCode.equals(this.getCode())) {

return SUCCESS;

}else{

return ERROR;

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: