java 生成验证码 在java web开放中,有时候在项目中用到验证码,我想问问,这个验证码是怎么通过后台传递到页面中去的,又是怎么生成的?哪位兄弟有成熟的方案?告知一二,最好详细点哦! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是图形验证码的话,在JSP中设置访问地址为一个servlet,后台写一个servlet将图片以OutputStream的方式发送给页面就行了。 web.xml中配置 <!-- 验证码的servlet --> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>com.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/servlet/test</url-pattern> </servlet-mapping> <!-- 验证码的servlet结束 -->TestServlet.javapublic class CheckCodeImageServlet extends HttpServlet { private static final long serialVersionUID = 4270611773617934545L; private static final int WIDTH = 50; private static final int HEIGHT = 20; private static final int LENGTH = 4; public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); OutputStream out = response.getOutputStream(); BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB); Font mFont = new Font("Arial", Font.TRUETYPE_FONT, 18); Graphics g = image.getGraphics(); Random random = new Random(); // 设置背景颜色 g.setColor(getRandColor(100, 200)); g.fillRect(0, 0, WIDTH, HEIGHT); // 设置字体 g.setFont(mFont); //设置字体颜色 g.setColor(getRandColor(180, 250)); for (int i = 0; i < 555; i++) { int x = random.nextInt(WIDTH - 1); int y = random.nextInt(HEIGHT - 1); int xl = random.nextInt(6) + 1; int yl = random.nextInt(12) + 1; g.drawLine(x, y, x + xl, y + yl); } for (int i = 0; i < 450; i++) { int x = random.nextInt(WIDTH - 1); int y = random.nextInt(HEIGHT - 1); int xl = random.nextInt(12) + 1; int yl = random.nextInt(6) + 1; g.drawLine(x, y, x - xl, y - yl); } String sRand = ""; for (int i = 0; i < LENGTH; i++) { String tmp = getRandomChar(); while(tmp.equalsIgnoreCase("0")||tmp.equalsIgnoreCase("o") || tmp.equalsIgnoreCase("1") ||tmp.equalsIgnoreCase("i")|| tmp.equalsIgnoreCase("l") ||tmp.equalsIgnoreCase("z")||tmp.equalsIgnoreCase("2") ){ tmp = getRandomChar(); } sRand += tmp; g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110))); g.drawString(tmp, 12 * i + 1, 16); } HttpSession session = request.getSession(true); session.setAttribute("checkCode", sRand); g.dispose(); JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(image); out.close(); } private String getRandomChar() { int rand = (int) Math.round(Math.random() * 2); long itmp = 0; char ctmp = '\u0000'; switch (rand) { case 1: itmp = (long) Math.round(Math.random() * 25 + 97); ctmp = (char) itmp; return String.valueOf(ctmp); default: itmp = (long) (Math.random() * 9); return String.valueOf(itmp); } } // 设置颜色 Color getRandColor(int fc, int bc) { Random random = new Random(); fc = fc > 255 ? 255 : fc; bc = bc > 255 ? 255 : bc; 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 class CodeAction extends Action { /* * Generated Methods */ //验证码图片中可以出现的字符集,可根据需要修改 private char mapTable[]={ 'a','b','c','d','e','f', 'g','h','i','j','k','l', 'm','n','o','p','q','r', 's','t','u','v','w','x', 'y','z','0','1','2','3', '4','5','6','7','8','9'}; /** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { response.setContentType("image/jpeg"); int width=65; int 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(); ServletOutputStream os; request.getSession().setAttribute("codeVal", strEnsure); try { os = response.getOutputStream(); // 输出图像到页面 ImageIO.write(image, "JPEG", os); } catch (IOException e) { } return null; }}jsp<img id="code" src="code.do" alt="点击换一张" onclick="javascript:reloadcode()"> 到我的博客里看看是不是你想要的http://blog.csdn.net/jingyuwang1/archive/2011/05/19/6432086.aspx 有开源的:jCaptcha 和 patchca。 jfreeChart的ant javadoc生成doc文档问题 求教。 参与过(JAVA)交易平台达人进 如何中断正在运行的线程? 我的myeclipse 无法启动 apache FTP组件 listNames偶抛异常 hibernate的.lang.NullPointerException错误 JSP 中Unable to open location出错 Struts和AJAX的区别? 问一个关于ireport的问题? tomcat 6 移植到 jboss 5问题多多 请问谁有jsp分页控件
<!-- 验证码的servlet -->
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>com.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/servlet/test</url-pattern>
</servlet-mapping>
<!-- 验证码的servlet结束 -->
TestServlet.java
public class CheckCodeImageServlet extends HttpServlet { private static final long serialVersionUID = 4270611773617934545L;
private static final int WIDTH = 50;
private static final int HEIGHT = 20;
private static final int LENGTH = 4; public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream(); BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
Font mFont = new Font("Arial", Font.TRUETYPE_FONT, 18);
Graphics g = image.getGraphics();
Random random = new Random();
// 设置背景颜色
g.setColor(getRandColor(100, 200));
g.fillRect(0, 0, WIDTH, HEIGHT); // 设置字体
g.setFont(mFont); //设置字体颜色
g.setColor(getRandColor(180, 250));
for (int i = 0; i < 555; i++) {
int x = random.nextInt(WIDTH - 1);
int y = random.nextInt(HEIGHT - 1);
int xl = random.nextInt(6) + 1;
int yl = random.nextInt(12) + 1;
g.drawLine(x, y, x + xl, y + yl);
}
for (int i = 0; i < 450; i++) {
int x = random.nextInt(WIDTH - 1);
int y = random.nextInt(HEIGHT - 1);
int xl = random.nextInt(12) + 1;
int yl = random.nextInt(6) + 1;
g.drawLine(x, y, x - xl, y - yl);
} String sRand = "";
for (int i = 0; i < LENGTH; i++) {
String tmp = getRandomChar();
while(tmp.equalsIgnoreCase("0")||tmp.equalsIgnoreCase("o") || tmp.equalsIgnoreCase("1") ||tmp.equalsIgnoreCase("i")|| tmp.equalsIgnoreCase("l") ||tmp.equalsIgnoreCase("z")||tmp.equalsIgnoreCase("2") ){
tmp = getRandomChar();
}
sRand += tmp;
g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
g.drawString(tmp, 12 * i + 1, 16);
} HttpSession session = request.getSession(true);
session.setAttribute("checkCode", sRand);
g.dispose();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
} private String getRandomChar() {
int rand = (int) Math.round(Math.random() * 2);
long itmp = 0;
char ctmp = '\u0000';
switch (rand) {
case 1:
itmp = (long) Math.round(Math.random() * 25 + 97);
ctmp = (char) itmp;
return String.valueOf(ctmp);
default:
itmp = (long) (Math.random() * 9);
return String.valueOf(itmp);
}
} // 设置颜色
Color getRandColor(int fc, int bc) {
Random random = new Random();
fc = fc > 255 ? 255 : fc;
bc = bc > 255 ? 255 : bc;
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 class CodeAction extends Action {
/*
* Generated Methods
*/
//验证码图片中可以出现的字符集,可根据需要修改
private char mapTable[]={
'a','b','c','d','e','f',
'g','h','i','j','k','l',
'm','n','o','p','q','r',
's','t','u','v','w','x',
'y','z','0','1','2','3',
'4','5','6','7','8','9'};
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
response.setContentType("image/jpeg");
int width=65;
int 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();
ServletOutputStream os;
request.getSession().setAttribute("codeVal", strEnsure);
try {
os = response.getOutputStream();
// 输出图像到页面
ImageIO.write(image, "JPEG", os);
} catch (IOException e) {
}
return null;
}
}
jsp<img id="code" src="code.do" alt="点击换一张"
onclick="javascript:reloadcode()">