Session解决数据转发问题,但是Session依赖于Cookie
Cookie是浏览器端保存少量数据的一种技术。
1 问题:
HTTP 协议是没有记忆功能的,一次请求结束后,相关数据会被销毁。如果第二次的请求需要使用相同的请求数据怎么办呢?难道是让用户再次请求书写吗?
解决:
使用 Cookie 技术,
解释:
Cookie 技术其实是浏览器端的数据存储技术,解决了不同请求需要使用相同的请求数据的问题。我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。但是哪些数据需要使用 Cookie 技术存储起来是一个主观问题,需要在后台进行响应的时候来告诉浏览器,有些数据其他请求还会使用,需要存储起来。
浏览器帮忙把用户名存起来,下次请求的时候,浏览器写好了就帮带上了,相当于自己写过了。可以指定让浏览器存什么,即在响应的时候告诉浏览器存什么,其他请求的时候帮忙带上。
特点:
浏览器端的数据存储技术
适合少量数据
键值对
不安全
使用:
2 创建Cookie
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息.
//处理请求信息
//响应处理结果
//使用Cookie进行浏览器端的数据存储
//创建Cookie对象
Cookie c=new Cookie("mouse", "thinkpad");
Cookie c2=new Cookie("key", "bjsxt");
//设置Cookie
//设置Cookie的有效期
c2.setMaxAge(3*24*3600);
//设置有效路径
c2.setPath("/cookie/gc");
//响应Cookie信息
resp.addCookie(c);
resp.addCookie(c2);
//直接响应
resp.getWriter().write("Cookie学习");
//请求转发
//重定向
3 Cookie 数据存储时长分类:
不设置 cookie 信息的存储时间,周期为一次会话,存储在浏览器内存中
4 Cookie有效路径
默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径。
c2.setPath("/cookie/abc");//只访问abc才带
5 Cookie 数据获取
Cookie[] cks=req.getCookies();//获取本站在客户端上保留的所有Cookie
if(cks!=null){
for(Cookie c:cks){//null不能遍历
String name=c.getName();//Cookie的getName方法
String value=c.getValue();
System.out.println(name+":"+value);
}
}
6 Cookie编码
默认情况下,Cookie值不允许出现中文字符,如果我们需要值为中文内容的Cookie怎么办呢?同样可以借助于java.net.URLEncoder先对中文字符串进行编码,将编码后的结果设为Cookie值。当程序要读取Cookie时,则应该先读取,然后使用java.net.URLDecoder对其进行解码。
总结:
Cookie 技术解决了不同请求发送之间的数据共享问题。
案例:三天免登录
原来我们访问page,第一次输入的时候需要输入密码,然后跳转到了main页面。第二次访问page的时候,我们想让他直接进入main,而不经过page页面。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SUPhd0xC-1592218380016)(https://raw.githubusercontent.com/FermHan/tuchuang/master/20191016223412.png)]
新建CookieServlet
Cookie信息校验
-
判断请求中是否携带正确的Cookie信息
-
如果有则校验Cookie信息是否正确
-
如果校验正确则直接响应主页面给用户
-
如果校验不正确则响应登录页面给用户
-
没有则请求转发给登录页面
在登录页面设置cookie,以后再来访问登录页面的时候,服务器检测带过来的cookie里有没有想要的cookie信息,没有就重新设置,有就免登录
------login/CookieServlet.java--------;
public class CookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//设置请求编码格式
req.setCharacterEncoding("utf-8");
//设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//获取请求信息
//获取Cookie信息
Cookie[] cks=req.getCookies();
//处理请求信息
if(cks!=null){
//遍历Cookie信息
String uid="";//不要直接存用户密码,而是存uid
for(Cookie c:cks){
if("uid".equals(c.getName())){
uid=c.getValue();
}
}
//校验UID是否存在
if("".equals(uid)){//uid为空,
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}else{//有uid
//校验UID用户信息
//获取业务层对象
LoginService ls=new LoginServiceImpl();
User u=ls.checkUidService(uid);
if(u!=null){//uid正确,成功登录
//重定向
resp.sendRedirect("/login/main");
return;
}else{//uid不正确,转发到登录页面
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
}else{//没有cookie,去登录页面
//响应处理结果
//请求转发
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
}