介绍
这篇文章运用简单易懂的例子给大家介绍java实现原生动态生成验证码,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
<强>需求描述:强>为了防止脚本多次请求,很多时候在注册会用到验证码,我们用java实现一个图片验证的二维码。
<强>项目结构强>
包lhw.wanlin.checkimg; 进口javax.imageio.ImageIO; 进口javax.servlet.ServletException; 进口javax.servlet.annotation.WebServlet; 进口javax.servlet.http.HttpServlet; 进口javax.servlet.http.HttpServletRequest; 进口javax.servlet.http.HttpServletResponse; 进口java.awt。*; 进口java.awt.image.BufferedImage; 进口java.io.BufferedReader; 进口java.io.FileNotFoundException; 进口java.io.FileReader; 进口java.io.IOException; 进口java.util.ArrayList; 进口并不知道; 进口java.util.Random; @WebServlet (name=癈heckServlet") 公开课CheckServlet扩展HttpServlet {//集中保存所有成语 私人List,字=new ArrayList<的在(); @Override 公共空间init()抛出ServletException {//初始化阶段,读取new_words.txt//网络工程中读取文件,必须使用绝对磁盘路径 字符串路径=getServletContext () .getRealPath (“/web - inf/new_words.txt"); 尝试{ BufferedReader br=new BufferedReader(新FileReader(路径)); 字符串行; 在((=br.readLine行())!=null) { words.add(线); } br.close (); }捕捉(FileNotFoundException e) { e.printStackTrace (); }捕捉(IOException e) { e.printStackTrace (); } } 保护无效doPost (HttpServletRequest请求,HttpServletResponse响应)抛出ServletException IOException { 这一点。doGet(请求、响应); } 保护无效doGet (HttpServletRequest请求,HttpServletResponse响应)抛出ServletException IOException {//禁止缓存//response.setHeader (“Cache-Control",“no-cache");//response.setHeader (“Pragma",“no-cache");//response.setDateHeader (“Expires", 1); System.out.println(单词); int宽度=120; int高度=30;//步骤一绘制一张内存中图片 BufferedImage BufferedImage=new BufferedImage(宽度、高度, BufferedImage.TYPE_INT_RGB);//步骤二图片绘制背景颜色- - -通过绘图对象 图形图像=bufferedImage.getGraphics();//得到画图对象- - -画笔//绘制任何图形之前都必须指定一个颜色 图形。改变颜色(getRandColor (200、250)); 图形。fillRect(0, 0,宽度、高度);//步骤三绘制边框 graphics.setColor (Color.WHITE); 图形。宽度绘制矩形(0,0,- 1,- 1)高度;//步骤四四个随机数字 Graphics2D Graphics2D=(Graphics2D)图形;//设置输出字体 graphics2d。setFont(新字体(“宋体“,字体。大胆、18)); 随机随机=new随机();//生成随机数 int指数=random.nextInt (words.size ()); 字符串文字=words.get(指数);//获得成语//定义x坐标 int x=10; for (int i=0;我& lt;word.length ();我+ +){//随机颜色 graphics2d。改变颜色(新颜色(20 + random.nextInt(110), 20 +随机的 20 + random.nextInt .nextInt (110), (110)));//旋转-30 - 30度 int jiaodu=random.nextInt (60) - 30;//换算弧度 双θ=jiaodu *数学。π/180;//获得字母数字 字符c=word.charAt(我);//将c输出到图片 graphics2d。旋转(θ,x, 20); graphics2d.drawString (String.valueOf (c), x, 20); graphics2d。旋转(θ,x, 20); x +=30; }//将验证码内容保存会话 request.getSession () .setAttribute (“checkcode_session"、文字);//步骤五绘制干扰线 图形。改变颜色(getRandColor (160、200)); int x1; int x2; int y?; int y2; for (int i=0;我& lt;30;我+ +){ x1=random.nextInt(宽度); x2=random.nextInt (12); 日元=random.nextInt(高度); y2=random.nextInt (12); 图形。画直线(x1, y1, x1 + x2, y2 x2 +); }//将上面图片输出到浏览器ImageIO graphics.dispose();//释放资源//将图片写到response.getOutputStream()中 ImageIO。写(bufferedImage,“jpg" response.getOutputStream ()); }/* * *取其某一范围的颜色 * * @param fc * int范围参数1 * @param公元前 * int范围参数2 * @return颜色 */私人颜色getRandColor(公元前int fc, int) {//取其随机颜色 随机随机=new随机(); 如果(fc祝辞255){ fc=255; } 如果(公元前比;255){ 公元前=255; } int r=fc +随机的。nextInt (bc - fc); int g=fc +随机的。nextInt (bc - fc); int b=fc +随机的。nextInt (bc - fc); 返回新颜色(r, g, b); } } java实现原生动态生成验证码