一、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>
得到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>