目测出问题的地方有两处:
1、onload="btn.disable=false"
2、document.getElementById("btn").isDisable=true
把这两个代码删掉试试。
(1)jsp代码:<img id = "img_authcode" src="${ctx}/account/authcode" /><a href="javascript:" onclick="javascript:document.getElementById('img_authcode').setAttribute('src', '${ctx}/account/authcode?' + Math.random())">换一换</a>
(2)java代码(该代码为我自己框架代码,跟servlet写法不一样的我都给你注释了):
public View authcode() throws IOException {
HttpServletResponse response = PuffContext.getResponse()//获取response
response.setContentType("image/jpeg")
response.setHeader("Pragma", "No-cache")
response.setHeader("Cache-Control", "no-cache")
response.setDateHeader("Expires", 0)
String authCode = AuthCodeUtil.getRandom(4)//获取验证码,代码在下面(3)
System.out.println("生成随机码:" + authCode)
PuffContext.getSession().setAttribute("session_authcode", authCode)//把该验证码存储在session
ServletOutputStream output = response.getOutputStream()
AuthCodeUtil.draw(output, authCode)
output.flush()
output.close()
return ViewFactory.nullView()//返回null
}
(3)///////////////////////////下面为生成验证码类////////////////////////////////////
public class AuthCodeUtil {
private final static Random random = new Random()
// 随机字体样式
private final static int[] fontStyle = { Font.HANGING_BASELINE, Font.ITALIC, Font.LAYOUT_LEFT_TO_RIGHT, Font.LAYOUT_NO_LIMIT_CONTEXT,
Font.LAYOUT_NO_START_CONTEXT, Font.LAYOUT_RIGHT_TO_LEFT }
/**
* 画随机码图
*
* @param out
* @param width
* @param height
* @throws IOException
*/
public static void draw(OutputStream out, String value) throws IOException {
int width = 80, height = 30
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
Graphics2D g = (Graphics2D) bi.getGraphics()
g.setColor(Color.WHITE)
g.fillRect(0, 0, width, height)
g.drawRect(1, 1, width - 2, height - 2)
for (int i = 0i <10i++) {
g.setColor(randColor(150, 250))
g.drawOval(random.nextInt(110), random.nextInt(24), 5 + random.nextInt(10), 5 + random.nextInt(10))
}
int n = (int) (Math.random() * 6)
Font mFont = new Font("Arial", fontStyle[n], 23)
g.setFont(mFont)
g.setColor(randColor(10, 240))
g.drawString(value, 10, 21)// 随机数,水平距离,垂直距离
ImageIO.write(bi, "png", out)
}
private static Color randColor(int fc, int bc) {// 给定范围获得随机颜色
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)
}
public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream("d:\\aa.png")
draw(out, getRandom(4))
}
public static String getRandom(int size) {// 随机字符串
char[] c = { '1', '3', '5', '6', '7', '8', '9' }
StringBuffer sb = new StringBuffer()
for (int i = 0i <sizei++)
sb.append(c[Math.abs(random.nextInt()) % c.length])
return sb.toString()
}
}
用JavaScript来做一般情况下验证码生成于一个Servlet,直接在<img>标签中SRC一下地址就可以,所以我们可以用动态改变地址的方式来重新刷新验证码
<script language=\"JavaScript\">
function reloadImage(url)
{
document.formName.img1.src = url
}
</script>
<img name=\"img1\" src=\"http://xxx\"><a href=\"JavaScript:reloadImage(\'http://xxx\')\">刷新</a>