url重写实现session跟踪和一次性验证码的实现

来源:互联网 发布:沙发推荐 知乎 编辑:程序博客网 时间:2024/05/16 09:58

url重写实现session跟踪和一次性验证码的实现

利用URL重写实现Session跟踪

1、   Servlet规范中引入了一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。这种补充机制要求在响应消息的实体内容中必须包含下一次请求的超链接,并将会话标识号作为超链接的URL地址的一个特殊参数。

2、 将会话标识号以参数形式附加在超链接的URL地址后面的技术称为URL重写。如果在浏览器不支持Cookie或者关闭了Cookie功能的情况下,WEB服务器还要能够与浏览器实现有状态的会话,就必须对所有可能被客户端访问的请求路径(包括超链接、form表单的action属性设置和重定向的URL)进行URL重写。

3、 HttpServletResponse接口中定义了两个用于完成URL重写方法:

(1)、encodeURL方法

(2)、encodeRedirectURL方法

利用Session实现一次性验证码——>原理

1、   一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码,其原理与利用Session防止表单重复提交的原理基本一样,只是将表单标识号变成了验证码的形式,并且要求用户将提示的验证码手工填写进一个表单字段中,而不是通过表单的隐藏字段自动回传给服务器。

2、 服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。

3、 密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。

验证码的实现

package com.csdn.session;

 

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.io.PrintWriter;

 

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class CheckCodeServlet extendsHttpServlet {

 

                            publicCheckCodeServlet() {

              super();

       }

       publicvoid destroy() {

              super.destroy();// Just puts "destroy" string in log

                     }

       privatestatic int WIDTH=60;

       privatestatic int HEIGHT=20;

       publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

                     throwsServletException, IOException {

 

              response.setContentType("image/jpeg");

              ServletOutputStreamout=response.getOutputStream();

              //PrintWriterout = response.getWriter();

              HttpSessionsession=request.getSession();

              response.setHeader("Pragma","no-cache");

              response.setHeader("Cache-Controll","no-cache");

              response.setIntHeader("Expires",0);

              //背景

              BufferedImagebi=new BufferedImage(WIDTH,HEIGHT,BufferedImage.TYPE_INT_ARGB);

              Graphicsg=bi.getGraphics();       

              //g.drawLine(0,0, 10,10);

              drawBackground(g);

              //随机产生验证码

              char[] rands=generateCheckCode();

              drawRands(g,rands);

              ByteArrayOutputStreambos=new ByteArrayOutputStream();

              ImageIO.write(bi,"JPEG", bos);

              byte[]buf=bos.toByteArray();//将bi对象里面的内容转换成了一个字节数组

              out.write(buf);

              response.setContentLength(buf.length);

              session.setAttribute("checkCode",newString(rands));

              out.flush();

              out.close();

       }

       privatevoid drawRands(Graphics g,char[] rands){

              g.setColor(Color.black);

              g.setFont(newFont(null,Font.ITALIC|Font.BOLD,18));

              g.drawString(""+rands[0],1, 17);

              g.drawString(""+rands[1],16, 18);

              g.drawString(""+rands[2],32, 16);

              g.drawString(""+rands[3],46, 17);

              System.out.println(newString(rands));

       }

       privatechar[] generateCheckCode(){

              Stringchars="0123456789abcdefghijklmnopqrstuvwxyz";

              charrands[]=new char[4];

              for(inti=0;i<4;i++){

                     intrandom=(int)(Math.random()*36);

                     rands[i]=chars.charAt(random);

              }

              returnrands;

       }

       privatevoid drawBackground(Graphics g){

              g.setColor(newColor(0xDCDC));

              g.fillRect(0,0, WIDTH, HEIGHT);

              for(inti=0;i<120;i++){

                     intx=(int)(Math.random()*WIDTH);

                     inty=(int)(Math.random()*HEIGHT);

                    

                     intred=(int)(Math.random()*255);

                     intgreen=(int)(Math.random()*255);

                     intblue=(int)(Math.random()*255);

                     g.setColor(newColor(red,green,blue));

                     g.drawOval(x,y, 1, 0);

              }

       }

       publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

                     throwsServletException, IOException {

                     doGet(request,response);

       }

       publicvoid init() throws ServletException {

              //Put your code here

       }

 

}