session和cookie

重定向:请求2次,tomcat创建了2个request对象

转发:  请求1次,tomcat创建了2个request对象
将第一个request中的内容,拷贝给第二个request。值相同,对象不同


会话:当访问web资源之后,通过连接继续请求当前站点的资源,然后关闭浏览器的整个过程。

会话技术:cookie、session(两个都是回话级别的)


    * cookie:将服务器的数据保存到浏览器端的技术
* 要求保存数据:服务器
* 保存数据:浏览器
* IE;将cookie保存到指定目录中,以文件的形式存储

* 火狐或谷歌:将cookie保存到指定的文件中


* 使用HTTP协议进行通信
* 会话级cookie:当整个会话结束后(浏览器关闭),

 cookie信息将被删除(cookie在内存中,默认setMaxAge(0) ,单位s)


* 持久化cookie:将cookie保存到硬盘中
* setMaxAge
* 单位:秒
* 如果设置的值为零,则进行删除操作。
* request.getCookies();获得当前web项目的所有的cookie信息
* 获得当前浏览器中的cookie
* 获得当前servlet所在目录,以及之上的所有目录下的cookie信息
* 通过setPath可以设置cookie的访问路径
 (一个项目中保存的cookie都在该项目文件夹中)
* 在cookie中存放中文
* 编码:String returnData  = URLEncoder.encode(data, "UTF-8");
* 解码:String value = URLDecoder.decode(c.getValue(), "UTF-8");

* cookie的value可以设置多少个字符:4kb


    *session:服务器在服务器端创建一个内存区域,用来存放当前用户的所有信息,通过cookie关联。


* 前提:必须使用cookie
* session:
* tomcat创建
* 销毁:默认30分钟(可以修改,单位min)
        * 当用浏览器访问web站点后,如果web站点有servlet创建了 getSession().getAttribute("**"),
 那么就创建了一个session.
 tomcat自动添加cookie,JSESSIONID=DFE75A1E9CCAA1591F900FA3B1AEE9F3 ,会话级
 下次再访问这个servlet就有session了,不需要再创建,但是如果你把浏览器关闭,
 会话级关闭,再访问这个servlet又要重新创建,如果不想重新创建,那么就需要把这个
 cookie持久化:
	  //创建cookie
	  Cookie cookie = new Cookie("JSESSIONID",session.getId());
	  //设置有效时间(持久化)
	  cookie.setMaxAge(60*30);
	  //通知浏览器
	  response.addCookie(cookie);

* URL重写
* 问题描述:
 为了解决用户把安全级别调很高,禁用cookie,那么服务器创建的cookie
(JSESSIONID=DFE75A1E9CCAA1591F900FA3B1AEE9F3)也就没法创建,那么即使不关闭浏览器
 session都访问不到,只能每次都创建一个新的。
 这样我们可以采用:URL重写
* 实质就是在url链接后面加上session的id信息,也就是
 在链接后面加上  ;jsessionid=***** ,注意是小写


        *问题:不知道浏览器是否禁用cookie,如果用户没禁用,那么加上后面一串显得多余


*解决方法:response提交了两个方法来解决,如果用户禁用了cookie,那么就在链接后
加上;jsessionid=**,如果没有禁用,讲cookie保存到用户浏览器,不要后面那一串
两个方法为:1、public String encodeURL(String url)
    2、public String encodeRedirectURL(String url)
*一般情况选择encodeURL
* 两个方法区别在于,如果参数为空字符串,返回结果不同

 1、url = null    -- >返回绝对路径

 2、url = null    -- >不做处理

源码如下:

public String encodeURL(String url) {
		String absolute = toAbsolute(url);   //加上绝对路径
		if (isEncodeable(absolute)) {     //判断是否要添加jsessionid后缀
			if(url.equalsIgnoreCase("")){  //如果url为空,
				url = absolute;
			}
			//在后面加上后缀jsessionid
			return (toEncoded(url, request.getSessionInternal().getIdInternal()));
		} else {
			//如果不需要加后缀,直接返回
			return (url);
		}
	}
	 public String encodeRedirectURL(String url) {
		if (isEncodeable(toAbsolute(url))) {
			return (toEncoded(url, request.getSessionInternal().getIdInternal()));
		} else {
			return (url);
		}
	}

* 注意:参数url必须有效,否则返回没有改变的URL
* 当使用"/"开头,相对于web站点
* response.encodeURL("/day07/urlSessionServlet2")
* /day07/urlSessionServlet2;jsessionid=F85DB5EFDDB9A6B170AF2B4959EFC4FC
* 获得Web的绝对路径
String absolute = toAbsolute(url);
* http://localhost:8080/day07/
* 总结:
* 验证码的session保存验证码,需要考虑用户的Cookie是否禁用了
* 将所有的链接全部进行URL重写(过滤器)

来自传智梁桐老师

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值