cookie是一小段文本信息,通过使用cookie可以标识用户身份、记录用户名及密码、跟踪重复用户等。cookie在服务器生成并发送给浏览器。cookie的信息格式为key/value,有浏览器保存在本地的缓存中。可以提高服务端的效率,但安全性较差。
在JSP中,cookie不属于内置对象,若要向客户端发送cookie,则必须new一个对象。cookie的对象由javax.Servlet.http.Cookie产生。
关于cookie常用的方法:
public Cookie(String key,String name):cookie的构造方法。
String getName():获取cookie对象的key
String getValue():获取cookie对象的value
void setMaxAge():设置cookie对象的最大有效时间
下面看看服务端向客户端发送Cookie的过程:
response.addCookie(Cookie cookie)
页面跳转(请求转发、重定向都行)
客户端获取Cookie(request.getCookies();)
下面是登录案列:
//login.jsp
//response_addCookie.jsp
<%
String name = request.getParameter("userName");
String pwd = request.getParameter("userPwd");
//服务端
//创建Cookie对象
Cookie cookie1 = new Cookie("name",name);
Cookie cookie2 = new Cookie("password"),
response.addCookie(cookie1);
response.addCookie(cookie2);
//页面跳转到客户端(转发重定向)
response.sendRedirect("result.jsp");
%>
//result.jsp
<%
//客户端
//获取服务端传过来的所有Cookie
Cookie[] cookies= request.getCookies();
for(Cookie cookie : cookies){
out.print(cookie.getName()+"..."+cookie.getValue()+"
");
}
%>
在浏览器中运行可以:
可以看到result.jsp一共获得了三个cookie,其中name和password是在login.jsp登录时用的用户名和密码,在response_addCookie.jsp在获取并发送回给客户端。再由result.jsp打印出来。但是最后获取到的cookie值有三个。在这里先注意一下JSESSIONID,后面将会讲解。
以下是Cookie的运行机制图:
首先,用户通过客户端的login.jsp登录,此时,请求转发到服务端的check.jsp。check.jsp可以对客户端传过来的数据进行验证,创建自定义的cookie对象,并放入到response中(response.addCookie(cookie);),接着重定向到新的跳转页面。并将cookie到发送到客户端中。且cookie在被存储在浏览器中。需要注意的是,客户端用request获取Cookie对象,但每次不能获取一个值,只能将所有的cookie同时获取(Cookie[] cookies = request.getCookies();)
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。 因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
在每一次打开一个网站时:从开启到关闭可称为一次会话。
Session的运行机制:
客户端第一次请求服务端时,服务端会产生一个session对象(用于保存给客户的信息)
并且每个session对象都会有一个唯一的sessionID(用于区分其他session)
服务端又会产生一个Cookie,并且该cookie的name=JSESSIONID,value=服务端sessionID的值
然后服务端会在响应客户端的同时将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID)
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID-session-Id)
客户端第二/N次请求服务端时,服务端会先用客户端cookie中的JSESSIONID去服务端中匹配sessionID,如果匹配成功(cookie JSESSIONID的值等于session sessionID的值)说明此用户不是第一次访问,无需登录
举个例子:
假设客户端是客户,服务端是酒店。客户(客户端)刚入住酒店时,前台(服务端)会判断此人是否是已登记(第一次访问),若为第一次登记,则前台会给其分配一张门卡(JSESSIONID)。且门卡(JSESSIONID)和门锁(sessionID)一一对应(建立会话)。第二次或第N次回酒店时(请求服务端),通过你手里是否有与门锁对应的门卡(JSEESIONID==sessionID)判断是否需要新建会话。而当你隔天办理退房手续时,则视为会话结束。(皮中带骚,手动滑稽)
Session运行机制图如下:
session的常用方法:
String getId();获取sessionID
boolean isNew():判断是否是新用户(第一次访问)
void invalidate():使session失效(退出登录、注销)
void setAttribute():
Object getAttribute():
void serMaxInactiveInterval(秒):设置最大有效非活动时间
int getMaxInactiveInterval():获取最大非活动有效时间
举个例子:
//check.jsp
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("useName");
String pwd = request.getParameter("usePwd");
if(name.equals("Emove") && pwd.equals("123456")){
//只有登录成功,session中才会有userName和userPwd
session.setAttribute("userName", name);
session.setAttribute("userPwd", pwd);
//服务端在第一次响应客户端时,会发送一个JSESSIONID的cooike
System.out.print("sessionid:"+session.getId()+"
");
Cookie cookie = new Cookie("name",name);
response.addCookie(cookie);
//设置最大非活动时间10秒
//session.setMaxInactiveInterval(10);
//跳转到welcome
request.getRequestDispatcher("Welcome.jsp").forward(request, response);
}else{
//登录失败
response.sendRedirect("login.jsp");
}
%>
//Welcome.jsp
欢迎您:
<%
String name = (String)session.getAttribute("userName");
//如果用户没有登录,而是直接通过地址访问,则获取到的地址必然是null,
if(name!=null){
out.print(name);
%>
注销
<%
}else{
//跳回登录页
response.sendRedirect("login.jsp");
}
%>
|
session |
cookie |
保存的位置 |
服务器 |
客户端 |
安全性 |
较安全 |
较不安全 |
保存的内容 |
Object |
String |