Cookie(客户端)
什么是Cookie
- Cookie 是服务器通知客户端保存键值对的一种技术
- 客户端有了Cookie 后,每次请求都发送给服务器
- 每个Cookie的大小不能超过4
kb
如何创建Cookie
可以一次性创建多个Cookie
创建
Servlet
程序public abstract class BaseServlet extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //解决post请求中文乱码问题 //一定要在获取请求参数之前调用才有效 request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=UTF-8"); //获取隐藏表单项的action的值 String action = request.getParameter("action"); //利用反射获取相应的用户行为,避免使用大量的if else //我们只需要在下面编写相应的方法即可,修改密码,绑定邮箱,绑定手机号等业务 try { //获取action鉴别对象,获取相应的业务 Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class); //调用目标业务 method.invoke(this,request,response ); } catch (Exception e) { e.printStackTrace(); } } //因为图书管理板块的提交方式是Get请求,所以我们让doGet执行doPost相同的操作 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); } }
CookieServlet
程序public class CookieServlet extends BaseServlet { protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.创建Cookie对象 Cookie cookie = new Cookie("key1","value1"); //2.通知客户端保存Cookie(服务器发送给客户端/浏览器,所以是response) response.addCookie(cookie); response.getWriter().write("Cookie创建成功"); //解决中文乱码问题在BaseServlet中, response.setContentType("text/html;charset=UTF-8"); } }
web.xml
<servlet> <servlet-name>CookieServlet</servlet-name> <servlet-class>com.gw.servlet.CookieServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>CookieServlet</servlet-name> <url-pattern>/cookieServlet</url-pattern> </servlet-mapping>
cookie.html
<base href="http://localhost:8080/13_cookie_session/">
<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
服务器如何获取Cookie
protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //遍历所有的Cookie Cookie[] cookies = request.getCookies(); for (Cookie cookie: cookies){ response.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]"+"<br/>"); } //查找特定的Cookie Cookie iWantCookie = CookieUtils.findCookie("key1",cookies); } }
查找特定的cookie
//查找指定名称的cookie对象 public class CookieUtils { public static Cookie findCookie(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; } }
Cookie值的修改
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*方案一*/
//覆盖之前的
Cookie cookie = new Cookie("key1","value111");
response.addCookie(cookie);
/*方案二*/
//1 先找到需要修改的Cookie对象
Cookie cookie1 = CookieUtils.findCookie("key1",request.getCookies());
//2 调用setValue()方法赋予新值
cookie1.setValue("value111");
//3 调用response.addCookie()
response.addCookie(cookie1);
}
Cookie在浏览器中查看
Application中查看Cookie
Cookie的生命控制
Cookie的生命控制是指如何管理Cookie什么时候被销毁
setMaxAge
()
- 正数:指定秒数之后过期
- 负数:关闭浏览器之后销毁(默认-1)
- 0 :立刻销毁Cookie
protected void defaultCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("default1","value1");
//-1是默认值
cookie.setMaxAge(-1);
response.addCookie(cookie);
}
protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = CookieUtils.findCookie("default1",request.getCookies());
if (cookie!=null){
//表示立即删除
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
protected void life1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("default1","value1");
//存活一个小时(就算关闭浏览器也能存活)
cookie.setMaxAge(60*60);
response.addCookie(cookie);
}
Cookie有效路径Path设置
Cookie的Path属性可以有效过滤哪些Cookie可以发送给服务器,哪些不发;进行有效过滤
理解
CookieA
--------path=/工程路径
CookieB
--------path=/工程路径/abc
请求地址判断:
- http://ip:port/工程路径/
a.html
CookieA
发送CookieB
不发送- http://ip:port/工程路径/
abc/a.html
CookieA
发送(后面路径 的不用看)CookieB
发送
//path属性
protected void testPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("path1","path1");
//获取工程路径request.getContextPath()
cookie.setPath(request.getContextPath()+"/abc");// 工程路径/abc
response.addCookie(cookie);
}
免用户名登录
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="http://localhost:8080/13_cookie_session/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 { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); if ("gao123".equals(username) && "123456".equals(password)){ //创建一个Cookie对象 Cookie cookie = new Cookie("username",username); cookie.setMaxAge(60*60*24*7);//Cookie保存一周时间(也就是用户名保存一周时间) response.addCookie(cookie); System.out.println("登陆成功"); }else{ System.out.println("登陆失败"); } }
web.xml
<servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>com.gw.servlet.LoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/loginServlet</url-pattern> </servlet-mapping>
Session(服务器端)
什么是Session
- Session就是一个接口(
HttpSession
) - Session会话,就是用来维护一个客户端和服务器之间关联的一种技术
- 每个客户都有自己的一个Session会话
- Session会话中,我们经常用来保护用户登录之后的信息
如何创建Session和获取
request.getSession
()
- 第一次调用是:创建Session会话
- 之后调用都是: 获取之前创建的Session会话对象
isNew
() :判断是不是刚创建出来的
- true: 表示刚创建的
- false: 表示获取之前的会话对象
每个会话都有一个身份证号,也就是ID值,唯一的;getId
()得到Session会话的id值
SessionServlet
创建和获取
public class SessionServlet extends BaseServlet { protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建和获取Session对象 HttpSession session = request.getSession(); //判断当前的Session会话是否是新创建的 boolean isNew = session.isNew(); //获取唯一标识ID String id = session.getId(); response.getWriter().write("唯一标识ID"+id); response.getWriter().write("是否是新创建的"+isNew); } }
web.xml
<servlet> <servlet-name>SessionServlet</servlet-name> <servlet-class>com.gw.servlet.SessionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>SessionServlet</servlet-name> <url-pattern>/sessionServlet</url-pattern> </servlet-mapping>
<li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
Session域中的数据
//存储 protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.getSession().setAttribute("key1", "value1"); response.getWriter().write("往Session域中已经存储了数据"); } //获取 protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Object key1 = request.getSession().getAttribute("key1"); response.getWriter().write("Session中获取的值"+key1); }
<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li> <li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>
Session生命周期
Session超时 指的是客户端两次请求的最大间隔时长
-
Session的默认超时时间为30分钟
在Tomcat服务器的配置文件
web.xml
中默认有如下的配置,表示配置了Tomcat的所有Session超时时长为30分钟<session-config> <session-timeout>30</session-timeout> </session-config>
-
如果在某个web工程下修改了
web.xml
文件的上述配置信息的超时时间,则整个web下的session都是修改后的值 -
如果只需要修改特定的Session的超时时间,则需要如下方法
默认时长
//获取Session的默认超时时长
protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int maxInactiveInterval = request.getSession().getMaxInactiveInterval();
response.getWriter().write("默认超时时间为"+maxInactiveInterval);
}
修改超时时长
//修改3秒超时时长
protected void life3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(3);
response.getWriter().write("当前Session设置为3秒后超时");
}
立即销毁
//让Session马上超时
protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//马上销毁
session.invalidate();
response.getWriter().write("当前Session设置立即销毁");
}
Session和浏览器之间关联的内幕
er().write(“当前Session设置为3秒后超时”);
}
##### **立即销毁**
```java
//让Session马上超时
protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//马上销毁
session.invalidate();
response.getWriter().write("当前Session设置立即销毁");
}
Session和浏览器之间关联的内幕
声明:学自尚硅谷的视频整理而成