状态管理Cookie与Session

转发与重定向的区别

  • 转发所涉及的web组件可以共享同一个request和response
    而重定向不可以。(注:当请求到达容器时,容器创建request和response,当响应发送完毕,
    容器会立即销毁request和response。即request和response生存时间是一次请求与响应期间存在。)
  • 转发的地址有限制(同一个应用),重定向没有任何限制。
  • 转发之后,浏览器地址栏的地址不变,重定向会变。

容器如何处理请求资源路径

http://ip:port/appname/abc.html

默认是一个servlet,不会直接去找abc.html这个静态页面,如果没有这个servlet则会去加载这个静态页面。

处理servlet异常

  • 交给容器来处理
    • 将异常抛给容器。
    • 配置异常(web.xml)。
    • 添加异常处理页面。
  • 自己处理(编程式处理)
    • 捕获异常。
    • 编写异常处理代码,通常转发到某个异常处理页面。
    • 添加异常处理页面。

注:系统异常一般使用第一种,而对于应用异常(用户的错误引起的异常,比如输入错误的账号密码)一般使用第二种。

路径问题

连接,表单提交,重定向,转发

  • 什么是相对路径
    • 不以"/"开头的路径。(相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。)
  • 什么是绝对路径?
    • 以"/"开头的路径。(从盘符开始的路径,这是一个完整的路径。)

优先使用绝对路径,并且,不要将绝对路径写死了,而应该使用request.getContextPath()来获取。

状态管理

  • Session
  • Cookie

image

web服务器利用有限的链接提高效率。(及时释放资源)

什么是状态管理?

将浏览器与web服务器之间多次请求当做一个整体来看待,并且将多次交互所涉及的数据保存下来。

注:状态是多次交互所涉及的数据

如何进行状态管理?
  • 将状态保存在客户端。(比如Cookie技术。)
  • 将状态保存在服务器端。(比如Session技术。)
Cookie
  • 什么是Cookie
    • 服务器发送给浏览器的少量数据,用于识别客户端用户的身份,属于客户端的管理技术。
  • 工作原理
    • 当浏览器访问服务器,服务器将少量数据以set-cookie消息头的方式,发送给浏览器,浏览器会将这些数据临时保存下来。
    • 当浏览器再次访问服务器时,会将之前保存的数据以cookie消息头的方式发送给服务器。
  • 编程
    • 添加cookie
      • Cookie c = new Cookie(String name,String value);
      • response.addCookie©;
    • 读取cookie
      • Cookie[] request.getCookies();(注:有可能会返回null)
      • String cookie.getName()
      • String cookie.getValue()
  • cookie的生存时间
    • 默认情况下,浏览器会将cookie保存在内存里面。(浏览器只要不关闭,cookie就会一直存在。)
    • 设置cookie的生成时间(cookie.setMaxAge(int seconds))
      • seconds 大于0:浏览器会将cookie保存在硬盘上,以文件的形式。如果超过指定的时间,cookie会被销毁。
      • seconds 小于0:(默认值)将cookie保存在内存中。
      • seconds 等于0:删除cookie。

比如,要删除一个名称为uname的cookie。

Cookie c = new Cookie("uname","");
c.setMaxAge(0);
response.addCookie(c);

用新的替换老的,新的会在浏览器被删除。

cookie的编码问题

cookie只能保存合法的ascii字符。

中文显示不属于ascii字符,需要将中文转化成相应的ascii字符形式。

String URLEncoder.encode(String str,String charset) 该方法将中文转化为ascii字符。

String URLDecoder.decode(String str,String charset) 该方法将ascii字符转化为中文。

cookie的路径问题

  • 默认路径
    • cookie的默认路径等于添加该组件的路径:比如 /servlet08/app1/addCookie.jsp,添加了一个cookie,则该cookie的路径是/servlet08/app1。
  • 浏览器向服务器上的某个地址发请求时,会比较cookie的路径是否与要访问的地址(路径)匹配,只有符合要求的cookie才会发送给服务器。
    • 要访问的路径是cookie的路径或者其子路径,cookie才会发送给服务器。
  • 修改路径
    • cookie.setPath(String path)

cookie的限制

  • cookie可以被浏览器禁止。
  • cookie只能保存少量数据(大约是4k)
  • cookie的数量也有限制。(大约几百个)
  • cookie不安全。对于敏感数据,要加密处理。

session(会话)

  • 什么是session
    • 服务器端为了保存状态而创建的一个对象(即session对象)。
  • 工作原理
    • 浏览器访问服务器时,服务器创建一个session对象(该对象有一个唯一的id,一般称之为sessionId),同时服务器会将这个sessionId发送给浏览器。(默认以cookie的方式)
    • 当浏览器再次访问服务器时,会将这个sessionId发送给服务器,服务器依据这个sessionId就可以找到对应的session对象。
  • 如何获得session对象
    • 方式一:HttpSession request.getSession(boolean flag);
      • 当flag为true,服务器会查看请求当中是否有sessionId,
      • 如果有,则返回对应的session对象(如果session对象因为过期已经被销毁了,则创建一个新的session对象);如果没有则创建一个session对象。
      • 当flag为false,服务器会查看请求当中是否有sessionId,如果有,则返回对应的session对象(如果session对象因为过期已经被销毁了,则返回null);没有返回null。
    • 方式二:HttpSession request.getSession();(等价于request.getSession(true);)

image

session对象的使用

绑定数据到session对象上。setAttribute(String name,Object obj);依据绑定名获得绑定值(如果对应值不存在,返回null)

Object getAttribute(String name);

解除绑定:removeAttribute(String name);

session超时

服务器会把空闲时间过长的session对象删除掉。(默认的空闲时间是30分钟。)

可以修改一下配置,来修改默认的空闲时间。()

也可以通过java代码来设置空闲时间setMaxInactiveInterval(int seconds)

删除session对象

session.invalidate();

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值