创建cookie
- //如何创建cookie案例
- packagecom.tsinghua;
- importjavax.servlet.http.*;
- importjava.io.*;
- publicclassCookieTest1extendsHttpServlet{
- //处理get请求
- publicvoiddoGet(HttpServletRequestreq,HttpServletResponseres){
- //业务处理
- try{
- //处理中文乱码
- res.setContentType("text/html;charset=gbk");
- PrintWriterpw=res.getWriter();
- //当用户访问该servlet时,就将信息创建到该用户的cookie中
- //1、先在服务器端创建一个cookie
- CookiemyCookie=newCookie("color1","red");
- //2、该cookie存在的时间
- myCookie.setMaxAge(30);
- //如果不设置时间,那么Cookie将不会被保存
- //3、将Cookie写回到客户端
- res.addCookie(myCookie);
- pw.println("已经创建了Cookie");
- }catch(Exceptione){
- e.printStackTrace();
- }
- }
- }
常用的API
1.setMaxAge
cookie的有效期,正值为以秒计算过时失效,负值为关闭客户端失效,默认值为-1。
2.setDomain
用于指定只有请求了指定的域名,才会带上该cookie
3.setPath
只有访问该域名下的cookieDemo的这个路径地址才会带cookie
4.setValue
重置value的值
Session的会话流程
session对象的创建与获取
一、流程
登录接口--》验证用户名密码--》获取用户实体对象--》创建session (key,value)
其他接口调用--》获取session(key)
二、代码
-
//登录并写入缓存
-
@RequestMapping("a/login")
-
@ResponseBody
-
public String loginAction(HttpSession session, String userName, String password, HttpServletRequest request) {
-
HrUser hr=new HrUser();
-
hr.setNickName(userName);
-
session.setAttribute("userInfo", hr);
-
return "";
-
}
-
//对外获取缓存
-
@RequestMapping("a/logb") // , method = RequestMethod.POST)
-
@ResponseBody
-
public String logb() {
-
Object pp=getSession().getAttribute("userInfo");
-
String result="1";
-
if(pp!=null)
-
{
-
result=((HrUser)pp).getNickName();
-
}
-
return result;
-
}
-
//获取会话缓存内容
-
private HttpSession getSession() {
-
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
-
.getRequest();
-
return request.getSession();
-
}
三、效果
A用户 本地运行代码,先调用 a/login接口传参?userName=1234 ,再调用 a/logb 会返回1234 一存一取成功
B用户 在A用户执行完存取操作后,执行 a/logb ,不会返回任何东西,因为只有A用户的会话才有缓存,这时 B去执行 a/login接口传参?userName=12345 ,再调用 a/logb 会返回12345 A用户执行 调用 a/logb 只会返回自己会话的缓存1234
session对象存储数据
1、调用session对象的方法保存或读取客户在服务器端的有关数据。
2、session对象处理数据的方法://key都是String类型的
①public void setAttribute(String key, Object obj)//key是String类型的,value是Object类型的
②public Object getAttibute(String key)//key是String类型的,value是Object类型的,在使用的过程中,不要忘记强制转换
③public Enumeration getAttributeNamesO
④public void removeAttribute(String name)
session的生命周期
Session存储在服务器端,一般为了防止在服务器的内存中(为了高速存取),Sessinon在用户访问第一次访问服务器时创建,需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session,可调用request.getSession(true)强制生成Session。
实现会话持久化(Permanent Session)(1)
//注意,需要引用System.Runtime.Serialization.Formatters.Soap.dll程序集
public const string SESSIONDATAPATH = "C:/SessionData/" ;
private void Application_AcquireRequestState( object sender, EventArgs e)
{
System.IO.FileStream fs;
System.Runtime.Serialization.Formatters.Soap.SoapFormatter sf = new System.Runtime.Serialization.Formatters.Soap.SoapFormatter();
try
{
//获取特定的cookie,如果找不到,则退出.
HttpCookie cookie = Request.Cookies["PermSessionID"];
if(cookie == null)
{
//如果找不到,则生成一个(使用伪随机的SessionID)
cookie = new HttpCookie("PermSessionID", Session.SessionID);
//使该cookie在1星期之后到期
cookie.Expires = DateTime.Now.AddDays(7);
//将其发往客户端浏览器
< TD> Response.Cookies.Add(cookie);
}
//文件名等于该cookie的值
string permSessionId = cookie.Value;
//生成数据文件的名称
string filename = SESSIONDATAPATH + permSessionId.ToString() + ".xml";
//打开文件,如果出错,则退出
fs = new System.IO.FileStream(filename, IO.FileMode.Open);
//反序列化包含值的Hashtable Hashtable ht = (Hashtable)sf.Deserialize(fs);
//将数据移到Session集合中
Session.Clear();
foreach( string key in ht.Keys )
{
Session(key) = ht(key);
}
}
Catch(Exception ex) {}
Finally
{
< TD>if( fs != null ) fs.Close();
}
}