jdbc+servlet+jsp员工信息管理(二):注册页面中简单的验证码

news/2024/5/19 1:46:21 标签: jsp, jdbc, servlet, 验证码

源码https://download.csdn.net/download/qq_39192827/10912080

验证码如何实现?简单来说就是用户输入字符与后台随机生成的字符进行对比,不过是在网页上要显示经过图像处理的验证码

由于这其中有一个前后台信息传递的过程,所以需要一个独立的servlet组件并通过session来传递信息

 

在CheckCodeServlet我们首先需要一个随机生成多个字符的方法

public static String getNumber(int n){
	String str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
	String number ="";
	Random ran = new Random();
	for(int i = 0 ;i<n;i++){
		number+=str.charAt(ran.nextInt(str.length()));
	}
	return number;
}

然后就是生成经过图像处理的验证码发送给网页,并且验证码放在session里

service方法:

public void service(HttpServletRequest request, HttpServletResponse response)
			                                throws ServletException, IOException {
	BufferedImage image = new BufferedImage(80, 30,BufferedImage.TYPE_INT_RGB);
	Graphics  g = image.getGraphics();
	Random r = new Random();
	g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255))); //rgb随机生成颜色
	g.fillRect(0, 0, 80, 30);
	g.setColor(new Color(0,0,0));
	g.setFont(new Font(null,Font.BOLD,30));  //验证码图片字体
	String number = getNumber(4); //随机4位验证码
	HttpSession session = request.getSession();  //获取session
    session.setAttribute("number", number);   //绑定在session中
	g.drawString(number, 1, 24);
	for(int i=0;i<10;i++){   //随机在图片上划线
		g.setColor(new Color(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
		g.drawLine(r.nextInt(80),r.nextInt(30),r.nextInt(80),r.nextInt(30));
	}
	response.setContentType("image/jpeg");
	OutputStream os = response.getOutputStream();
	javax.imageio.ImageIO.write(image, "jpeg", os);
}

 

 

web.xml

  <servlet>
  	<servlet-name>img</servlet-name>
  	<servlet-class>com.hyxy.web.CheckCodeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>img</servlet-name>
  	<url-pattern>/image</url-pattern>
  </servlet-mapping>

 

regist.jsp

<td valign="middle" align="right">
	验证码
	<img id="num" src="image" onclick="document.getElementById('num').src = 'image?'+(new Date()).getTime()"/>
	<a href="javascript:;" onclick="document.getElementById('num').src = 'image?'+(new Date()).getTime()">换一张</a>

</td>

<td valign="middle" align="left">
	<input type="text" class="inputgri" name="number" />
</td>

效果:

接着就是点击提交按钮后验证码的对比,上面的代码都是在一个action为register.user的表单里

UserServlet中获取session中的验证码和用户输入的验证码进行对比:

部分代码:

if("/emp_v4/register.user".equals(uri)){
	String input=req.getParameter("number");  //用户输入的验证码
	String msg=null;
	String number=(String)session.getAttribute("number");  //session中正确的验证码
	if(!number.equalsIgnoreCase(input)){
		msg="CheckCodeWrong";
	}
    if(msg!=null){
		req.setAttribute("msg", msg);
		rq=req.getRequestDispatcher("regist.jsp");
		rq.forward(req, res);
	}
}

如果输入的验证码错误,向注册页面发送信息并跳转

register.jsp

<c:if test="${msg=='CheckCodeWrong'}">验证码错误</c:if>

别忘了web.xml

 <servlet>
  	<servlet-name>img</servlet-name>
  	<servlet-class>com.hyxy.web.CheckCodeServlet</servlet-class>
 </servlet>
 <servlet-mapping>
  	<servlet-name>img</servlet-name>
  	<url-pattern>/image</url-pattern>
 </servlet-mapping>

 

注意要理清楚后台生成的验证码是在session中,用户输入的验证码在request中


http://www.niftyadmin.cn/n/1033216.html

相关文章

SM37删除增强

标准操作SM37删除已释放的JOB 在表tbt*相关的主数据表中查询不到&#xff0c;是因为删除操作是直接从DB表中删除记录的。 记录删除作业日志&#xff0c;考虑在删除表的最后增加自定义表存储。 函数&#xff1a;BP_JOB_DELETE 增加隐式增强 在这里插入代码片DATA LT_DEL_SM37 T…

Java并发编程:阻塞队列ArrayBlockingQueue

目录 一、为什么需要阻塞队列 二、阻塞队列接口BlockingQueue 三、ArrayBlockingQueue的实现原理 1、成员变量 2、构造器 3、几个重要的方法 四、使用阻塞队列实现生产者-消费者模式 注&#xff1a;jdk1.7 一、为什么需要阻塞队列 我们之前都学过队列&#xff0c;如Ar…

后台job批量停用和开启

在SAP中如需要暂停后台工作时&#xff0c;用SE38或SA38执行程序BTCTRNS1&#xff0c;即可暂停后台工作任务 要重新打开后台工作任务时&#xff0c;需要用SE38或SA38执行程序&#xff1a; BTCTRNS2 补充说明&#xff1a; 可以选择只禁用自开发的JOB&#xff0c;因为一些标准的S…

ACDOCA字段映射关系

Comments Field AWKEY in BSEG/COEP is the concatenation of ACDOCA-AWREF and ACDOCA-AWORG If the CO area is using a 10/70 currency setting, i.e. object currencies are used, COEP-WOGBTR and OWAER map to ACDOCA-CO_OSL and RCO_OCUR. -BSEG/COEP中的字段AWKEY是ACD…

Java并发编程:阻塞队列LinkedBlockingQueue

Java并发编程&#xff1a;阻塞队列(一)ArrayBlockingQueue 我们都知道ArrayList和LinkedLsit的区别&#xff0c;其实LinkedBlockingQueue和ArrayBlockingQueue之间也存在着类似的区别。因为它们都显现接口BlockingQueue并继承自Queue接口&#xff0c;所以LinkedBlockingQueue和…

Java并发编程:Lock接口

目录 一、synchronized的不足之处 二、Lock类 三、多线程如何正确上锁 在之前阻塞队列的底层源码中&#xff0c;有一个ReentrantLock类的锁来控制访问&#xff0c;并且有两个Condition类的条件对象(notEmpty和notFull)用来存放阻塞进程。ReentrantLock类其实是Lock接口的实现…

VK11\VK12\VK13 价格间隔拆分问题

BAPI_PRICES_CONDITIONS 修改价格存在BUG 不会自动拆分时间间隔&#xff0c;而是插入新的一条&#xff0c;导致同个有效期内有多条记录存在&#xff0c;VK13debug, 网上查了一下资料&#xff0c;有说明要程序中处理拆分多条间隔传入BAPI参数中&#xff0c;感觉比较麻烦,代码量…

通俗理解TCP/IP,HTTP,REST,SOAP

概念 国际标准化组织(ISO)定义了网络协议的基本框架&#xff0c;被称为OSI(开放系统互联)模型。 要制定通讯规则&#xff0c;内容会很多&#xff0c;比如要考虑A电脑如何找到B电脑&#xff0c;A电脑在发送信息 给B电脑时是否需要B电脑进行反馈&#xff0c;A电脑传送给B电脑的数…