Cookie是服务器通知客户端保存键值对的一种技术;保存在客户端 客户端有了Cookie后,每次请求都发送给服务器; 每个Cookie的大小不能超过4kb
BaseServlet:
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解决post请求中文乱码问题
// 一定要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
// 解决响应中文乱码问题
resp.setContentType("text/html; charset=UTF-8");
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Servlet程序中的代码:
public class CookieServlet extends BaseServlet{
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建cookie对象
Cookie cookie = new Cookie("key4", "value4");
//通知客户端保存cookie
resp.addCookie(cookie);
Cookie cookie1 = new Cookie("key2", "value2");
resp.addCookie(cookie1);
resp.getWriter().write("Cookie创建成功");
}
服务器获取客户端的Cookie只需要一行代码:req.getCookie() : Cookie[]。返回Cookie数组
Cookie工具类:
public class CookieUtils {
/**
* 查找指定名称的Cookie对象
* @param name
* @param cookies
* @return
*/
public static Cookie findCookies(String name,Cookie[] cookies) {
if (name == null || cookies == null || cookies.length == 0) {
return null;
}
for (Cookie cookie : cookies) {
if(name.equals(cookie.getName())) {
return cookie;
}
}
return null;
}
}
Servlet程序中的代码:
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
//getName方法返回Cookie的key(名)
//getValue方法返回Cookie的value值
resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "]<br/>");
}
Cookie iWantCookie = CookieUtils.findCookies("key4",cookies);
//如果不等于null,说明赋过值,也就是找到了需要的Cookie
if(iWantCookie != null) {
resp.getWriter().write("找到了需要的Cookie");
}
}
方案一: 1、先创建一个修改的同名的Cookie对象,在构造器中同时赋予新的Cookie值 2、调用response.addCookie()通知客户端保存修改。
Cookie cookie = new Cookie("key2", "newValue2");
resp.addCookie(cookie);
方案二: 1、先查找到需要修改的Cookie对象 2、调用setValue()方法赋予新的Cookie值 3、调用response.addCookie()通知客户端保存修改
Cookie cookie = CookieUtils.findCookies("key4", req.getCookies());
if(cookie != null) {
cookie.setValue("newValue4");
resp.addCookie(cookie);
}
谷歌浏览器如何查看Cookie:
火狐浏览器如何查看Cookie:
Cookie的生命控制指的是如何管理Cookie什么时候被销毁(删除) setMaxAge() 正数:表示在指定的秒数后过期 负数:表示浏览器一关,Cookie就会被删除(默认值是-1) 零:表示马上删除Cookie
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("default", "defaultLife");
cookie.setMaxAge(-1); //设置存活时间
resp.addCookie(cookie);
}
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = CookieUtils.findCookies("key4", req.getCookies());
if (cookie != null) {
cookie.setMaxAge(0);//表示马上删除,都不需要等浏览器关闭
resp.addCookie(cookie);
resp.getWriter().write("key4的cookie已经被删除");
}
}
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("default", "defaultLife");
cookie.setMaxAge(60 * 60); //设置存活时间
resp.addCookie(cookie);
resp.getWriter().write("已经创建了存活一个小时的cookie");
}
Cookie的path属性可以有效的过滤哪些cookie可以发送给服务器,哪些不发。 path属性是通过请求的地址来进行有效的过滤。 eg: CookieA:path = /工程路径 CookieB:path = /工程路径/a 请求地址如下: http://ip:port/工程路径/a.html CookieA发送 CookieB不发送
http://ip:port/工程路径/a/a.html CookieA发送 CookieB发送
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("path1","path1");
cookie.setPath(req.getContextPath() + "/a");
resp.addCookie(cookie);
resp.getWriter().write("创建了一个带有Path路径的Cookie");
}
login.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Login</title>
</head>
<body>
<form action="loginServlet" method="get">
用户名:<input type="text" name="username" value="${cookie.username.value}"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
LoginServlet程序:
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if(username.equals("Tom") && password.equals("123456")) {
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*60*24*7);
resp.addCookie(cookie);
System.out.println("登陆成功!");
} else {
System.out.println("登录失败!");
}
}
}
Session就一个接口(HttpSession) Session就是会话,它是用来维护一个客户端和服务器之间关联的一种技术。 每个客户端都有自己的一个Session会话 Session会话中我们经常用来保存用户登录之后的信息 session保存在服务器端
如何创建和获取Session,他们的API是一样的 request.getSession() 第一次调用时,创建Session会话 之后调用都是:获取前面创建好的session会话对象。 isNew();判断到底是不是刚创建出来的(新的) true 表示刚创建 false 表示获取之前创建 每个会话都有一个身份证号,也就是id值,而且这个id值是唯一的。 getId()得到Session的会话id值
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//创建和获取Session会话对象
HttpSession session = req.getSession();
//判断当前Session会话是否是新创建出来的
boolean isNew = session.isNew();
//获取session会话的唯一标识id
String id = session.getId();
resp.getWriter().write("得到的session,它的id是: " + id + "<br>");
resp.getWriter().write("这个session是否是新创建的: " + isNew + "<br>");
}
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
resp.getWriter().write("已经往Session中保存了数据");
}
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object attribute = req.getSession().getAttribute("key1");
resp.getWriter().write("从Session中获取出key1的数据是:" + attribute);
}
public void setMaxInactiveInterval(int interval) 设置session的超时时间(以秒为单位),超过指定时长,Session就会被销毁。
如果说,你希望你的web工程,默认的session的超时时长为其他时长,你可以在你自己的web.xml配置文件中做以上相同的配置,就可以修改你的web工程所有的Session的默认超时时长。 如果只想修改个别Session的超时时长,就可以使用上面的API。 setMaxInactiveInterval(int interval) 来进行单独的设置。 Session超时的概念介绍:
示例代码:
protected void defaultLife(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取了session的默认超时时长
int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
resp.getWriter().write("Session的默认超时时长为: " + maxInactiveInterval + "秒");
}
protected void life3(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先获取session对象
HttpSession session = req.getSession();
//设置当前session3秒后超时
session.setMaxInactiveInterval(3);
resp.getWriter().write("当前session会话已经设置为3秒后超时");
}
Session马上被超时示例:
protected void deleteNow(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//先获取session对象
HttpSession session = req.getSession();
//让session会话马上超时
session.invalidate();
resp.getWriter().write("Session已经设置为超时(无效)");
}
Session技术,底层其实是基于Cookie技术来实现的。