java验证码的实现原理_web技术开发:网站的验证码的验证原理是什么?怎么实现的?...

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值