java编程实例
- 格式:doc
- 大小:2.24 MB
- 文档页数:55
Java SERVLET&JSP Day07Top1.验证码2.购物车(提高题选做)1 验证码1.1 问题通过Servlet生成一张图片返回给浏览器(图片是一张压缩为jpg格式的随机数图片)1.2 方案小知识如何写Java程序访问web应用?Apache提供了一个工具类http-client.jar,封装了http协议,它提供一些接口及操作可以访问web应用。
可到Apache官方下载。
图示演示验证码流程图服务器部署某个应用,该应用添加了session验证,必须登录才能访问。
1)浏览器向login.jsp发送请求,请求获得登录页面2)jsp会创建一个session对象3)Jsp返回给浏览器一个登陆页面(html、js、css),该页面包含一行代码<img src="checkCode">(checkCode是一个请求地址)4)浏览器立即给服务器发请求checkCode,访问到CheckCodeServlet5)CheckCodeServlet会生成一个随机数(验证数字),并绑定到Session对象上;6)同时,CheckCodeServlet发送给浏览器一张图片(验证数字+图片)此时,用户在浏览器上看到完全的登录页面:表单7)用户填写完表单后提交,访问LoginServlet8)LoginServlet从Session对象中取到验证数字number19)LoginServlet将number1与用户提交请求中的验证数字number2比较,如果匹配,则继续正常的登录验证,不匹配则返回给浏览器信息“验证码不匹配”案例演示<img src="checkCode">1)新建test.html2)新建CheckCodeServlet3)web.xml4)部署项目5)访问http://localhost:8080/web07/test.html服务器立即打印“servcie....”说明浏览器访问页面test.html时,在执行<img src="checkcode">语句时向服务器发送了checkcode请求1.3 实现CheckcodeServlet代码如下:1.package web;2.3.import java.awt.Color;4.import java.awt.Graphics;5.import java.awt.image.BufferedImage;6.import java.io.IOException;7.import java.io.OutputStream;8.import java.util.Random;9.10.import javax.servlet.ServletException;11.import javax.servlet.http.HttpServlet;12.import javax.servlet.http.HttpServletRequest;13.import javax.servlet.http.HttpServletResponse;14.15.import com.sun.image.codec.jpeg.JPEGCodec;16.import com.sun.image.codec.jpeg.JPEGImageEncoder;17.18.public class CheckcodeServlet extends HttpServlet {19.20.public void service(HttpServletRequest request,21. HttpServletResponse response)22.throws ServletException, IOException {23. System.out.println("service...");24.25./* 1 设置服务器返回文件的格式为jpg格式的图片 */26.//常见的还有:text/html和text/xml27. response.setContentType("image/jpeg");28.29./* 2 画图 */30.//BufferedImage:内存映象对象31. BufferedImage image =32.new BufferedImage(60,20,33. BufferedImage.TYPE_INT_RGB);34. Random r =new Random();35.//获得画笔36. Graphics g = image.getGraphics();37.//设置背景颜色38. g.setColor(new Color(39. r.nextInt(255),40. r.nextInt(255),41. r.nextInt(255)));42.//填充背景颜色43. g.fillRect(0,0,60,20);44.//设置前景颜色45. g.setColor(new Color(0,0,0));46.//生成随机数47. String number = String.valueOf(r.nextInt(99999));48.//画到图片上49. g.drawString(number,5,15);50.51./* 3 压缩图片并输出 */52.//获得字节输出流,因为要输出的是图像压缩之后53.//的字节数组,所以,不能用PrintWriter。
54. OutputStream os = response.getOutputStream();55.//将图片压缩,输出56. JPEGImageEncoder encoder =57. JPEGCodec.createJPEGEncoder(os);58. encoder.encode(image);59.}60.}隐藏web.xml代码如下:1.<?xml version="1.0" encoding="UTF-8"?>2.<web-app version="2.4"3. xmlns="/xml/ns/j2ee"4. xmlns:xsi="/2001/XMLSchema-instance"5. xsi:schemaLocation="/xml/ns/j2ee6. /xml/ns/j2ee/web-app_2_4.xsd">7.<servlet>8.<servlet-name>CheckcodeServlet</servlet-name>9.<servlet-class>web.CheckcodeServlet</servlet-class>10.</servlet>11.12.<servlet-mapping>13.<servlet-name>CheckcodeServlet</servlet-name>14.<url-pattern>/checkcode</url-pattern>15.</servlet-mapping>16.17.</web-app>隐藏test.html代码如下:1.<html>2.<head>3.<meta http-equiv="Content-Type"4. content="text/html; charset=UTF-8">5.<title>Insert title here</title>6.</head>7.<body style="font-size:30px;">8. hello<br/>9.<img src="checkcode" id="img1"/>10.</body>11.</html>隐藏访问http://localhost:8080/web07/test.html每次刷新会生成一个新的随机数增加更换验证码功能修改test.html访问http://localhost:8080/web07/test.html1.4 扩展为用户注册页面加入验证码。
1.拷贝day06的session验证案例2.修改regiest.jsp添加验证码1.<%@page pageEncoding="utf-8"2.contentType="text/html;charset=utf-8"%>3.<html>4.<head>5.<title>regist</title>6.<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">7.<link rel="stylesheet" type="text/css" href="css/style.css"/>8.</head>9.<body>10.<div id="wrap">11.<div id="top_content">12.<div id="header">13.<div id="rightheader">14.<p>15.2009/11/2016.<br />17.</p>18.</div>19.<div id="topheader">20.<h1 id="title">21.<a href="#">main</a>22.</h1>23.</div>24.<div id="navigation">25.</div>26.</div>27.<div id="content">28.<p id="whereami">29.</p>30.<h1>31.注册32.</h1>33.<form action="regist.do" method="post">34.<table cellpadding="0" cellspacing="0" border="0"35.class="form_table">36.<tr>37.<td valign="middle" align="right">38.用户名:39.</td>40.<td valign="middle" align="left">41.<input type="text"class="inputgri"42. name="username"/>43.<%44. String msg =45.(String)request.getAttribute("regist_error");46.%>47.<span style="color:red;font-style:italic;">48.<%=(msg ==null?"": msg)%>49.</span>50.</td>51.</tr>52.<tr>53.<td valign="middle" align="right">54.真实姓名:55.</td>56.<td valign="middle" align="left">57.<input type="text"class="inputgri" name="name"/>58.</td>59.</tr>60.<tr>61.<td valign="middle" align="right">62.密码:63.</td>64.<td valign="middle" align="left">65.<input type="password"class="inputgri" name="pwd"/>66.</td>67.</tr>68.<tr>69.<td valign="middle" align="right">70.性别:71.</td>72.<td valign="middle" align="left">73.男74.<input type="radio"class="inputgri"75. name="gendar" value="m" checked="checked"/>76.女77.<input type="radio"class="inputgri"78. name="gendar" value="f"/>79.</td>80.</tr>81.82.<tr>83.<td valign="middle" align="right">84.验证码:85.<img id="img1" src="checkcode"/>86.<a href="javascript:;"87. onclick="document.getElementById('img1').src88. = 'checkcode?'+Math.random();">换一张</a>89.</td>90.<td valign="middle" align="left">91.<input type="text"class="inputgri"92. name="number"/>93.</td>94.</tr>95.</table>96.<p>97.<input type="submit"class="button"98. value="确认"/>99.</p>100.</form>101.</div>102.</div>103.<div id="footer">104.<div id="footer_bg">105. ABC@106.</div>107.</div>108.</div>109.</body>110.</html>隐藏3.拷贝CheckedServlet到项目下1.package web;2.3.import java.awt.Color;4.import java.awt.Graphics;5.import java.awt.image.BufferedImage;6.import java.io.IOException;7.import java.io.OutputStream;8.import java.util.Random;9.10.import javax.servlet.ServletException;11.import javax.servlet.http.HttpServlet;12.import javax.servlet.http.HttpServletRequest;13.import javax.servlet.http.HttpServletResponse;14.import javax.servlet.http.HttpSession;15.16.import com.sun.image.codec.jpeg.JPEGCodec;17.import com.sun.image.codec.jpeg.JPEGImageEncoder;18.19.public class CheckcodeServlet extends HttpServlet {20.21.public void service(HttpServletRequest request,22. HttpServletResponse response)23.throws ServletException, IOException {24. System.out.println("service...");25.//text/html;26.//text/xml;27. response.setContentType("image/jpeg");28.//BufferedImage:内存映象对象29. BufferedImage image =30.new BufferedImage(60,20,31. BufferedImage.TYPE_INT_RGB);32. Random r =new Random();33.//获得画笔34. Graphics g = image.getGraphics();35. g.setColor(36.new Color(r.nextInt(255),37. r.nextInt(255), r.nextInt(255)));38. g.fillRect(0,0,60,20);39. g.setColor(new Color(0,0,0));40. String number = String.41.valueOf(r.nextInt(99999));42. g.drawString(number,5,15);43.44.//获得字节输出流,因为要输出的是图像压缩之后45.//的字节数组,所以,不能用PrintWriter。