js操纵cookie
创建修改一个cookie
function write(){
var nm = "张三第";
nm= encodeURI(nm);//如是中文, 编码
var date = new Date();
date.setTime(date.getTime()+1000*60*60*2);
document.cookie = "name="+nm+";expires="+date.toGMTString()+";path=/";
}
删除一个cookie–即声明一个key相同的过期的cookie
function del(){//即声明一个key相同的过期时间的Cookie即可
var date = new Date(1970,1,1);
document.cookie="name=aa;expires="+date.toGMTString()+";path=/";
}
遍历cookie
function visit(){
var cs = document.cookie.split(";");//中文解码
for(var x=0;x<cs.length;x++){
cs[x] = decodeURI(cs[x]);
div1.innerHTML += "<br/>"+cs[x];//js中,id对象可以直接通过“id名”访问
var str = cs[x].split("=");
div2.innerHTML += "<br/>"+str[1];
}
}
Session技术:
Session会话简介
1会话是指在一段时间内,用户使用同一个浏览器进程与Web应用之间的交互过程。
2会话(Session)通常用来跟踪用户的状态,缓存用户在此浏览器进程中的信息。
3当用户关闭浏览器,上一个Session也就无法再次获得了(Cookie的maxAge为-1的情况)。再次打开新的浏览器,将开始一个新的会话。
4类javax.servlet.http.HttpSession。每一个HttpSession代表用户的一个会话。
5每一个Session的过期时间默认为30分钟。
6当浏览器第一次访问服务器时,无论先访问哪一个页面,服务器就会给用户分配一个唯一的会话标识,即jsessionid然后以cookie的形式返回给用户。
7下图是一个响应头(下图是基于Servlet3.0的,在Servlet2.5中没有HttpOnly属性)
8服务器给每个用户创建一个会话,即HttpSession对象,保存在服务器端。
那么,当用户再次访问服务器时,服务器是如何知道还是当前用户呢?
9当浏览器再次访问服务器时,会携带包含了jsessionid的cookie访问服务器。服务器根据此id返回此用户的HttpSession对象,就保持了会话。
图示session会话
Session的唯一标识Id:
每一个Session都一个唯一标识,即ID。
当浏览器获取一个新的Session时,用户即可以通过session.geId();打印出ID的值 。
再不关闭浏览器的情况下,在多个页面上跳转,使用的是同一个Session。
HttpSession:
在Servlet中,通过HttpServletRequest.getSession方法获取会话对像。
HttpSession接口的以下方法用于向会话范围内共享数据:
getAttribute(“name”)
setAttribute(“name”,object);
getAttributeNames()
removeAttrubute(“name”)
Invalidate(); - 此方法强力删除服务器缓存的session.
示例:
在一个Servlet的向httpSession中setAttribute设置某些值。
通过超连接,或其他方式转到其他servlet并通过getAttribute显示信息。
在任意Servlet中调用getAttribute显示信息。
关闭此浏览器,重新访问获取信息的servlet,你会发现已经没有信息了。
request、session、servletContext三个容器
可以大致理解为
request容器只是在同一次请求(转发、请求包含)中。
session容器是在浏览器不关中。
servletContext是在服务器不关中。
当用户在操作的过程中,不小心关闭了浏览器。用户再重新打开浏览器还能获得之前保存在Session中的信息
把cookie技术和session技术联合起来,向客户端写一个key为”jsessionid”,value为”sessionid”的cookie。因为在服务器中,它默认将这个包含jsessionid的cookie的setMaxAge设为-1,这样我们在浏览器关闭就拿不到了。这时,我们在服务器中拷一个,将它的setMaxAge设为10分钟,这样,浏览器发送请求的时候将这个jsessionid带过去,去tomcat的session池中遍历查找,找到了,就是上次关闭之前的那个网页信息。
Cookie c= new Cookie("JSESSIONID", request.getSession().getId() );
c.setMaxAge(60*10);
c.setPath(request.getContextPath());
response.addCookie(c);
安全退出
只要让session对象无效即可。设一个
request.getSession().invalidate();//安全退出让session无效即可
用session做验证码的判断
在验证码生成的时候,将真值存入到session当中。在提交表单的时候,拿用户填写的验证码的值与从session中获取的真值进行判断即可。
注意,session中存的验证码真值要用一次清一次。否则会导致两个验证码对不上。
本文完整代码如下:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h1>演示Cookie技术</h1>
<a href="CookieDemo">Cookie基本用法演示</a><br/><br/>
<a href="servlet/CookieDemo2">演示Cookie的权限</a><br/><br/>
<a href="servlet/DelCookieDemo">演示Cookie的删除</a><br/><br/>
<a href="servlet/ShowCookieDemo">利用Cookie显示上一次访问的时间</a><br/><br/>
<a href="jsps/show.jsp">利用Cookie显示用户最近浏览的图片</a><br/><br/>
<a href="CookieJs.jsp">演示用js操作cookie</a>
<hr/>
<h1>演示Session技术</h1>
<hr/>
<h2>演示request、session、servletContext三个容器</h2>
<form action="SaveServlet" method="post">
姓名:<input type="text" name="name"/><br/>
<input type="submit" value="提交" />
</form>
<br/>
<a href="GetServlet">获取三个容器中的参数</a>
<br/>
<a href="LogOutServlet">安全退出</a><br/> <br/>
<h2>演示利用session进行验证码验证</h2>
<form action="TestServlet" method="post">
姓名:<input type="text" name="name"/><br/>
密码:<input type="password" name="pwd"/><br/>
验证码:<input type="text" name="code"/>
<img src="ImgServlet" />
<input type="submit" value="提交" />
</form>
<br/>
<br/>
<br/>
<hr/>
<h2>演示URL重写技术---破解用户禁用cookie之后,我们session无效的问题</h2>
<!-- 即利用我们response的发送url后面带参数,而不是用session
重写url技术如下:http://127.0.0.1:8080/CookieSessionDemo_jun/GetServlet;jsessionid=1E55681054EA2BF4C8B3A6750B7A873D
利用session如下:http://127.0.0.1:8080/CookieSessionDemo_jun/SaveServlet
-->
<form action="<%=response.encodeURL("SaveServlet") %>" method="post">
姓名:<input type="text" name="name"/><br/>
<input type="submit" value="提交" />
</form>
<br/>
<br/>
<a href="<%=response.encodeURL("GetServlet")%>">获取三个容器中的参数</a>
<a href="<%=response.encodeURL("LogOutServlet")%>">安全退出</a><br/> <br/>
<br/>
<br/>
<br/>
<br/> <br/> <br/>
</body>
</html>
CookieJs.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>显示用js操纵cookie</h2>
<div id="div1"></div>
<div id="div2"></div>
<script type="text/javascript">
function write(){
var nm = "张三第";
nm= encodeURI(nm);//如是中文, 编码
var date = new Date();
date.setTime(date.getTime()+1000*60*60*2);
document.cookie = "name="+nm+";expires="+date.toGMTString()+";path=/";
}
write();
function del(){//即声明一个key相同的过期时间的Cookie即可
var date = new Date(1970,1,1);
document.cookie="name=aa;expires="+date.toGMTString()+";path=/";
}
//del();
function visit(){
var cs = document.cookie.split(";");//中文解码
for(var x=0;x<cs.length;x++){
cs[x] = decodeURI(cs[x]);
div1.innerHTML += "<br/>"+cs[x];//js中,id对象可以直接通过“id名”访问
var str = cs[x].split("=");
div2.innerHTML += "<br/>"+str[1];
}
}
visit();
</script>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<servlet>
<servlet-name>CookieDemo</servlet-name>
<servlet-class>cn.hncu.servlet.CookieDemo</servlet-class>
</servlet>
<servlet>
<servlet-name>CookieDemo2</servlet-name>
<servlet-class>cn.hncu.servlet.CookieDemo2</servlet-class>
</servlet>
<servlet>
<servlet-name>DelCookieDemo</servlet-name>
<servlet-class>cn.hncu.servlet.DelCookieDemo</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowCookieDemo</servlet-name>
<servlet-class>cn.hncu.servlet.ShowCookieDemo</servlet-class>
</servlet>
<servlet>
<servlet-name>ShowImg</servlet-name>
<servlet-class>cn.hncu.servlet.ShowImg</servlet-class>
</servlet>
<servlet>
<servlet-name>SaveServlet</servlet-name>
<servlet-class>cn.hncu.servlet.session.SaveServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>GetServlet</servlet-name>
<servlet-class>cn.hncu.servlet.session.GetServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>LogOutServlet</servlet-name>
<servlet-class>cn.hncu.servlet.session.LogOutServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>TestServlet</servlet-name>
<servlet-class>cn.hncu.servlet.session.TestServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>ImgServlet</servlet-name>
<servlet-class>cn.hncu.servlet.session.ImgServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieDemo</servlet-name>
<url-pattern>/CookieDemo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>CookieDemo2</servlet-name>
<url-pattern>/servlet/CookieDemo2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>DelCookieDemo</servlet-name>
<url-pattern>/servlet/DelCookieDemo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowCookieDemo</servlet-name>
<url-pattern>/servlet/ShowCookieDemo</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ShowImg</servlet-name>
<url-pattern>/ShowImg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>SaveServlet</servlet-name>
<url-pattern>/SaveServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>GetServlet</servlet-name>
<url-pattern>/GetServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>LogOutServlet</servlet-name>
<url-pattern>/LogOutServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/TestServlet</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>ImgServlet</servlet-name>
<url-pattern>/ImgServlet</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
SaveServlet
package cn.hncu.servlet.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SaveServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
String name = request.getParameter("name");
request.setAttribute("name", "request-name:"+name);
request.getSession().setAttribute("name", "session-name:"+name);
getServletContext().setAttribute("name", "application-name:"+name);
//把cookie技术和session技术联合起来做应用的一个例子---※功能:
//让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息
//向客户端写一个key为"JSESSIONID"用value为sessionid的cookie,
Cookie c= new Cookie("JSESSIONID", request.getSession().getId() );
c.setMaxAge(60*10);
c.setPath(request.getContextPath());
response.addCookie(c);
out.println("<br/>保存成功");
out.flush();
out.close();
}
}
GetServlet
package cn.hncu.servlet.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GetServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <BODY>");
String requestName = (String) request.getAttribute("name");
String sessionName = (String) request.getSession().getAttribute("name");
String applicationName = (String) getServletContext().getAttribute("name");
out.println("<br/>"+requestName);
out.println("<br/>"+sessionName);
out.println("<br/>"+applicationName);
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
LogOutServlet
package cn.hncu.servlet.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LogOutServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <BODY>");
request.getSession().invalidate();//安全退出让session无效即可
out.print("成功安全退出");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
}
ImgServlet
package cn.hncu.servlet.session;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ImgServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
int w = 30;
int h = 40;
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Random r = new Random();
int n = r.nextInt(10000);
//将真值放入session
request.getSession().setAttribute("code", ""+n);
//写出验证码图片
Graphics g = img.getGraphics();
g.drawString(""+n, 0, h);
g.dispose();
ImageIO.write(img, "JPEG", response.getOutputStream());
}
}
TestServlet
package cn.hncu.servlet.session;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class TestServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
//从客户端获取用户输入的name,pwd,code
String name = request.getParameter("name");
String pwd =request.getParameter("pwd");
String code = request.getParameter("code");
String realCode =(String) request.getSession().getAttribute("code");
if(code==null || !code.equals(realCode)){
out.println("<br>验证码输入错误");
}else{
if(name!=null && name.equals(pwd)){
out.println("<br>登录成功");
}else{
out.println("<br>用户名密码错误");
}
}
//每次使用验证码后要清除session中旧的验证码--用一次,清一次!
request.getSession().removeAttribute("code");
}
}