Cookie的使用
Cookie的使用
Cookie是什么? Cookie 是一小段文本信息,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问站点时 Web 应用程序都可以读取的信息。
为什么需要Cookie? 因为HTTP协议是无状态的,对于一个浏览器发出的多次请求,WEB服务器无法区分 是不是来源于同一个浏览器。所以,需要额外的数据用于维护会话。 Cookie 正是这样的一段随HTTP请求一起被传递的额外数据。
Cookie能做什么? Cookie只是一段文本,所以它只能保存字符串。而且浏览器对它有大小限制以及 它会随着每次请求被发送到服务器,所以应该保证它不要太大。 Cookie的内容也是明文保存的,有些浏览器提供界面修改,所以, 不适合保存重要的或者涉及隐私的内容。
Cookie 的限制。 大多数浏览器支持最大为 4096 字节的 Cookie。由于这限制了 Cookie 的大小,最好用 Cookie 来存储少量数据,或者存储用户 ID 之类的标识符。用户 ID 随后便可用于标识用户,以及从数据库或其他数据源中读取用户信息。 浏览器还限制站点可以在用户计算机上存储的 Cookie 的数量。大多数浏览器只允许每个站点存储 20 个 Cookie;如果试图存储更多 Cookie,则最旧的 Cookie 便会被丢弃。有些浏览器还会对它们将接受的来自所有站点的 Cookie 总数作出绝对限制,通常为 300 个。Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取。
cookie实现用户30天免登陆
1.用<context-param>设置初始化数据模拟数据库
<context-param> <param-name>user1</param-name> <param-value>1234</param-value> </context-param> <context-param> <param-name>user2</param-name> <param-value>2345</param-value> </context-param> <context-param> <param-name>user3</param-name> <param-value>3456</param-value> </context-param>
2.对提交的表单信息进行数据校验
import javax.jms.Session; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.*; import java.io.IOException; import java.util.Enumeration; @WebServlet(name = "CheckServlet",value = "/check") public class CheckServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取表单的用户信息 String username = request.getParameter("username"); String userPassword = request.getParameter("userPassword"); //用全局初始化参数模拟数据库,并获取用户名保存在枚举中 Enumeration<String> arrayParam = getServletContext().getInitParameterNames(); //遍历枚举 while (arrayParam.hasMoreElements()){ //获取用户名和用户密码 String paramName = arrayParam.nextElement(); String paramValue = getServletContext().getInitParameter(paramName); /* * 校验登录信息,用户信息正确则重定向到主页,并设置Cookie的生命周期为30天 * */ if (username.equals(paramName) && paramValue.equals(userPassword)){ Cookie cookie = new Cookie("user",paramName); cookie.setMaxAge(24*30*3600); response.addCookie(cookie); request.setAttribute("user",paramName); // System.out.println(request.getAttribute("user")); request.getRequestDispatcher("WEB-INF/main.jsp").forward(request,response); } } //校验失败则返回登录界面 HttpSession session = request.getSession(); session.setAttribute("name","wrong"); request.getRequestDispatcher("index.jsp").forward(request,response); } }
3.网站的访问URL以及是否有cookie情况下的登录处理
import javax.servlet.http.Cookie; import java.io.IOException; import java.io.PrintWriter; import java.util.Enumeration; public class LoginServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { doGet(request,response); } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { //解决乱码问题 response.setContentType("text/html;charset=utf-8"); PrintWriter printWriter = response.getWriter(); // request.setCharacterEncoding("utf-8"); //创建或者获取用户的cookie对象 Cookie[] cookies = request.getCookies(); if (cookies!=null){ for (int i=0;i<cookies.length;i++){ Enumeration<String> arrayParam = getServletContext().getInitParameterNames(); while (arrayParam.hasMoreElements()){ String name = arrayParam.nextElement(); if (cookies[i].getValue().equals(name)){ request.setAttribute("user",name); request.getRequestDispatcher("WEB-INF/main.jsp").forward(request,response); } } } }else { request.getRequestDispatcher("index.jsp").forward(request,response); } } }
4.用户的直销操作
import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "CancelServlet",value = "/cancel") public class CancelServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Cookie[] cookies = request.getCookies(); for (Cookie cookie:cookies){ if ("user".equals(cookie.getName())){ cookie.setMaxAge(0); request.getRequestDispatcher("index.jsp").forward(request,response); } } } }
5.实现效果
登录页面
成功登录
注销后返回登录界面
直接输入URL后的登录
百度网盘链接:链接: https://pan.baidu.com/s/1f0kad1P0CVGyQvWMDvF6VQ 提取码: yu6v