一、Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户的浏览器,当用户使用浏览器去访问服务器中的web资源时,就会带着各自的数据去。这样web资源处理的就是用户各自的数据。Cookie叫客户端技术,是因为数据存储在客户端。原理逻辑如图:
用户点击超链接购买了一个商品。保存用户购买的商品,以便于用户点击结账servlet时,结账的servlet可以得到用户商品为用户结账。
图解:当浏览器去访问服务器时,第一次访问不会携带cookie信息,当访问完servlet1后,servlet1会回写一个cookie,在cookie中存入用户购买的物品,然后服务器将cookie回送给浏览器,浏览器将这个cookie进行缓存,在浏览器再去访问servlet2时,会携带cookie信息到服务器,这样就可以知道用户购买了什么物品。
Cookie API:
javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。 同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类方法:
1.Cookie(String name,String value):通过这个构造函数可以指定一个键值对,将信息存入到Cookie中,相同的name的值是会被覆盖的。
2.setValue:给当前cookie重新赋值。
getValue:这个方法是获取Cookie中字段的值,就是我们在Cookie的构造函数中的第二个参数Value,我们通过getName()方法检测到我们想要的Cookie,然后就可以通过这个方法获取Cookie中的信息。
3.setMaxAge:这个方法是设置Cookie的有效时间(单位是秒),也就是Cookie在浏览器中的缓存时间。
getMaxAge:获取对应的值
4.setPath:设置Cookie的使用路径。这个方法是设置当访问路径为path的资源的时候携带Cookie信息,比如:setPath("/ServletDemo")
这样设置之后就是说在访问应用/ServletDemo中的所有资源的时候都会携带Cookie信息数据,如果不进行设置的话,默认是访问路径会携带Cookie,比如:/ServletDemo/ServletCookieDemo,其中ServletCookieDemo是一个Servlet,ServletDemo是当前的应用的映射路径。。
getPath:获取对应值
5.setDomain:这个方法是设置我们在访问domain域的时候会携带Cookie信息数据,这个可以做到第三方Cookie和跨域Cookie的信息访问操作,如:在我们的应用中设置新浪域名sina.com,这个就是第三方Cookie技术,在我的应用中设置Cookie信息,并将这个Cookie的域设置成其他的域名,同时如果我将这个域设置成sina.com,来攻击新浪网站因为cookie也是数据的,如果每次都携带cookie的话,server需要处理cookie,增加server的负担,所以会禁止第三方cookie,所以这个方法是没有效果的。当然我们可以在浏览器中禁止Cookie和第三方Cookie的信息。
getDomain:获取对应值。
6.getName:这个方法是获取Cookie中字段的名称,就是我们在Cookie的构造函数中的第一个参数Name,这样我们就可以找到我们想要的Cookie信息
添加Cookie示例:
获取客户端的Cookie时,只能获取name与value属性,其它属性都不会被提交。如果cookie.setPath("/")同一服务器内所有应用都可访问到该Cookie
public void servletTest(HttpServletRequest request,HttpServletResponse response){
Cookie cookie = new Cookie("username","user"); // 新建一个Cookie对象
cookie.setMaxAge(24*60*60); // 设置过期时间1天,以秒为单位
cookie.setPath("/ServletTestDemo"); // 设置路径。
response.addCookie(cookie); // 保存cookie到客户端
}
删除Cookie示例:
删除某个Cookie时,只需要新建一个只有MaxAge和value不一样的同名Cookie,然后添加到response中覆盖原来的Cookie
public void servletTest(HttpServletRequest request,HttpServletResponse response){
Cookie cookie = new Cookie("username","user"); // 新建Cookie
cookie.setMaxAge(0); // 设置生命周期为0,表示将要删除
cookie.setPath("/ServletTestDemo"); //设置的路径必须要和之前的一样,否则是删除不了的
response.addCookie(cookie); // 执行添加后就从response里删除了
}
修改Cookie示例:
修改某个Cookie时,只需要新建一个只有value属性不一样的同名Cookie,然后添加到response中覆盖原来的Cookie。比如刚是 user这次我们value修改成name。
public void servletTest(HttpServletRequest request,HttpServletResponse response){
Cookie cookie = new Cookie("username","name"); // 新建Cookie
cookie.setMaxAge(24*60*60); // 设置生命周期
cookie.setPath("/ServletTestDemo"); //设置的路径必须要和之前的一样,否则是删除不了的
response.addCookie(cookie); // 执行添加后就从response里删除了
}
JS操作Cookie。Cookie是保存在客户端的,所以浏览器可以使用JS脚本等操作Cookie。
<script language=javascript>
//添加cookie
function setCookie(name,value,time){
var date= new Date();
date.setDate(date.getDate()+time);
document.cookie = name+"="+value+";expires="+date;
}
//获得cookie
function getCookie(name){
var arr = document.cookie.split(";");
for(var i=0; i<arr.length; i++){
var arr2 = arr[i].split("=");
if(arr2[0] == name){
return arr2[1];
}
}
return null;
}
//删除cookie
function removeCookie(name){
setCookie(name,"",0)
}
</script>
常见的浏览器记住密码。直接把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中。 把密码加密后保存到Cookie中,下次访问时解密并与数据库比较。这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。
加密
String userName = request.getParameter("userName");//获取用户名
Md5Hash psw = new Md5Hash(userName, "peter.com", 2);//以peter.com为密钥加密
//将用户名添加进cookie并发送给客户端
Cookie userCookie = new Cookie("userName",userName);
userCookie.setMaxAge(7*24*60*60);
response.addCookie(userCookie);
//将密钥生成的密文加进cookie并发送给客户端
Cookie c = new Cookie("key",psw.toString());
c.setMaxAge(7*24*60*60);
response.addCookie(c);
解密
String usreName = null;
String key = null;
Cookie[] cookie = request.getCookies();
if(cookie !=null){
for(Cookie c:cookie){ // 遍历Cookie
if("userName".equals(c.getName())
userName = c.getValue();
if("key".equals(c.getName())
key= cookie.getValue();
}
}
if(userName != null && key != null){
String secrect = new Md5Hash(userName, "peter.com", 2);
if(key.equals(secrect )){//加密规则正确,说明已经登录
//...此处可以进行后续处理
}
}
二、Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他的web资源再从用户各自的session中取出数据为用户服务。Session叫服务器端技术,是因为数据存储在服务器。原理逻辑如图:
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session API:
1.getAttributeNames():获取session中所有的键值
2.setAttribute(String name):设置session范围内attName属性的值为attValue。
3.getAttribute(String name):返回session范围内attName属性的值。
4.removeAttribute(String name):清除指定的session的值。
5.getCreationTime():获取Session的创建时间
6.getId():获取session的id
7.getServletContext():获取ServletContext对象
8.invalidate():删除session的方法,就是将session设置成无效的
9.setMaxInactiveInterval(int interval):这个方法设置session的最大有效时间
session对象的创建
public class SessionTest extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF=8");
response.setContentType("text/html;charset=UTF-8");
//使用request对象的getSession()获取session,如果session不存在就创建一个
HttpSession session = request.getSession();
session.setAttribute("data", "haoaoo"); //将数据存储到session中
String sessionId = session.getId(); //获取session的Id
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
session对象的销毁
session对象默认30分钟,如果没有使用则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间,示例:
</web-app>
<session-config>
<session-timeout>15</session-timeout> //以分钟为单位
</session-config>
</web-app>
如果需要在程序中手动设置Session失效时,可以调用session.invalidate方法销毁session。
HttpSession session = request.getSession();
session.invalidate();
三、Session和Cookie的主要区别
1.Cookie是把用户的数据写给用户的浏览器。
2.Session技术把用户的数据写到用户独占的session中。
3.Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。