SERVLETJSP Unit07: 状态管理-Session

来源:互联网 发布:win10usb端口重置失败 编辑:程序博客网 时间:2024/05/29 11:48

一.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()    @Override    protected 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()    @Override    protected 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()    @Override    protected 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()    @Override    protected 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()    @Override    protected void service(        HttpServletRequest req,         HttpServletResponse res) throws ServletException, IOException {        //接收参数        String code = req.getParameter("code");        //存入session        //第一次访问session时服务器自动创建它,        //当前登录就是第一次访问,就创建session        HttpSession 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就是用来管理这种状态,让服务器记住浏览器的
  • 即:它们都是用来进行状态管理的对象

状态: 用来证明浏览器曾经访问过的证据(数据)

原创粉丝点击