一.cookie和session
1.业务场景
- 登录时要记录账号
- 后续的查询,增加,修改等页面上显示此账号
2.错误的解决方案
1) request
- 登录是一个请求,查询是另外一个请求
- 2个请求服务器创建2个request,所以无法通过request共享这样的数据
2) config
- 可能使用LoginServlet处理登录请求
- 可能使用FindServlet处理查询请求
- 2个Servlet使用2个不同的config,所以无法通过config共享这样的数据
事实上config只能读取常量,无法存取变量
3) context
- 浏览器和服务器是1对多的关系
- 每个用户登录时传入的数据都是code=xxx
- 若将这样的数据存入唯一的context是有冲突的
3.cookie和session专门解决此类问题
- 它们内部的数据可以在多个请求之间共用
- 它们内部的数据可以在多个Servlet之间共用
- 服务器会给每个浏览器创建1组cookie,1个session
上述规则由tomcat保障
4.cookie和session的区别(面试题)
- cookie存储在浏览器上,服务器压力小,不安全
- session存储在服务器上,服务器压力大,安全
5.使用建议
- 重要的数据存入session
- 其他的数据存入cookie
二.cookie使用方式
1.基本用法
- 创建cookie
- 发送cookie
- 获取cookie
2.生存时间
- 修改cookie的生存时间: setMaxAge(n)
3.如何存中文
- 存数据时使用URLEncoder对中文转码
- 取数据时使用URLDecoder对中文解码
4.有效路径
- setPath(“”)
三.include中的相对路径
案例:
FindCostServlet.java
package web;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class FindCostServlet extends HttpServlet {
//相当于MainServlet.findCost()@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {Cookie[] cs = req.getCookies();if(cs != null) {res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();for(Cookie c : cs) {out.println(c.getName()+":"+c.getValue());}out.close();}}}
IndexServlet.java
package web;import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class IndexServlet extends HttpServlet {
//相当于MainServlet.toIndex()@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//浏览器再次访问此服务器时,会自动传入//之前保存的cookie,现在获取此cookie.Cookie[] cs = req.getCookies();//将cookie中的数据显示到页面上if(cs != null) {res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();for(Cookie c : cs) {String value = URLDecoder.decode(c.getValue(),"utf-8");out.println(c.getName()+":"+value);}out.close();}}}
LoginServlet.java
package web;import java.io.IOException;
import java.net.URLEncoder;import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginServlet extends HttpServlet {
//相当于MainServlet.login()@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//接收传入的参数String code = req.getParameter("code");//存入cookie,给其他功能使用//1.一个cookie对象中只能存一个数据//2.所存的数据必须是字符串//3.可以创建更多个cookie以保存更多的数据Cookie c1 = new Cookie("code",code);//设置cookie的生存时间c1.setMaxAge(600000);//将cookie存入response,在服务器响应时,//会自动把cookie发送给浏览器.res.addCookie(c1);//向cookie中存中文Cookie c2 = new Cookie("city",URLEncoder.encode("北京", "utf-8"));res.addCookie(c2);//设置cookie的有效路径Cookie c3 = new Cookie("name","Tarena");c3.setPath("/jsp3");res.addCookie(c3);}}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><display-name>jsp3</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>login</servlet-name><servlet-class>web.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/main/login</url-pattern></servlet-mapping><servlet><servlet-name>index</servlet-name><servlet-class>web.IndexServlet</servlet-class></servlet><servlet-mapping><servlet-name>index</servlet-name><url-pattern>/main/index</url-pattern></servlet-mapping><servlet><servlet-name>findCost</servlet-name><servlet-class>web.FindCostServlet</servlet-class></servlet><servlet-mapping><servlet-name>findCost</servlet-name><url-pattern>/cost/find</url-pattern></servlet-mapping></web-app>
四.session
五.session
1.基本用法
- 获得session: request.getSession()
- 存数据: session.setAttribute()
- 取数据: session.getAttribute()
- 删数据: session.removeAttribute()
- 销毁: session.invalidate()
2.超时时间
- 默认是30分钟
- 可以在配置文件中修改此时间
3.cookie禁用时session怎么办?
- 解决方案: URL重写
4.session销毁
案例:
FindCostServlet.java
package web;import java.io.IOException;
import java.io.PrintWriter;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class FindCostServlet extends HttpServlet {
//相当于MainServlet.findCost()@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//获取旧的session,此session是在//登录请求中服务器自动创建的.HttpSession session = req.getSession();String code = (String) session.getAttribute("code");//输出数据res.setContentType("text/html;charset=utf-8");PrintWriter out = res.getWriter();out.println(code);out.close();}}
LoginServlet.java
package web;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class LoginServlet extends HttpServlet {
//相当于MainServlet.login()@Overrideprotected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {//接收参数String code = req.getParameter("code");//存入session//第一次访问session时服务器自动创建它,//当前登录就是第一次访问,就创建sessionHttpSession session = req.getSession();//session中可以存任意类型的数据session.setAttribute("code", code);//服务器向浏览器发送响应时,会自动创建//一个cookie,并将SID存入此cookie,再//将此cookie发送给浏览器.服务器会将//此cookie的有效路径设置为项目.}}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><display-name>jsp4</display-name><welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list><servlet><servlet-name>login</servlet-name><servlet-class>web.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/main/login</url-pattern></servlet-mapping><servlet><servlet-name>findCost</servlet-name><servlet-class>web.FindCostServlet</servlet-class></servlet><servlet-mapping><servlet-name>findCost</servlet-name><url-pattern>/cost/find</url-pattern></servlet-mapping><!-- 配置session的ID释放时长 --><session-config><session-timeout>1</session-timeout></session-config></web-app>
六.cookie和session理解
1.通俗的理解
- 它们都是暂存数据的对象,特征:
- 内部的数据可以在多个请求之间共用
- 内部的数据可以再多个组件之间共用
- 服务器会给每个浏览器创建一组cookie,一个session
2.专业的理解
- HTTP协议是一个无状态协议,即服务器默认不会记住浏览器
- cookie和session就是用来管理这种状态,让服务器记住浏览器的
- 即:它们都是用来进行状态管理的对象
状态: 用来证明浏览器曾经访问过的证据(数据)