添加登录验证码功能,防止恶意访问!

通过Session与request交互使用,相互传值验证,注意一点,为了性能更加,应该先进行验证码数据验证操作,再进行数据库存储验证等操作!详情看代码:

这里是登录界面

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//告诉浏览器用UTF-8解析
	response.setContentType("text/html ;charset=utf-8");
	//字符编码是以UTF-8,通常结合使用更好
	response.setCharacterEncoding("utf-8");
	PrintWriter out = response.getWriter();
	//返回一个界面
	String id="";
	//从Cookie中选中keep cookie
	Cookie cookies[]=request.getCookies();
	if(cookies!=null){
		for(Cookie cookie:cookies){
			if(cookie.getName().equals("id")){
				id=cookie.getValue();
			}
		}
	}
	out.println("<img src='imgs/333.gif'/><hr/>");
	out.println("<h1>用户登录</h1>");
	//action应该这样写    /web应用名/Servlet的url
	out.println("<form  action ='/UserManager2/LoginClServlet'  method='post'>");
	out.println("用户id:<input type='text' name='id' value='"+id+"'/></br>");
	out.println("密 &nbsp&nbsp码:<input type='password' name='password'/></br>");
	out.println("<input type='checkbox'  name='iskeepinfo' value='keep'/>在此电脑保留登录信息</br>");
	out.println("验证码:<input type='text'  name='checkcode'  width=50px/><img src='/UserManager2/CreateCode'/></br>");
	out.println("<input type='submit'  value='登录'/></br>");
	out.println("</form>");
	
	String errInfo=(String) request.getAttribute("err");
	if(errInfo!=null){
		out.println("<font color='red'>"+errInfo+"</font>");
	}
	out.println("<hr/><img src='imgs/111.gif' />");
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	this.doGet(request, response);
}

}
`

这里生成验证码

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	// .禁止浏览器缓存随机图片
			response.setDateHeader("Expires", -1);
			response.setHeader("Cache-Control", "no-cache");
			response.setHeader("Pragma", "no-cache");
			// .通知客户机以图片方式打开发送过去的数据
			response.setHeader("Content-Type", "image/jpeg");
			// .在内存中创建一副图片
			BufferedImage image = new BufferedImage(60, 30,
					BufferedImage.TYPE_INT_RGB);
			// .向图片上写数据
			Graphics g = image.getGraphics();
			// 设背景色
			g.setColor(Color.BLACK);
			g.fillRect(0, 0, 60, 30);
			// .设置写入数据的颜色和字体
			g.setColor(Color.RED);
			g.setFont(new Font(null, Font.BOLD, 20));
			// 向图片上写数据
			String num = makeNum();
			//这句话就是把随机生成的数值,保存到session
			request.getSession().setAttribute("checkcode", num); 
			//通过session就可以直接去到随即生成的验证码了
			g.drawString(num, 0, 20);
			// 5.把写好数据的图片输出给浏览器
			ImageIO.write(image, "jpg", response.getOutputStream());
		}
		//该函数时随机生成7位数字
		public String makeNum() {
			Random r = new Random();
			//9999999 可以生成7位
			String num = r.nextInt(9999) + ""; 
			StringBuffer sb = new StringBuffer();
			//如果不够4位,前面补零
			for (int i = 0; i < 4 - num.length(); i++) {
				sb.append("0");
			}
			num = sb.toString() + num;
			return num;
	
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	this.doGet(request, response);
}

}
`

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值