目录
3.8、 Session的钝化与活化技术(在硬盘存储、取出)
3.9、Cookie禁用后Session的处理(重写url)
一、会话技术
二、cookie
- Cookie属于一个类,可以直接创建对象
- Cookie是在服务器端创建的,然后tomcat服务器会将创建的cookie以及cookie中的数据响应给浏览器,保存到浏览器端。说明:
- 好处:减轻服务器压力。
- 弊端:不安全
- 使用HttpServletResponse中的对象调用方法addCookie将服务器创建的cookie直接保存到浏览器端
- 当我们下次访问同一个服务器会携带相同的cookie信息,在服务器中我们可以使用HttpServletRequest对象调用方法getCookies获取随着请求携带过来的所有的cookie。
应用场景:
购物车、记住账户密码
2.1、常用常用 API
需求:实现第二次访问服务器取出cookie中的数据
图解:
Cookie[] getCookies() 获取随着请求的所有cookie放到数组中
操作Cookie类中的name和value方法
1.String getName() 获取cookie类中的name值
2.String getValue() 获取cookie类中的value值
3.void setValue(String newValue) 修改value值
使用HttpServletResponse中的对象调用方法addCookie将服务器创建的cookie直接保存到浏览器端
void addCookie(Cookie cookie) 参数需要一个cookie类的对象
使用HttpServletRequest对象调用方法getCookies获取随着请求携带过来的所有的cookie。
常见api:
方法 | 使用示例 | 说明 |
---|---|---|
创建Cookie对象 | Cookie(String name,String value)name表示指定 cookie 名称 ,value 表示指定 cookie 值 | Cookie c1 = new Cookie("username","suoge") |
获取cookie的name值 | String getName() | c1.getName() |
获取cookie的value值 | String getValue() | c1.getValue() |
设置cookie的值 | void setValue(String value) | c1.setValue("李四") |
2.2、 记住账户密码案例实现
准备登录页面:
<form action="/loginServlet" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
记住用户名和密码:<input type="checkbox" name="check"><br>
<input type="submit" value="提交">
</form>
如勾选记住密码,存储cookie
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
登录servlet。用来创建cookie,将用户名和密码保存到cookie中并响应给浏览器
*/
//1.获取用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//2.获取复选框的值
String check = request.getParameter("check");
//3.到数据库查询用户名和密码是否存在,这里不书写了,使用固定数据
if("on".equals(check)){
//4.说明勾选了记住用户名和密码的复选框,创建cookie Cookie(String name, String value)
Cookie cookieUsername = new Cookie("userName", username);
//new Cookie("pwd", password); 第一个参数表示cookie的name,随便定义,password表示value,这里是要存储的数据变量
Cookie cookiePwd = new Cookie("pwd", password);
//5.将cookie响应给浏览器
response.addCookie(cookieUsername);
response.addCookie(cookiePwd);
}
}
}
获取cookie:
@WebServlet("/getCookiesServlet")
public class GetCookiesServlet extends HttpServlet {
...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
获取随着请求过来的cookie,获取cookie中的用户名和密码并输出到控制台
*/
//1.获取请求中的所有cookie
Cookie[] cookies = request.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
//3.获取name值 String getName() 获取cookie类中的name值
String name = cookie.getName();
//4.获取value值 String getValue() 获取cookie类中的value值
String value = cookie.getValue();
System.out.println(name+"---"+value);
}
}
}
2.3 、cookie中存储特殊字符
//存特殊字符
@WebServlet("/specialChar01Servlet")
public class SpecialChar01Servlet extends HttpServlet {
...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
向cookie中存储特殊的字符
说明:
1.cookie中可以存储汉字,但是不能存储特殊字符,例如空格等
2.如果想cookie中存储特殊的字符,我们需要在存储之前进行编码
*/
//1.创建cookie对象
String s = URLEncoder.encode("12 34", "UTF-8");
Cookie cookie = new Cookie("msg", s);
//2.将cookie响应给浏览器
response.addCookie(cookie);
}
}
//取特殊字符
@WebServlet("/specialChar02Servlet")
public class SpecialChar02Servlet extends HttpServlet {
...
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取浏览器中的cookie
Cookie[] cookies = request.getCookies();
//2.遍历数组
for (Cookie cookie : cookies) {
//3.获取cookie的name
String name = cookie.getName();
//4.判断name的值是否等于msg
if("msg".equals(name)){
//5.获取msg的value
String value = cookie.getValue();
//6.对value进行解码
String decode = URLDecoder.decode(value, "utf-8");
System.out.println("decode = " + decode);
}
}
}
}
2.4、cookie存活时间(掌握) 能够实现cookie的持久化
需求:向cookie中存储数据,并设置cookie的存活时间为1周;
cookie默认的存活时间是会话结束即关闭浏览器。平常开发中对于某些cookie中存储的数据希望保存的时间更长一些,而不是浏览器关闭就不存在。如果想让cookie长久保存可以使用Cookie类的方法即可:
void setMaxAge(int expiry) 参数是秒
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, I