利用Web Service实现验证码技术

实 例说明

字母和数字混合验证码技术是网站注册和登录模块中经常用到的验证技术,开发人员可以通过验证码技术阻止用户的非法操作。本实例将通过引用Web服务实现验证码技术,实例运行效果如图16.16 所示。



关 键技术
本实例中的验证码是通过在客户端生成字符串,然后调用Web服务中的方法将字符串绘制成图片再传送到客户端网页中而实现的。在绘制验证码时,主要用到Graphics 类对象的FillRectangle 和DrawString 方法,其中FillRectangle 方法是用来绘制并填充图片所在区域矩形,而DrawString 方法则是将客户端生成的字符串绘制到图片上FillRectangle
方法的语法如下:
FillRectangle(Brush brush,int x,int y,int width,int height)
参数说明

brush:确定填充特性的Brush。

x:要填充的矩形的左上角的x坐标。
y:要填充的矩形的左上角的y坐标。
width:要填充的矩形的宽度。
height:要填充的矩形的高度。
DrawString 方法的语法如下:
DrawString(string s,Font font,Brush brush,float x,float y)
参数说明
s:要绘制的字符串。
font:它定义字符串的文本格式。
brush:它确定所绘制文本的颜色和纹理。
x:所绘制文本的左上角的x坐标。
y:所绘制文本的左上角的y坐标。

在需要验证码的页面中利用Image 控件将其显示出来,在Image 控件中显示验证码的语法如下:
<asp:Image ID="Image1" src="CheckCode.aspx" runat="server" Height="21px" Width="85px" />
注意:在加入src属性时,程序会提示“属性‘src’不是元素‘Image’的有效属性”,这不影响程序执行。

设 计过程

(1)新建一个网站,将其命名为VilidateWeb,默认主页为Default.aspx。
(2)新建一个Web应用程序Ex17_09,默认主页为Default.aspx,添加新Web 窗体CheckCode.aspx,用于
输出验证码图片,添加一个Web 服务WebService.asmx。
(3)在Default.aspx 页面中添加如表16.7 所示的控件进行页面布局及功能实现。


(4)本实例Web服务中自定义方法主要完成验证码的绘制,主要代码如下:
/// <summary>
///生成图片验证码
/// </summary>
/// <param name="nLen">验证码的长度</param>
/// <param name="strKey">输出参数,验证码的内容</param>
/// <returns>图片字节流</returns>
[WebMethod]
public byte[] CheckCodeService(int nLen, ref string strKey)
{
int nBmpWidth = 13 * nLen + 5;
int nBmpHeight = 25;
System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(nBmpWidth, nBmpHeight);
//生成随机背景颜色
int nRed, nGreen, nBlue;
//生成三原色
System.Random rd = new Random((int)System.DateTime.Now.Ticks);
nRed = rd.Next(255) % 128 + 128;
nGreen = rd.Next(255) % 128 + 128;
nBlue = rd.Next(255) % 128 + 128;
//填充背景

System.Drawing.Graphics graph = System.Drawing.Graphics.FromImage(bmp);
graph.FillRectangle(new System.Drawing.SolidBrush(System.Drawing.Color.AliceBlue), 0, 0, nBmpWidth, nBmpHeight);
//绘制干扰线条,采用比背景略深一些的颜色
int nLines = 3;
System.Drawing.Pen pen = new System.Drawing.Pen(System.Drawing.Color.FromArgb(nRed - 17, nGreen - 17, nBlue - 17), 2);
for (int a = 0; a < nLines; a++)
{
int x1 = rd.Next(nBmpWidth) ;
int y1 = rd.Next(nBmpHeight);
int x2 = rd.Next(nBmpWidth) ;
int y2 = rd.Next(nBmpHeight) ;
graph.DrawLine(pen, x1, y1, x2, y2);
}
//画图片的前景噪音点
for (int i = 0; i < 100; i++)
{
int x = rd.Next(bmp.Width);
int y = rd.Next(bmp.Height);
bmp.SetPixel(x, y, System.Drawing.Color.FromArgb(rd.Next( )));
}
//确定字体
System.Drawing.Font font = new System.Drawing.Font("Courier New",14 + rd.Next( ) % 4,System.Drawing.FontStyle.Bold);
System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(
new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Color.Blue, System.Drawing.Color. DarkRed, 1.2f, true);
graph.DrawString(strKey,font,brush,2,2);
//输出字节流
System.IO.MemoryStream stream = new System.IO.MemoryStream( );
bmp.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg);
bmp.Dispose( );
graph.Dispose( );
byte[] byteReturn = stream.ToArray( );
stream.Close( );
return byteReturn;
}
在CheckCode.aspx 页面中定义一个CheckCode 方法用于生成随机字符串,代码如下:


public string CheckCode(int length)
{
string strResult = "";
//采用的字符集,可以随机拓展,并可以控制字符出现的几率
string strCode = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Random rd = new Random( );
for (int i = 0; i < length; i++)
{
char c = strCode[rd.Next(strCode.Length)];
//随机获取字符
strResult += c.ToString( );
}
Session["CheckCode"] = strResult;
return strResult;
}
在页面CheckCode.aspx 中显示验证码的代码如下:
protected void Page_Load(object sender, EventArgs e)
{
WebService image = new WebService( );
int length = 4;
string strKey = CheckCode(length);
byte[] data = image.CheckCodeService(length, ref strKey);
Response.OutputStream.Write(data, 0, data.Length);
}

秘 笈心法
心法领悟492:Web Service 开发中注意的问题——谨慎地抛出异常。
对于Web Service中的任何异常都应该进行相应的处理。可以简单归纳为以下两种情况。
第一种情况是接口返回值是简单类型,例如,bool 型,只有true 和false 两种情况,不抛出异常怎么办?


选择有两种,一是抛出异常,二是改变接口,返回int 用1 和0对应ture 和false,用-1对应系统异常。

第二种情况是接口返回值是复杂对象,可以通过参数out string exceptionInfo 来返回异常信息。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
好的,我可以帮你实现这个系统。首先需要确定一下所使用的技术栈,我建议使用 Java Web 技术实现。具体方案如下: 1. 技术栈 - 语言:Java - Web 框架:Spring Boot - ORM 框架:MyBatis - 数据库:MySQL - 前端框架:Bootstrap、jQuery 2. 建表语句 下面是灯具管理和会员管理两个表的建表语句: ```sql -- 灯具管理表 CREATE TABLE `lamp` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '灯具名称', `price` double NOT NULL COMMENT '灯具价格', `description` varchar(200) DEFAULT NULL COMMENT '灯具描述', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='灯具管理表'; -- 会员管理表 CREATE TABLE `member` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) NOT NULL COMMENT '会员姓名', `phone` varchar(20) NOT NULL COMMENT '会员电话', `address` varchar(200) DEFAULT NULL COMMENT '会员地址', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='会员管理表'; ``` 3. 后端实现 3.1 灯具管理 我们可以通过 Spring Boot 和 MyBatis 框架来实现灯具管理的功能。首先需要定义一个实体类 `Lamp`,其属性与数据库表中的字段一一对应: ```java public class Lamp { private Integer id; private String name; private Double price; private String description; private Date createTime; private Date updateTime; // getter 和 setter 方法省略 } ``` 接着,我们需要定义一个 LampMapper 接口,用于操作数据库表 `lamp`: ```java @Mapper public interface LampMapper { List<Lamp> findAll(); Lamp findById(Integer id); void save(Lamp lamp); void update(Lamp lamp); void delete(Integer id); } ``` 上述接口中的方法分别对应着灯具的查询、新增、修改和删除操作。其中,`@Mapper` 注解表示该接口是一个 MyBatis Mapper 接口,可以通过 Spring Boot 自动扫描注册到 Spring 容器中。 最后,我们需要定义一个 LampService 类,用于封装 LampMapper 的操作,并提供给 Controller 层调用: ```java @Service public class LampService { @Autowired private LampMapper lampMapper; public List<Lamp> findAll() { return lampMapper.findAll(); } public Lamp findById(Integer id) { return lampMapper.findById(id); } public void save(Lamp lamp) { lamp.setCreateTime(new Date()); lamp.setUpdateTime(new Date()); lampMapper.save(lamp); } public void update(Lamp lamp) { lamp.setUpdateTime(new Date()); lampMapper.update(lamp); } public void delete(Integer id) { lampMapper.delete(id); } } ``` 上述代码中,`@Service` 注解表示该类是一个 Spring Service 类,可以被 Controller 层调用。`LampService` 类中的方法实现了对应的业务逻辑,例如新增灯具时需要设置灯具的创建时间和更新时间。 最后,我们需要编写一个 LampController 类,用于处理前端请求并调用 LampService 中的方法: ```java @RestController @RequestMapping("/lamp") public class LampController { @Autowired private LampService lampService; @GetMapping("/list") public List<Lamp> list() { return lampService.findAll(); } @PostMapping("/save") public void save(@RequestBody Lamp lamp) { lampService.save(lamp); } @GetMapping("/{id}") public Lamp findById(@PathVariable Integer id) { return lampService.findById(id); } @PutMapping("/{id}") public void update(@PathVariable Integer id, @RequestBody Lamp lamp) { lamp.setId(id); lampService.update(lamp); } @DeleteMapping("/{id}") public void delete(@PathVariable Integer id) { lampService.delete(id); } } ``` 上述代码中,`@RestController` 注解表示该类是一个 Spring RestController 类,可以处理前端的 Restful 请求。`@RequestMapping` 注解指定了该 Controller 中所有请求的根路径。`@GetMapping`、`@PostMapping`、`@PutMapping` 和 `@DeleteMapping` 注解分别对应着 HTTP 请求中的 GET、POST、PUT 和 DELETE 方法,用于处理前端的 Restful 请求。其中,`@RequestBody` 注解表示该方法接收的请求参数是一个 JSON 字符串。 3.2 会员管理 会员管理的实现与灯具管理类似,我们只需要定义一个 `Member` 实体类、一个 `MemberMapper` 接口和一个 `MemberService` 类,用于封装对应的业务逻辑,然后再编写一个 `MemberController` 类,用于处理前端请求并调用 `MemberService` 中的方法。 4. 前端实现 前端可以使用 Bootstrap 和 jQuery 来实现,具体实现过程不在本文的讨论范围内。 5. 总结 本文中,我们使用了 Java Web 技术栈来实现一个基于 web 的灯具销售信息管理系统。通过 Spring Boot 和 MyBatis 框架,我们实现了灯具管理和会员管理的功能,并提供了对应的 Restful API。前端可以使用 Bootstrap 和 jQuery 来实现页面展示和交互逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值