前言
本章学习Cookie的相关知识
方法
1.概念
我们知道,一个http请求可能附带用户自己的参数,如用户名或者密码等等。如果需要多个请求共享同一数据的话,那么就需要Cookie进行存储已达到目的,典型的就是三天免登陆的例子
2.方法
1)首先创建Cookie对象
Cookie cookie = new Cookie("键","值");
Cookie cookie = new Cookie("jwang","haoren");
2)在响应中添加Cookie
response.addCookie(cookie);
经过上面两步之后,我们的浏览器在访问这个应用的时候会自动的带上这个cookie
3)设置cookie的有效时间
上面我们设置的cookie是存储在浏览器内存之中,也就是说,我们关闭浏览器之后,cookie就会失效。但是有些时候我们需要单独的给cookie设置一个有效期,以保证它在一定时间内不会因为关闭浏览器的原因而失效!
//设置cookie的有效时间,单位秒(s)
cookie.setMaxAge(1*24*60*60);
这样的话,即使浏览器关闭之后,再次打开执行该应用的请求,仍然带有该cookie
4)设置cookie的有效路径
我们知道,设置了cookie之后,我们对于项目的每一次请求,都会带有该cookie的数据。有些时候我们不需要这样做,只是指定的请求路径下才带有该cookie,那么就要设置cookie的有效路径。
//设置cookie的有效路径,访问该路径请求才带上cookie
cookie.setPath("/ss");
5)获取cookie
上面都是介绍的cookie的基本设置,接下来我们来看一下cookie的获取
cookie存储于我们的请求之中,自然通过request对象进行获取
Cookie [] cookies = request.getCookies();
for (Cookie ck: cookies) {
String name = ck.getName();
String value = ck.getValue();
System.out.println("name="+name+",value="+value);
}
注意:该处需要添加cookies非空的判断,否则可能会出现空指针异常!
实战——三天免登陆功能的实现
我们仍然以之前的代码为例,也就是SMS系统
1.设置用户名cookie,当用户登录成功之后,添加三天有效期的用户名cookie
//设置为期三天的cookie,其中保存了用户名的信息
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(3*24*60*60);
response.addCookie(cookie);
request.getRequestDispatcher("/success.jsp").forward(request, response);
注意:当用户成功登录是添加该cookie
2.获取cookie,如果获取到了指定的cookie,那么直接跳转至登录成功页面success.jsp
完整代码如下:
package com.jwang.student.servlet;
import com.jwang.student.bo.User;
import com.jwang.student.service.UserService;
import com.jwang.student.service.impl.UserServiceImpl;
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;
@WebServlet("/login.do")
public class UserServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response){
try {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie ck : cookies) {
if ("username".equals(ck.getName())) {
request.getRequestDispatcher("/success.jsp").forward(request, response);
return;
}
}
}
String username = request.getParameter("username");
String password = request.getParameter("password");
request.setCharacterEncoding("UTF-8");
UserService userService = new UserServiceImpl();
User user = new User("01", username, password);
if (userService.login(user)) {
//设置为期三天的cookie,其中保存了用户名的信息
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(3 * 24 * 60 * 60);
response.addCookie(cookie);
request.getRequestDispatcher("/success.jsp").forward(request, response);
} else {
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response){
this.doGet(request, response);
}
}
通过以上方法,设置我们的登录系统的路径为login.do即可实现该功能