它可以在浏览器中保存一些信息,并且在下次请求时,请求头中会携带这些信息。
建立cookie
- Cookie cookie = new Cookie("test", "yyds");
- resp.addCookie(cookie);
查询cookie
- for (Cookie cookie : req.getCookies()) {
- System.out.println(cookie.getName() + ": " + cookie.getValue());
- }
在`HttpServletResponse`中添加Cookie之后,浏览器的响应头中会包含一个`Set-Cookie`属性,同时,在重定向之后,我们的请求头中,会携带此Cookie作为一个属性,同时,我们可以直接通过`HttpServletRequest`来快速获取有哪些Cookie信息
* name - Cookie的名称,Cookie一旦创建,名称便不可更改
* value - Cookie的值,如果值为Unicode字符,需要为字符编码。如果为二进制数据,则需要使用BASE64编码
* maxAge - Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为-1。
* secure - 该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false。
* path - Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”。
* domain - 可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”。
* comment - 该Cookie的用处说明,浏览器显示Cookie信息的时候显示该说明。
* version - Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范
最关键的其实是`name`、`value`、`maxAge`、`domain`属性
我们可以将用户名和密码全部保存在Cookie中,如果访问我们的首页时携带了这些Cookie,那么我们就可以直接为用户进行登陆,如果登陆成功则直接跳转到首页,如果登陆失败,则清理浏览器中的Cookie。
先在前端页面的表单中添加一个勾选框
- <div>
- <label>
- <input type="checkbox" placeholder="记住我" name="remember-me">
- 记住我
- label>
- div>
在登陆成功时进行判断,如果用户勾选了记住我,那么就讲Cookie存储到本地
- if(map.containsKey("remember-me")){ //若勾选了勾选框,那么会此表单信息
- Cookie cookie_username = new Cookie("username", username);
- cookie_username.setMaxAge(30);
- Cookie cookie_password = new Cookie("password", password);
- cookie_password.setMaxAge(30);
- resp.addCookie(cookie_username);
- resp.addCookie(cookie_password);
- }
修改一下默认的请求地址,现在一律通过`http://localhost:8080/yyds/login`进行登陆
添加GET请求的相关处理
- protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- Cookie[] cookies = req.getCookies();
- if (cookies != null) {
- String username=null;
- String password=null;
- for (Cookie cookie : cookies) {
- if (cookie.getName().equals("username")) {
- username = cookie.getValue();
- }
- if (cookie.getName().equals("password")) {
- password = cookie.getValue();
- }
- }
-
- if (password != null && username != null) {
- try (SqlSession sqlSession = factory.openSession(true)) {
- TestMapper mapper = sqlSession.getMapper(TestMapper.class);
- User user = mapper.getUser(new User(username, password));
- if (user != null) {
- resp.sendRedirect("Servlet2");
- return; //直接返回
- } else {
- for (Cookie cookie : cookies) {
- if (cookie.getName().equals("username")) {
- cookie.setMaxAge(0);
- }
- if (cookie.getName().equals("password")) {
- cookie.setMaxAge(0);
- }
- }
- }
- }
- }
- }
- req.getRequestDispatcher("/").forward(req, resp); //正常情况还是转发给默认的Servlet帮我们返回静态页面
-
- }
现在,30秒内都不需要登陆,访问登陆页面后,会直接跳转到Servlet2页面