您的位置:首页 > 其它

session和cookie

2015-04-07 21:25 253 查看
重定向:请求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重写(过滤器)

来自传智梁桐老师
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cookie session