当前位置: 代码迷 >> 综合 >> SERVLETJSP Unit07: 状态管理-Session
  详细解决方案

SERVLETJSP Unit07: 状态管理-Session

热度:56   发布时间:2023-12-11 15:02:56.0

一.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就是用来管理这种状态,让服务器记住浏览器的
  • 即:它们都是用来进行状态管理的对象

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

  相关解决方案