1. jsp代码 :
<Script>
function changeImg(){
document.getElementById("certImg").src ="makeCertPic.jsp?it="+Math.random(); /* +Math.random() */
}
</Script> <table width="100%" border="0" cellspacing="1" cellpadding="1">
<tr>
<td width="5%"> </td>
<td nowrap width="11%" align="left" class="loginname">验证码: </td>
<td nowrap width="68%" class="loginname">
<div align="left">
<input type="text" istyle="input01" name="certCode"
class="input01" />
<!-- <iframe width="200" height="60" id="certImg" src="makeCertPic.jsp"></iframe> -->
<img id="certImg" src="makeCertPic.jsp" onclick="changeImg()" alt="看不清换一张">
<!-- onclick="changeImg()" alt="看不清换一张" --> </div> </td> </tr> <tr>
<td width="14%"> </td> <td nowrap width="18%" align="right" class="loginname">
<div align="left">用户名:</div>
</td>
<td nowrap width="68%" class="loginname">
<div align="left">
<html:text styleClass="input01" property="user_code"
onkeypress="return handleEnter(this, event,1)" />
<!-- <a href="#" onclick="changeImg()">看不清换一张 </a> -->
</div>
</td>
</tr>
<tr>
<td width="14%"> </td>
<td nowrap width="18%" align="right" class="loginname">
<div align="left">密 码:</div>
</td>
<td nowrap width="68%" class="loginname">
<div align="left">
<html:password styleClass="input01" property="password"
value="" />
</div>
</td> </tr> <tr> <td align="left">
<td nowrap align="right"><html:submit value='登 录'
styleClass="button" onclick="return ck_login();" /></td>
<td nowrap align="left"><html:reset value='重 写'
styleClass="button" /></td>
</td>
</tr>
</table>
2.链接的加jsp文件,用于加载验证码数据
<%@page import="com.test.makeCertPic"%>
<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@page contentType="image/jpeg" %> <%
makeCertPic pic = new makeCertPic();
String str = pic.getCertPic(0, 0, response.getOutputStream());
session.setAttribute("certCode", str);
//关闭response ,不加会运行两次,且会报错
out.clear();
out = pageContext.pushBody();
%>
3.对应的验证码类 java代码
package com.test; import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
import javax.imageio.ImageIO; /**
* @author dzy 生成验证码图片
*/
public class makeCertPic {
// 验证码图片中可以出现的字符集,可根据需要修改
private char mapTable[] = { '0','1', '2', '3', '4', '5', '6', '7', '8','9' }; /**
* 功能:生成彩色验证码图片 参数width为生成图片的宽度,参数height为生成图片的高度,参数os为页面的输出流
*/
public String getCertPic(int width, int height, OutputStream os) {
if (width <= 0)
width = 60;
if (height <= 0)
height = 20;
BufferedImage image = new BufferedImage(width, height,
BufferedImage.TYPE_INT_RGB);
// 获取图形上下文
Graphics g = image.getGraphics();
// 设定背景色
g.setColor(new Color(0xDCDCDC));
g.fillRect(0, 0, width, height);
// 画边框
g.setColor(Color.black);
g.drawRect(0, 0, width - 1, height - 1);
// 取随机产生的认证码
String strEnsure = "";
// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
for (int i = 0; i < 4; ++i) {
strEnsure += mapTable[(int) (mapTable.length * Math.random())];
}
// 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
g.setColor(Color.black);
g.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
String str = strEnsure.substring(0, 1);
g.drawString(str, 8, 17);
str = strEnsure.substring(1, 2);
g.drawString(str, 20, 15);
str = strEnsure.substring(2, 3);
g.drawString(str, 35, 18);
str = strEnsure.substring(3, 4);
g.drawString(str, 45, 15);
// 随机产生10个干扰点
Random rand = new Random();
for (int i = 0; i < 10; i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
g.drawOval(x, y, 1, 1);
}
// 释放图形上下文
g.dispose();
try {
// 输出图像到页面
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
return "";
}
return strEnsure;
}
}
项目中的 验证码 尤其注意登陆时会被项目的filter类过滤排除,导致验证码加载不出来 ,需要在web.xml中 进行jsp的自定义过滤
本项目中设置filter的xml文件 和 过滤的java代码如下:
<filter>
<filter-name>BtSystemFilter</filter-name>
<filter-class>com.bettersoft.filters.BtSystemFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>BtSystemFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
HttpSession session = request.getSession();
String uri = request.getRequestURI();
String projectName = request.getContextPath();
String url=uri.substring(projectName.length());
try
{
if( uri.startsWith(projectName + "/services")
|| uri.startsWith(projectName + "/axis2-web")) //webservice
{
chain.doFilter(req, resp);
}
//过滤.jsp和.do
else if (uri.endsWith(".jsp")|| uri.endsWith(".do"))
{
//如果为系统登录类型资源不进行session检查
if((uri.equals(projectName+"/index.jsp"))
||uri.equals(projectName+"/login.jsp")
||uri.equals(projectName+"/main.jsp")
||uri.equals(projectName+"/login.do")
||uri.equals(projectName+"/showTRCA.jsp")//用证书登录时选择证书
||uri.equals(projectName+"/bindCA.jsp")//用证书登录时绑定证书
||uri.equals(projectName+"/error.jsp")
||uri.equals(projectName+"/makeCertPic.jsp")//验证码
)
{
chain.doFilter(req, resp);
}
else
{ //session失效或未登录
if (session.getAttribute("com.bettersoft.admin.userbean") == null)
{ response.sendRedirect(projectName + "/login.jsp?nologin=nologin");
}
else
{ //如果当前资源是系统菜单
if(CheckUserUtil.isSyeRes(url))
{
if(CheckUserUtil.hasPermission(request, url))
{
chain.doFilter(req, resp);
}
else
{
response.sendRedirect(projectName + "/login.jsp?nologin=invalidurl");
}
}
else
{
chain.doFilter(req, resp);
} }
}
}else
{
chain.doFilter(req, resp);
}
}
catch(Exception e)
{ e.printStackTrace();
String errormsg="未知的系统异常";
if(e.getMessage()!=null)
{
//if(e.getMessage().length()<50)
errormsg=e.getMessage();
}
request.setAttribute("errormsg",errormsg);
request.getRequestDispatcher("/error.jsp").forward(request, response);
}
}
最后的效果图