利用HttpSession保存验证码和重复提交表单(案例)

一、HttpSession概述及原理探讨
得到HttpSession对象:
HttpServletRequest.getSession():根据特殊Cookie(JSESSIONID=HttpSession对象的id,由服务器生成,唯一的)的取值,在服务器的内存中根据id查找
这个HttpSession对象,找到了,取出来继续服务;没有找到,创建一个新的HttpSession对象。
HttpServletRequest.getSession(boolean b):如果b为true,与上面方法功能完全一致。如果为false,只查询。

二、HttpSession案例:
1、完成用户的一次性登录(随机验证码验证)
画验证码核心代码如下:
int width=120;
int height=25;
BufferedImage image=new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
g.setColor(Color.BLUE);
g.drawRect(0, 0, width, height);
g.setColor(Color.yellow);
g.fillRect(1, 1, width-2, height-2);
g.setColor(Color.black);
Random r=new Random();
for(int i=0;i<10;i++){
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
}
g.setColor(Color.red);
g.setFont(new Font("宋体",Font.ITALIC,20));
int x=23;
StringBuffer sb=new StringBuffer();
for(int i=0;i<4;i++){
int num=r.nextInt(10);
g.drawString(num+"",x,20 );
x+=20;
sb.append(num);
}
String code=sb.toString();
request.getSession().setAttribute("code", code);
ImageIO.write(image, "jpg", response.getOutputStream());
在引用的时候跟图片一样,src="验证码程序的路径即可"。
2、防止表单的重复提交(Base64编码)
Base64编码原理:把3个字节转换为4个字节
1010 1100    0101 1111     1010 0101
转成4个字节   0010 1011    0000    0101   0011 1110   0010 0101
转成4个字节后,每一个字节表示的最大和最小数:00111111 ~  00000000
63~0共64个整数,所以称之为Base64,它其实是一个码表,每个数字对应一个可见字符
java.util.UUID:通用的唯一标识符
参考核心代码如下:(如下代码我是直接在servlet里面写的)
代码1:response.setContentType("text/html;charset=UTF-8");
long num=System.currentTimeMillis()+new Random().nextInt();
String token=MD5Util.encode(num+"") ;
request.getSession().setAttribute("token", token);
PrintWriter out=response.getWriter();
out.write("<form id= 'f1' action='/Day07/servlet/AddServlet' method='post'>");
out.write("用户名:<input type='text' name='username'/>");
out.write("<input id='btn1' type='button' value='保存' οnclick='toSubmit()'/>");
out.write("<input  type='hidden' name='token' value='"+token+"'/></form>");
代码2:String username=request.getParameter("username");
String token=request.getParameter("token");
String stoken=(String) request.getSession().getAttribute("token");
if(token.equals(stoken)){
System.out.println("请不要重复提交表单!");
return ;
}
request.getSession().removeAttribute("token");
代码3:
MessageDigest md=null;
try {
md = MessageDigest.getInstance("md5");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte b[]=md.digest(message.getBytes());
return new BASE64Encoder().encode(b);
三、客户端禁用Cookie后的会话数据保存问题
客户端禁用Cookie对http://localhost访问的无效
url---->url;JSESSIONID=123:URL重写.必须对网站中的所有URL地址都重写。
HttpServletResponse.encodeURL(url):是一个智能方法。判断用户是否禁用了Cookie,没有禁用,则不重写;禁用了就重写。
四、HttpSession对象的状态及转换(序列化)
1、如何更改内存中HttpSession对象的超时时间。
修改web.xml
 <session-config>
<session-timeout>1</session-timeout><!--自然整数,单位是分钟-->
 </session-config>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值