cookie和session的代码实现
cookie和session的代码实现
1、设置cookie
今天笔试题考的是cookie的设置,我竟然选了request也可以设置cookie,我的天呀。
我们来看如何在response设置吧

public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
Cookie c = new Cookie("name","jenkins");
resp.addCookie(c);
}

这样子设置,实际上是在返回的消息头中加了一个key-value,key为Set-Cookie,value也是key-value的形式,上面的就是:name=jenkins,多个cookie用分号(;)隔开
消息头中的样式是:Set-Cookie:name=jenkins;JSESSIONID=ERERE23343423
其实如果要在request中把cookie返回到服务器端,我们可以在请求的消息头中加一个值:

package servletbase; import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient; public class MyServlet01 extends HttpServlet{ public void postCookieToServer(){
HttpClient client = new HttpClient();
List<Header> headers = new ArrayList<Header>();
//把key为JSESSIONID的cookie上传到服务器,服务器会根据这个id来判断
//发起该会话的用户是不是之前登录过,做鉴权
headers.add(new Header("cookie","JSESSIONID=RERER3"));
//设置消息头
client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);
} }

2、查询Cookie
在请求对象中获取:

public void getCookieFromRequest(HttpServletRequest request){
//获取cookie数组
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
//获取cookie的key-value
String name = cookie.getName();
String value = cookie.getValue();
}
}

3、修改Cookie

public void updateCookieFromRequest(HttpServletRequest request,HttpServletResponse response){
//获取cookie数组
Cookie[] cookies = request.getCookies();
for(Cookie cookie:cookies){
//修改cookie的value
String name = cookie.getName();
if(name.equals("city")){
cookie.setValue("guangzhou");
response.addCookie(cookie);
}
}
}

4、Cookie的编解码(value为中文时需要编码,否则访问时会报错)

//编码
Cookie c = new Cookie("city",URLEncoder.encode("广州","utf-8")); //解码
String value = c.getValue();
value = URLDecoder.decode(value,"utf-8");

5、Cookie的其他方法

//设置生存时间,单位是秒,默认小于零,保存在内存中。等于零是即刻删除
cookie.setMaxAge(30) //设置路径,浏览器访问服务器时只向cookie路径或者子路径发送cookie,以下访问/web/index.html是会发cookie,但访问/myweb/index.html就不会了
cookie.setPath("/web");

6、Cookie的限制
a、可以被用户限制
b、保存在浏览器,不安全,敏感数据要进行加密
c、只能保存少量数据,大约4k左右
d、个数有限制
e、只能保存字符串
7、Session定义和工作原理
简单来说Session就是服务器为每一个访问的浏览器分配的内存空间,它有一个唯一的id,并且会将这个jsessionid以cookie的形式发送到浏览器(服务器调用了getSession()方法才会返回jsessionid到浏览器,并不是每个请求过来都返回),浏览器再次访问时就会把这个jsessionid发送到服务器,服务器就能找到session对象。
如果浏览器再次访问(请求消息头中带有jessionid)时,服务器能找到对应的sessionid,则服务器不再返回sessionid到浏览器。
8、获取Session

//参数为true时一定会返回session对象
HttpSession session = request.getSession(true);
//不加参数默认是true
HttpSession session = request.getSession(); //参数为false时,则没有sessionid时返回null
//有sessionid,但找不到session对象时也返回null,能找到session对象就返回该对象
HttpSession session = request.getSession(false);

9、使用Session绑定对象
|
1
2
3
4
5
6
7
8
9
|
//绑定对象void session.setAttribute(String name,Object boj);//获取绑定对象Object session.getAttribute(String name);//移除绑定对象void session.removeAttribute(String name);//删除session对象session.invalidate(); |
10、Session超时
服务器会将空闲时间过长的session对象删除以节省内存空间资源,一般是30分钟
在tomcat的conf/web.xml文件夹设置(单位是分钟):
<session-config>
<session-timeout>30</session-timeout>
</session-config>
通过编程修改:
void session.setMaxInactiveInterval(int seconds)
11、浏览器禁用cookie后果及解决方法
浏览器禁用cookie后,session就不能用了,因为jsessionid不能在浏览器保存。
解决办法:使用URL重写方法解决,就是在重定向时在url中加sessionid参数,就不需要浏览器保存了。看以下的例子,假如登录验证过程了,需要重定向到首页

if(name.equals("admin") && pwd.equals("admin")){
session.setAttribute("name",name);
//重定向到首页
//response.sendRedirect("index.jsp");
//改为,其会在路径后面加上jsessionid,
//System.out.println("url:" + resp.encodeRedirectURL("index.html")); --> url:index.html;jsessionid=4E885D5D87247441F761C96ACA9A7B68
response.sendRedirect( response.encodeRedirectURL("index.jsp"));
}

登录之后我们就可以把sessionid保存到页面,访问时把它带上就好了,可以在url后面加上sessionid,如下:
localhost:8080/testweb/servlet01;jsessionid=4E885D5D87247441F761C96ACA9A7B68
另外如果在服务器端没有生成session对象,服务器是不会返回sessionid的cookie到浏览器的,即在服务器端要调用request.getSession()
12、Session的优缺点
优点:
a、安全(状态保存在服务器端)
b、能保存的数据类型更多,cookie只能是字符串
c、能保存更多数据
缺点:
session将状态保存在服务器端,占用服务器内存,当用户量过大时,会严重影响服务器性能。
cookie和session的代码实现的更多相关文章
- java的会话管理:Cookie和Session
java的会话管理:Cookie和Session 1.什么是会话 此处的是指客户端(浏览器)和服务端之间的数据传输.例如用户登录,购物车等 会话管理就是管理浏览器客户端和服务端之间会话过程产生的会话数 ...
- 【转】Cookie和Session区别和联系详解
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- 理解Cookie和Session机制(转)
目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...
- Django实现表单验证、CSRF、cookie和session、缓存、数据库多表操作(双下划綫)
通常验证用户输入是否合法的话,是前端js和后端共同验证的,这是因为前端js是可以被禁用的,假如被禁用了,那就没法用js实现验证合法与否了,也就是即使用户输入的不合法,但是也没提示,用户也不知道怎么输入 ...
- php的cookie和session相同主域名共享
如何使用chrome查看cookie和session详见另一篇文章,点这里 首先说cookie, $cookieDomain = '.elf.com'; setcookie('elf', 'im el ...
- cookie,session原理,以及如何使用chrome查看。
首先,先补充下chrome浏览器的使用. 1.1.php源码: <?php $cookieDomain = '.elf.com'; setcookie(, '/', $cookieDomain) ...
- Django之Form、CSRF、cookie和session
Django是一个大而全的web框架,为我们提供了很多实用的功能,本文主要介绍Form.CSRF.cookie和session 一.Form 在web页面中form表单是重要的组成部分,为了数据安全和 ...
- php COOKIE和SESSION的一些理解
web服务器是基于http协议的,而http协议是无状态的,导致任意两个请求之间没有联系.但是我们登录网站后,它却能记住我们的身份,这个过程中一定使用了某个标识来区别我们的身份.对于简单数据传输的我们 ...
- 关于Cookie和Session的优缺点
关于Cookie和Session的优缺点 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. Cookie的优缺点:优点:极高的扩展性和可用 ...
随机推荐
- 破解金盘gdlisxp系统
1.现在要破解的金盘gdlisxp系统版本 2.首先在你电脑上要有脱壳工具AspackDie,和OllyDBG动态调试工具,电脑上装好金盘软件. 3.用AspackDie进行对金盘应用程序脱壳处理,生 ...
- 取消双向绑定、输出html代码
1.取消双向绑定,在绑定的值前加*号. 如: <div id="app"> <p>{{*message}}</p> </div> 2 ...
- Linux忘记密码的解救方法
Linux版本 centos5.6 64bit 环境 vmware 忘记密码 解决方法1: 重启系统, 一.重启系统,在系统引导前按任意键进入菜单.如图:GRUB: 在引导装载程序菜单上,用上下方向键 ...
- [习题]日历(Calendar)控件的障眼法(.Visible属性),使用时才出现?不用就消失?
原文出處 http://www.dotblogs.com.tw/mis2000lab/archive/2013/09/02/calendar_icon_visible.aspx [习题]日历(Cal ...
- ng-summit and $watch() funciton
<div ng-app> <form ng-submit="requestFunding()" ng-controller="StartUpContro ...
- public、private、protected 与 默认 等访问修饰符
1)public(公共的):被public修饰的属性和方法可以被所有类访问. 2)private(私有的):被private修饰的属性和方法只能在改类的内部使用. 3)protected(受保护的): ...
- move和转发
总的来说C++09跟C++98相比的变化是极其重大的.这个变化体现在三个方面,一个是形式上的变化,即在编码形式层面的支持,也就是对应我们所谓的编程范式(paradigm).C++09不会引入新的编程范 ...
- .NET开源工作流RoadFlow-流程设计-流转条件设置(路由)
当一个步骤后面有多个步骤时,可以设置为根据设置条件系统自动判断该流向哪些步骤,也叫路由. roadflow没有单独的路由步骤来设置条件,流程条件通过双击连线弹出条件设置框来设置. 1.sql条件 即通 ...
- SQL 跟踪方法相关介绍
oracle sql跟踪方法:1.sql_trace打开跟踪:alter session set sql_trace=true;为跟踪文件做标记:alter session set tracefile ...
- 【转】Oracle中如何用一条SQL快速生成10万条测试数据
转自http://blog.csdn.net/welken/article/details/4971887 做数据库开发或管理的人经常要创建大量的测试数据,动不动就需要上万条,如果一条一条的录入, ...