精华内容
下载资源
问答
  • src链接到生成验证码图片的servlet应用于数据回显CheckImgServletpackage com.huanfeng.cn;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt....

    135511856_1_20180611055022722

    src链接到生成验证码图片的servlet

    135511856_2_20180611055022800

    应用于数据回显

    CheckImgServletpackage com.huanfeng.cn;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.image.BufferedImage;import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.List;import java.util.Random;import javax.imageio.ImageIO;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;/*** 验证码生成程序****/public class CheckImgServlet extends HttpServlet {// 集合中保存所有成语private Listwords = new ArrayList();@Overridepublic void init() throws ServletException {// 初始化阶段,读取new_words.txt// web工程中读取 文件,必须使用绝对磁盘路径String path = getServletContext().getRealPath('/WEB-INF/new_words.txt');try {BufferedReader reader = new BufferedReader(new FileReader(path));String line;while ((line = reader.readLine()) != null) {words.add(line);}reader.close();} catch (IOException e) {e.printStackTrace();}}public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 禁止缓存// response.setHeader('Cache-Control', 'no-cache');// response.setHeader('Pragma', 'no-cache');// response.setDateHeader('Expires', -1);int width = 120;int height = 30;// 步骤一 绘制一张内存中图片BufferedImage bufferedImage = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);// 步骤二 图片绘制背景颜色 ---通过绘图对象Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔// 绘制任何图形之前 都必须指定一个颜色graphics.setColor(getRandColor(200, 250));graphics.fillRect(0, 0, width, height);// 步骤三 绘制边框graphics.setColor(Color.WHITE);graphics.drawRect(0, 0, width - 1, height - 1);// 步骤四 四个随机数字Graphics2D graphics2d = (Graphics2D) graphics;// 设置输出字体graphics2d.setFont(new Font('宋体', Font.BOLD, 18));Random random = new Random();// 生成随机数int index = random.nextInt(words.size());String word = words.get(index);// 获得成语// 定义x坐标int x = 10;for (int i = 0; i < word.length();="" i++)="" {//="" 随机颜色graphics2d.setcolor(new="" color(20="" +="" random.nextint(110),="" 20="" +="" random.nextint(110),="" 20="" +="" random.nextint(110)));//="" 旋转="" -30="" ---="" 30度int="" jiaodu="random.nextInt(60)" -="" 30;//="" 换算弧度double="" theta="jiaodu" *="" math.pi="" 180;//="" 获得字母数字char="" c="word.charAt(i);//" 将c="" 输出到图片graphics2d.rotate(theta,="" x,="" 20);graphics2d.drawstring(string.valueof(c),="" x,="" 20);graphics2d.rotate(-theta,="" x,="" 20);x="" +="30;}//" 将验证码内容保存sessionrequest.getsession().setattribute('checkcode_session',="" word);//="" 步骤五="" 绘制干扰线graphics.setcolor(getrandcolor(160,="" 200));int="" x1;int="" x2;int="" y1;int="" y2;for="" (int="" i="0;" i="">< 30;="" i++)="" {x1="random.nextInt(width);x2" =="" random.nextint(12);y1="random.nextInt(height);y2" =="" random.nextint(12);graphics.drawline(x1,="" y1,="" x1="" +="" x2,="" x2="" +="" y2);}//="" 将上面图片输出到浏览器="" imageiographics.dispose();//="" 释放资源//将图片写到response.getoutputstream()中imageio.write(bufferedimage,="" 'jpg',="" response.getoutputstream());}public="" void="" dopost(httpservletrequest="" request,="" httpservletresponse="" response)throws="" servletexception,="" ioexception="" {doget(request,="" response);}/***="" 取其某一范围的color**="" @param="" fc*="" int="" 范围参数1*="" @param="" bc*="" int="" 范围参数2*="" @return="" color*/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);}}

    135511856_3_20180611055022879

    保存验证码到session

    login.javapackage com.huanfeng.cn;import java.io.IOException;import java.sql.SQLException;import javax.servlet.ServletException;import javax.servlet.http.Cookie;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import org.apache.commons.dbutils.QueryRunner;import org.apache.commons.dbutils.handlers.BeanHandler;public class login extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding('utf-8');String checkcode=request.getParameter('checkcode');HttpSession session = request.getSession();String checkcode_session=(String) session.getAttribute('checkcode_session');if(!checkcode_session.equals(checkcode)) {request.setAttribute('loginInfo', '验证码错误');request.getRequestDispatcher('login.jsp').forward(request, response);return;}String username = request.getParameter('username');String password =request.getParameter('password');User user=login(username,password);//login是去数据库查询数据,查询到返回Userif(user!=null) {//如果user存在则重定向到index.jspresponse.sendRedirect('/index.jsp');}else {//如果user没有,则表示没有查到request.setAttribute('loginInfo','密码错误');//向request域中写入数据,让login.jsp获取到request.getRequestDispatcher('/login.jsp').forward(request,response);//用转发,因为只有转发才能让jsp获取到login。info数据}}private User login(String username, String password) {QueryRunner qr=new QueryRunner(DataSourceUtils.getDataSource());String sql='select * from user where username=? and password=?';try {User user=qr.query(sql, new BeanHandler(User.class),username,password);return user;} catch (SQLException e) {// TODO Auto-generated catch blockthrow new RuntimeException();}}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}

    135511856_4_20180611055022988

    展开全文
  • Web验证码的作用

    2011-04-07 09:48:00
    要知道如果防止,我们就要先知道暴力破解原理什么! 暴力破解就是利用程序,在短时间内按照一定的规律,来输入用户名和密码,逐个的测试! 效果如:用户名111 密码 111 ;用户名 222 密码 222 ;用户名 333 密码 ...

    我来解释一下验证码的作用!

    验证码是用来防止暴破(暴力破解)的!


    要知道如果防止,我们就要先知道暴力破解原理是什么!


    暴力破解就是利用程序,在短时间内按照一定的规律,来输入用户名和密码,逐个的测试!


    效果如:用户名111 密码 111 ;用户名 222 密码 222 ;用户名 333 密码 333。。。。。。


    比较容易破解用户名和密码简单的用户!


    验证码在每一次刷新的过程中,就会更换为其他的数字,没有任何规律,如果没有填写验证码或验证


    码不正确,系统也不用去和数据库中比对密码,直接返回,从而暴力破解无法进行。


    验证码为什么既不是图片也不是数字?


    道理很简单,如果是图片或是数字,通过查看源代码或者别的方法,可以获得验证码的信息,改进暴


    力破解程序后,仍然可以进行暴力破解。验证码是根据程序随即生成的,是用程序计算出来的信息显


    示在页面上。

    验证码的作用:有效防止这种问题对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,腾讯的QQ社区),我们利用比较简易的方式实现了这个功能。虽然登陆麻烦一点,但是对社区还来说这个功能还是很有必要,也很重要。但我们还是提醒大家主要保护自己的密码,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码。 不要因为只是来iclub问问问题,就随意设置密码,保护你自己的密码也是保护你自己,免得你的账号给人盗用给自己带来不必要的麻烦。 ~

    (1.验证码一般是防止批量注册的,人眼看起来都费劲,何况是机器。二像百度贴吧未登录发贴要输入验证码大概是防止大规模匿名回帖的发生目前,不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片, 图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

    2.一般注册用户ID的地方以及各大论坛都要要输入验证码

    3.常见的验证码

    1,四位数字,随机的一数字字符串,最原始的验证码,验证作用几乎为零。2CSDN网站用户登录用的是GIF格式,目前常用的随机数字图片验证码。图片上的字符比较中规中矩,验证作用比上一个好。没有基本图形图像学知识的人,不可破!可惜读取它的程序,在CSDN使用它的第一天,好像就在论坛里发布了,真是可怜!

    3QQ网站用户登录用的是PNG格式,图片用的随机数字+随机大写英文字母,整个构图有点张扬,每刷新一次,每个字符还会变位置呢!有时候出来的图片,人眼都识别不了,厉害啊…4MShotmail申请时候的是BMP格式, 随机数字+随机大写英文字母+随机干扰像素+随机位置。

    5GoogleGmail注册时候的是JPG格式,随机英文字母+随机颜色+随机位置+随机长度。6,其他各大论坛的是XBM格式,内容随机。

    4)意义:不少网站为了防止用户利用机器人自动注册、登录、灌水,都采用了验证码技术。所谓验证码,就是将一串随机产生的数字或符号,生成一幅图片,图片里加上一些干扰象素(防止OCR),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能使用某项功能。

    展开全文
  • 什么验证码及它的作用  验 证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码、刷票、...

    一.什么是验证码及它的作用

          验 证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答. 可以防止恶意破解密码、刷票、论坛灌水、有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录。

     

    二.图文验证码的原理

        在 servlet中随机生成一个指定位置的验证码,一般为四位,然后把该验证码保存到session中.在通过Java的绘图类以图片的形式输出该验证码。 为了增加验证码的安全级别,可以输出图片的同时输出干扰线,最后在用户提交数据的时候,在服务器端将用户提交的验证码和Session保存的验证码进行比 较。

     

    三.验证码所需的技术

           i.因为验证码中的文字,数字,应为都是可变的,故要用到随机生成数技术。

           ii.如果验证码中包含汉字,则要用到汉字生成技术.

           iii.可以使用Ajax技术实现局部刷新

           iv.可以使用图片的缩放和旋转技术,

           vi.随机绘制干扰线(可以是折现,直线等)

           vii.如果考虑到验证码的安全性,可以使用MD5加密.

    验证码模块实例

    1.编写生成英文,数字,汉字随机生成的Servlet类.源代码如下:

    Java代码  收藏代码
    1. package com.servlet;  
    2.   
    3. import java.awt.*;  
    4. import java.awt.geom.*;  
    5. import java.awt.image.*;  
    6. import java.io.*;  
    7. import java.util.*;  
    8.   
    9. import javax.servlet.ServletException;  
    10. import javax.servlet.http.HttpServlet;  
    11. import javax.servlet.http.HttpServletRequest;  
    12. import javax.servlet.http.HttpServletResponse;  
    13. import javax.servlet.http.HttpSession;  
    14. import javax.imageio.ImageIO;  
    15.   
    16. public class PictureCheckCode extends HttpServlet {  
    17.   
    18.     private static final long serialVersionUID = 1L;  
    19.   
    20.     public PictureCheckCode() {  
    21.         super();  
    22.     }  
    23.   
    24.     public void destroy() {  
    25.         super.destroy();   
    26.     }  
    27.   
    28.     public void init() throws ServletException {  
    29.         super.init();  
    30.     }  
    31.     /*该方法主要作用是获得随机生成的颜色*/   
    32.     public Color getRandColor(int s,int e){  
    33.         Random random=new Random ();  
    34.         if(s>255) s=255;  
    35.         if(e>255) e=255;  
    36.         int r,g,b;  
    37.         r=s+random.nextInt(e-s);    //随机生成RGB颜色中的r值  
    38.         g=s+random.nextInt(e-s);    //随机生成RGB颜色中的g值  
    39.         b=s+random.nextInt(e-s);    //随机生成RGB颜色中的b值  
    40.         return new Color(r,g,b);  
    41.     }  
    42.   
    43.     @Override  
    44.     public void service(HttpServletRequest request, HttpServletResponse response)  
    45.             throws ServletException, IOException {  
    46.         //设置不缓存图片  
    47.         response.setHeader("Pragma""No-cache");  
    48.         response.setHeader("Cache-Control""No-cache");  
    49.         response.setDateHeader("Expires"0);  
    50.         //指定生成的响应图片,一定不能缺少这句话,否则错误.  
    51.         response.setContentType("image/jpeg");  
    52.         int width=86,height=22;     //指定生成验证码的宽度和高度  
    53.         BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建BufferedImage对象,其作用相当于一图片  
    54.         Graphics g=image.getGraphics();     //创建Graphics对象,其作用相当于画笔  
    55.         Graphics2D g2d=(Graphics2D)g;       //创建Grapchics2D对象  
    56.         Random random=new Random();  
    57.         Font mfont=new Font("楷体",Font.BOLD,16); //定义字体样式  
    58.         g.setColor(getRandColor(200,250));  
    59.         g.fillRect(00, width, height);    //绘制背景  
    60.         g.setFont(mfont);                   //设置字体  
    61.         g.setColor(getRandColor(180,200));  
    62.           
    63.         //绘制100条颜色和位置全部为随机产生的线条,该线条为2f  
    64.         for(int i=0;i<100;i++){  
    65.             int x=random.nextInt(width-1);  
    66.             int y=random.nextInt(height-1);  
    67.             int x1=random.nextInt(6)+1;  
    68.             int y1=random.nextInt(12)+1;  
    69.             BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定制线条样式  
    70.             Line2D line=new Line2D.Double(x,y,x+x1,y+y1);  
    71.             g2d.setStroke(bs);  
    72.             g2d.draw(line);     //绘制直线  
    73.         }  
    74.         //输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。  
    75.         String sRand="";  
    76.         String ctmp="";  
    77.         int itmp=0;  
    78.         //制定输出的验证码为四位  
    79.         for(int i=0;i<4;i++){  
    80.             switch(random.nextInt(3)){  
    81.                 case 1:     //生成A-Z的字母  
    82.                      itmp=random.nextInt(26)+65;  
    83.                      ctmp=String.valueOf((char)itmp);  
    84.                      break;  
    85.                 case 2:     //生成汉字  
    86.                      String[] rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};   
    87.                      //生成第一位区码  
    88.                      int r1=random.nextInt(3)+11;  
    89.                      String str_r1=rBase[r1];  
    90.                      //生成第二位区码  
    91.                      int r2;  
    92.                      if(r1==13){  
    93.                          r2=random.nextInt(7);     
    94.                      }else{  
    95.                          r2=random.nextInt(16);  
    96.                      }  
    97.                      String str_r2=rBase[r2];  
    98.                      //生成第一位位码  
    99.                      int r3=random.nextInt(6)+10;  
    100.                      String str_r3=rBase[r3];  
    101.                      //生成第二位位码  
    102.                      int r4;  
    103.                      if(r3==10){  
    104.                          r4=random.nextInt(15)+1;  
    105.                      }else if(r3==15){  
    106.                          r4=random.nextInt(15);  
    107.                      }else{  
    108.                          r4=random.nextInt(16);  
    109.                      }  
    110.                      String str_r4=rBase[r4];  
    111.                      //将生成的机内码转换为汉字  
    112.                      byte[] bytes=new byte[2];  
    113.                      //将生成的区码保存到字节数组的第一个元素中  
    114.                      String str_12=str_r1+str_r2;  
    115.                      int tempLow=Integer.parseInt(str_12, 16);  
    116.                      bytes[0]=(byte) tempLow;  
    117.                      //将生成的位码保存到字节数组的第二个元素中  
    118.                      String str_34=str_r3+str_r4;  
    119.                      int tempHigh=Integer.parseInt(str_34, 16);  
    120.                      bytes[1]=(byte)tempHigh;  
    121.                      ctmp=new String(bytes);  
    122.                      break;  
    123.                 default:  
    124.                      itmp=random.nextInt(10)+48;  
    125.                      ctmp=String.valueOf((char)itmp);  
    126.                      break;  
    127.             }  
    128.             sRand+=ctmp;  
    129.             Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));  
    130.             g.setColor(color);  
    131.             //将生成的随机数进行随机缩放并旋转制定角度 PS.建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示  
    132.             /*将文字旋转制定角度*/  
    133.             Graphics2D g2d_word=(Graphics2D)g;  
    134.             AffineTransform trans=new AffineTransform();  
    135.             trans.rotate((45)*3.14/180,15*i+8,7);  
    136.             /*缩放文字*/  
    137.             float scaleSize=random.nextFloat()+0.8f;  
    138.             if(scaleSize>1f) scaleSize=1f;  
    139.             trans.scale(scaleSize, scaleSize);  
    140.             g2d_word.setTransform(trans);  
    141.             g.drawString(ctmp, 15*i+1814);  
    142.         }  
    143.         HttpSession session=request.getSession(true);  
    144.         session.setAttribute("randCheckCode", sRand);  
    145.         g.dispose();    //释放g所占用的系统资源  
    146.         ImageIO.write(image,"JPEG",response.getOutputStream()); //输出图片  
    147.     }  
    148. }  

     

     

     2.配置Servlet

        在web.xml中的配置如下:

     

     

    Java代码  收藏代码
    1. <?xml version="1.0" encoding="UTF-8"?>  
    2. <web-app version="2.5"   
    3.     xmlns="http://java.sun.com/xml/ns/javaee"   
    4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    6.     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
    7.   <servlet>  
    8.     <description>输出验证码</description>  
    9.     <display-name>This is the display name of my J2EE component</display-name>  
    10.     <servlet-name>PictureCheckCode</servlet-name>  
    11.     <servlet-class><span style="color: #ff0000;">com.servlet.PictureCheckCode</span></servlet-class>  
    12.   </servlet>  
    13.   
    14.   <servlet-mapping>  
    15.     <servlet-name>PictureCheckCode</servlet-name>  
    16.     <url-pattern>/<span style="color: #ff0000;">PictureCheckCode</span></url-pattern>  
    17.   </servlet-mapping>  
    18.   <welcome-file-list>  
    19.     <welcome-file>index.jsp</welcome-file>  
    20.   </welcome-file-list>  
    21. </web-app>  

     

      3.测试验证码

          可以编写JSP页面来验证是否可以输出验证码图片,JSP代码如下:

        1.index.jsp:显示界面

     

    Java代码  收藏代码
    1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
    2.   
    3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    4. <html>  
    5.     <head>  
    6.         <title>验证码</title>  
    7.         <script language="javascript">  
    8. function myReload() {  
    9.     document.getElementById("CreateCheckCode").src = document  
    10.             .getElementById("CreateCheckCode").src  
    11.             + "?nocache=" + new Date().getTime();  
    12. }  
    13. </script>  
    14.     </head>  
    15.   
    16.     <body>  
    17.         <form action="Check.jsp" method="post">  
    18.             <input name="checkCode" type="text" id="checkCode" title="验证码区分大小写"  
    19.                 size="8" ,maxlength="4" />  
    20.             <img src="PictureCheckCode" id="CreateCheckCode" align="middle">  
    21.             <a href="" οnclick="myReload()">&nbsp;看不清,换一个</a>  
    22.             <input type="submit" value="提交" />  
    23.         </form>  
    24.     </body>  
    25. </html>  

     

     

    2.Check.jsp :主要验证提交的数据是否和Session中保存的验证码是否相同

    Java代码  收藏代码
    1. <%@ page language="java" import="java.util.*" pageEncoding="gbk"%>  
    2. <html>  
    3.   <head>  
    4.     <title>验证码校验</title>  
    5.   </head>  
    6.     
    7.   <body>  
    8.     <%  
    9.         String checkcode=request.getParameter("checkCode");  
    10.         if(checkcode.equals("")||checkcode==null){  
    11.             out.print("<script>alert('请输入验证码');window.location.href('index.jsp')</script>");  
    12.         }else{  
    13.             if(!checkcode.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){  
    14.                 out.print("<script>alert('验证码不正确,请重新输入');history.back(-1);</script>");  
    15.             }else{  
    16.                 out.print("登录成功");  
    17.             }  
    18.         }  
    19.      %>  
    20.   </body>  
    21. </html>  

     

     4.工程项目结构,及运行截图 

     
                

     


    展开全文
  • Java WEB项目如何实现验证码

    万次阅读 2017-03-16 15:33:21
    什么验证码验证码的作用 验证码为全自动区分计算机和人类的图灵测试的缩写。是一种区分用户还是计算机的全自动程序,这个问题可以由计算机生成并进行判断,但是只有人类才可以解答。可以防止恶意破解密码,...

    验证基础
    一.什么是验证码及验证码的作用
    验证码为全自动区分计算机和人类的图灵测试的缩写。是一种区分用户还是计算机的全自动程序,这个问题可以由计算机生成并进行判断,但是只有人类才可以解答。可以防止恶意破解密码,刷票,论坛灌水,有效防止某个黑客对某一个特定注册用户限定程序暴力破解方式进行不断登陆。
    二.图文验证的原理
    在servlet中随机生成一个指定位置的验证码,一般是四位或者六位。然后把该验证码保存到session中,再通过java绘制类图以图片的形式输出该验证码。为了增加验证码的安全级别,可以输出图片的同时输出干扰线,最后在用户提交数据的时候,在服务器将用户提交的验证码和Session保存的验证码进行比较。
    三.验证码所需要的技术
    因为验证码中的文字,数字,应该是可变的,故要用到随机生成技术。
    如果验证码中包含数字,则要用到数字生成技术。
    可以使用Ajax技术实现局部刷新
    可以使用图片的缩放和旋转技术
    随机绘制干扰线,可以是直线,折线
    如果考虑到验证码的安全性,可以使用MD5加密
    下面是一个简单的demo,和截图:
    项目结构目录
    验证码验证页面
    验证码验证成功页面
    验证码输入有误

    1.编写生成英文字母,数字,汉字,随机生成的Servlet类,源码如下:

    package com.servlet;
    
    import java.awt.BasicStroke;
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.geom.AffineTransform;
    import java.awt.geom.Line2D;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /** 
     * @author :辰
     * 创建时间:2017-3-16 下午2:41:41 
     *  
     */
    public class PictureCheckCode extends HttpServlet {
    
        private static final long serialVersionUID = 1L;  
    
        public PictureCheckCode() {  
            super();  
        }  
    
        public void destroy() {  
            super.destroy();   
        }  
    
        public void init() throws ServletException {  
            super.init();  
        }  
        /*该方法主要作用是获得随机生成的颜色*/   
        public Color getRandColor(int s,int e){  
            Random random=new Random ();  
            if(s>255) s=255;  
            if(e>255) e=255;  
            int r,g,b;  
            r=s+random.nextInt(e-s);    //随机生成RGB颜色中的r值  
            g=s+random.nextInt(e-s);    //随机生成RGB颜色中的g值  
            b=s+random.nextInt(e-s);    //随机生成RGB颜色中的b值  
            return new Color(r,g,b);  
        }  
    
        @Override  
        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");  
            int width=86,height=22;     //指定生成验证码的宽度和高度  
            BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); //创建BufferedImage对象,其作用相当于一图片  
            Graphics g=image.getGraphics();     //创建Graphics对象,其作用相当于画笔  
            Graphics2D g2d=(Graphics2D)g;       //创建Grapchics2D对象  
            Random random=new Random();  
            Font mfont=new Font("楷体",Font.BOLD,16); //定义字体样式  
            g.setColor(getRandColor(200,250));  
            g.fillRect(0, 0, width, height);    //绘制背景  
            g.setFont(mfont);                   //设置字体  
            g.setColor(getRandColor(180,200));  
    
            //绘制100条颜色和位置全部为随机产生的线条,该线条为2f  
            for(int i=0;i<100;i++){  
                int x=random.nextInt(width-1);  
                int y=random.nextInt(height-1);  
                int x1=random.nextInt(6)+1;  
                int y1=random.nextInt(12)+1;  
                BasicStroke bs=new BasicStroke(2f,BasicStroke.CAP_BUTT,BasicStroke.JOIN_BEVEL); //定制线条样式  
                Line2D line=new Line2D.Double(x,y,x+x1,y+y1);  
                g2d.setStroke(bs);  
                g2d.draw(line);     //绘制直线  
            }  
            //输出由英文,数字,和中文随机组成的验证文字,具体的组合方式根据生成随机数确定。  
            String sRand="";  
            String ctmp="";  
            int itmp=0;  
            //制定输出的验证码为四位  
            for(int i=0;i<4;i++){  
                switch(random.nextInt(3)){  
                case 1:     //生成A-Z的字母  
                    itmp=random.nextInt(26)+65;  
                    ctmp=String.valueOf((char)itmp);  
                    break;  
                case 2:     //生成汉字  
                    String[] rBase={"0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"};   
                    //生成第一位区码  
                    int r1=random.nextInt(3)+11;  
                    String str_r1=rBase[r1];  
                    //生成第二位区码  
                    int r2;  
                    if(r1==13){  
                        r2=random.nextInt(7);     
                    }else{  
                        r2=random.nextInt(16);  
                    }  
                    String str_r2=rBase[r2];  
                    //生成第一位位码  
                    int r3=random.nextInt(6)+10;  
                    String str_r3=rBase[r3];  
                    //生成第二位位码  
                    int r4;  
                    if(r3==10){  
                        r4=random.nextInt(15)+1;  
                    }else if(r3==15){  
                        r4=random.nextInt(15);  
                    }else{  
                        r4=random.nextInt(16);  
                    }  
                    String str_r4=rBase[r4];  
                    //将生成的机内码转换为汉字  
                    byte[] bytes=new byte[2];  
                    //将生成的区码保存到字节数组的第一个元素中  
                    String str_12=str_r1+str_r2;  
                    int tempLow=Integer.parseInt(str_12, 16);  
                    bytes[0]=(byte) tempLow;  
                    //将生成的位码保存到字节数组的第二个元素中  
                    String str_34=str_r3+str_r4;  
                    int tempHigh=Integer.parseInt(str_34, 16);  
                    bytes[1]=(byte)tempHigh;
                    /**
                     * 汉字显示
                     */
                    //              ctmp=new String(bytes);  
                    ctmp = new String(bytes,"gb2312");
                    break;  
                default:  
                    itmp=random.nextInt(10)+48;  
                    ctmp=String.valueOf((char)itmp);  
                    break;  
                }  
                sRand+=ctmp;  
                Color color=new Color(20+random.nextInt(110),20+random.nextInt(110),random.nextInt(110));  
                g.setColor(color);  
                //将生成的随机数进行随机缩放并旋转制定角度 PS.建议不要对文字进行缩放与旋转,因为这样图片可能不正常显示  
                /*将文字旋转制定角度*/  
                Graphics2D g2d_word=(Graphics2D)g;  
                AffineTransform trans=new AffineTransform();  
                trans.rotate((45)*3.14/180,15*i+8,7);  
                /*缩放文字*/  
                float scaleSize=random.nextFloat()+0.8f;  
                if(scaleSize>1f) scaleSize=1f;  
                trans.scale(scaleSize, scaleSize);  
                g2d_word.setTransform(trans);  
                g.drawString(ctmp, 15*i+18, 14);  
            }  
            HttpSession session=request.getSession(true);  
            session.setAttribute("randCheckCode", sRand);  
            g.dispose();    //释放g所占用的系统资源  
            ImageIO.write(image,"JPEG",response.getOutputStream()); //输出图片  
        }  
    
    }
    

    web.xml文件配置:

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="2.5" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
      <display-name></display-name>
    
      <servlet>
        <servlet-name>PictureCheckCode</servlet-name>
        <servlet-class>com.servlet.PictureCheckCode</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>PictureCheckCode</servlet-name>
        <url-pattern>/PictureCheckCode</url-pattern>
      </servlet-mapping>    
    
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    

    3.测试验证码,编写JSP页面来验证是否可以输出验证图片,JSP代码如下:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
    <html>  
        <head>  
            <title>验证码</title>  
            <script language="javascript">  
    function myReload() {  
        document.getElementById("CreateCheckCode").src = document  
                .getElementById("CreateCheckCode").src  
                + "?nocache=" + new Date().getTime();  
    }  
    </script>  
        </head>  
    
        <body>  
            <form action="Check.jsp" method="post">  
                <input name="checkCode" type="text" id="checkCode" title="验证码区分大小写"  
                    size="8" ,maxlength="4" />  
                <img src="PictureCheckCode" id="CreateCheckCode" align="middle">  
                <a href="" onclick="myReload()"> 看不清,换一个</a>  
                <input type="submit" value="提交" />  
            </form>  
        </body>  
    </html> 

    Check.jsp,主要验证提交的数据是否和session中保存的验证码是否一致

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
    <html>  
      <head>  
        <title>验证码校验</title>  
      </head>  
    
      <body>  
        <%  
            String checkcode=request.getParameter("checkCode");  
            if(checkcode.equals("")||checkcode==null){  
                out.print("<script>alert('请输入验证码');window.location.href('index.jsp')</script>");  
            }else{  
                if(!checkcode.equalsIgnoreCase((String)session.getAttribute("randCheckCode"))){  
                    out.print("<script>alert('验证码不正确,请重新输入');history.back(-1);</script>");  
                }else{  
                    out.print("登录成功");  
                }  
            }  
         %>  
      </body>  
    </html> 

    一个简单的验证码登陆完成了。
    参考文章参考文章

    展开全文
  • 破解的具体过程,运用的工具,破解的原理,如何去破解,可以利用什么样的东西,以及破解的完整操作。
  • 验证码web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对框架很熟...
  • jsp实现验证码

    2016-08-27 23:18:00
    web开发领域里面,验证码是一个比较常见的功能,而归根到底,验证码其实就是一组随机数,或者是一个随机算术 一、基本知识 1、为什么需要验证码验证码,很多时候出现在注册页面或者登陆界面,在这些页面中有...
  • 开发必学的验证码,教你从零用Python写一个验证码

    千次阅读 多人点赞 2019-08-31 07:58:09
    验证码web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。 那你知道验证码生成的原理吗?所谓知其然,还要知其所以然。面试中,面试官不会因为你对...
  • 这周一写了一篇《2000字谏言,给那些想学Python的人,...验证码web开发中不可缺少的元素,而python又提供了非常多的验证码模块帮助大家快速生成各种验证码。 那你知道验证码生成的原理吗?所谓知其然,还要知其所...
  • 用Kaptcha第三方包做验证码验证

    千次阅读 2017-10-12 09:17:26
    他是运行原理验证码存放到session域中,当用到的时候,从session域中取出来,然后与输入的验证码进行对比,就可以了。接下来,来看代码。 首先,先导入kaptcha-2.3.2.jar包。之后再web.xml中配置验证码需要的信息...
  • 本文例子通俗易懂,主要讲述了 各种漏洞 的原理及防护,相比网上其它的web安全入门文章来说,本文更丰富,更加具有实战性和趣味性。 本文讲解目录大致如下,讲述什么是暴力破解、xss、csrf、挂马等原理及对应的...
  • 本文例子通俗易懂,主要讲述了各种漏洞 的原理及防护,相比网上其它的web安全入门文章来说,本文更丰富,更加具有实战性和趣味性。 本文讲解目录大致如下,讲述什么是暴力破解、xss、csrf、挂马等原理及对应的防护...
  • 文章目录1....2. 为什么要用token验证,不用session?2.1 Session会话2.2 Session会话的弊端2.3 token令牌机制2.4 token如何... 存放验证码3.1 将验证码存放在Session中3.2 将验证码存放在redis中4. 存放标识用户信息的tok
  • 暴力破解的概念及原理 测试流程 基于表单的暴力破解实验 对于不安全验证码的破解 对于token是否真的可以做到防暴力破解 防范措施 1. 什么是暴力破解 “暴力破解”是一攻击具手段,在web攻击中,一般会使用这种手段...
  • Python web框架面试题

    2019-03-03 16:03:10
    1.Django中当一个用户登录A应用服务器(进入登录状态),然后下次请求被Nginx代理到B应用服务器会出现什么影响? 如果用户在A应用服务器登陆session数据没有共享到B应用服务器,那么你之前的登陆状态就没有了 2....
  • 3. CSRF的原理3.1 举例描述原理3.1.1 示例1:3.1.2 示例2:3.1.3 示例3:4. CSRF的防御4.1 服务端进行CSRF防御4.1.1 token4.1.1.1 Cookie Hashing(所有表单都包含同一个伪随机值):4.1.1.2 验证码4.1.1.3 One-Time ...
  • 动手体验:了解WEB服务器设置实体内容的MIME类型的原理 3.6.9 Expires 135 3.6.10 Last-Modified 135 3.7 扩展头 136 3.7.1 Refresh 136 3.7.2 Content-Disposition 136 3.8 思考与实践 137 第4章 Servlet开发基础 ...
  • 甚至目前web端mvvm应用,如angular、vue、react都使用了jwt方式,也就是不再使用cookie和session作为登录状态。有很多作为这种无状态http的身份登录状态方法,原理也差不多,无非就是获得客户端的标识,把服务器的...
  • JavaWeb知识梳理

    2020-12-07 18:41:00
    JavaWebWeb服务器技术讲解Web服务器TomcatHttpMavenpom.xmlServletHelloServletServlet原理MappingServletContextHttpServletResponse下载文件验证码功能实现重定向HttpServletRequestCookie, ...JSTL标签...
  • Servlet服务器端程序

    2021-02-16 21:46:13
    文章目录Servlet简介HelloServletServlet原理Mapping问题ServletContext对象1、数据共享2、获取初始化参数3、请求转发4、读取资源文件HttpServletResponse1、简单分类2、下载文件3、验证码功能4、实现重定向...
  • 说说 XSRF 防范

    2017-09-17 12:35:27
    XSRF(CSRF) 攻击的原理什么?就是攻击者能猜测出所有的需要提交的内容以及类型,所以所有的解决方案共同出发点就是加一个攻击者也不知道随机值发送给后端验证就可以防范。 有很多解决方案,cookie-session,很不...
  • 文章目录JavaWeb——HttpServletResponse对象什么是HttpServletResponseHttpServletResponse中的方法HttpServletResponse的常见应用1.向浏览器输出消息2.下载文件3.Response验证码实现4.实现重定向重定向(Redirect...
  • App

    2020-11-02 10:27:58
    其实只要web存在得漏洞,app也都存在,比如:sql注入、验证码绕过、越权、支付漏洞、csrf、变量覆盖、反序列化、文件包含、ssrf、xxe、文件上传等。那么渗透测试的核心就是控制传参(把控传参),只有传参了,产生...

空空如也

空空如也

1 2 3
收藏数 56
精华内容 22
关键字:

web验证码什么原理