服务器端如何生成sessionid
① 什么是sessionid
Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID.
② sessionID是怎么在客户端和服务器端传递的
session的工作原理如下,即为sessionid在客户端和浏览器端的交互:
当浏览器A去访问一个有打开了session机制的php1文件时,session文件会创建,同时会将该session文件的id以cookie的形式
发送给浏览器(session文件的id号可以session_id()这个函数来获得)。当浏览器A没有关闭(会话没有结束),反而去访问另一个也开启
session机制的php2文件时,那么该sessionid也会跟着http协议从浏览器发送到服务器上,访问到之前创建的session文件,将相
关内存也保存到该session文件内。
当我们开启了另一个浏览器B,也就是创建了另一个会话,那么该浏览器访问一个带有开启session机制的网页,会另外生成一个新的session文件,并将该session文件id号以cookie的形式传递给浏览器B.
可以这么理解,一个会话对应一个sessionid。
③ php session是怎样生成的
session是在服务器端保持用户会话数据的一种方法,对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议,服务器响应完之后就失去了与浏览器的联系,最早,Netscape将cookie引入浏览器,使得数据可以客户端跨页面交换,那么服务器是如何记住众多用户的会话数据呢?
首先要将客户端和服务器端建立一一联系,每个客户端都得有一个唯一标识,这样服务器才能识别出来。建议唯一标识的方法有两种:cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫”PHPSESSID”的cookie(可以通过php.ini修改session.name值指定),如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器(修改php.ini中session.use_trans_sid等参数)。
我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件,这个其实就是session id “vv9lpgf0nmkurgvkba1vbvj915″对应的数据。真相就在这里,客户端将session id传递到服务器,服务器根据session id找到对应的文件,读取的时候对文件内容进行反序列化就得到session的值,保存的时候先序列化再写入。
事实就是这样,所以如果服务器不支持session或者你想自定义session,完全可以DIY,通过PHP的uniqid生成永不重复的session id,然后找个地方存储session的内容即可,你也可以学flickr把session存储在MySQL数据库中。
④ Session ID是什么意思
SessionID存放在服务器内存和客户机的Cookie里面。当用户发出请求时,服务器将用户Cookie里面记录的SessionID和服务器内存中的SessionID进行比对,从而找到这个用户对应的Session进行操作。
1.Session用来追踪每个用户的会话,使用服务器生成的SessionID进行标识,用以区分用户。Session存放在服务器的内存中,SessionID存放在服务器内存和客户机的Cookie里面。
2.在计算机中,尤其是在网络应用中,称为“会话控制”。Session 对象存储特定用户会话所需的属性及配置信息。
3.当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
4.如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。有关使用 Session 对象的详细信息,会话状态仅在支持 cookie 的浏览器中保留。
5.当用户发出请求时,服务器将用户Cookie里面记录的SessionID和服务器内存中的SessionID进行比对,从而找到这个用户对应的Session进行操作。
⑤ session的ID是怎么得出的
session的ID是由服务器随机生成长整型
⑥ sessionId的生成机制是什么
跟IP和端口这些无关吧,应该跟客户端,浏览器这些有关。当浏览器第一次请求时,服务器创建一个session对象,同时生成一个sessionId,并在此次响应中将sessionId 以响应报文的方式些回客户端浏览器内存或以重写url方式送回客户端,来保持整个会话。关闭此浏览器窗口,其内存中的sessionId也就随之销毁。重新请求时,会重新生成一个sessionId给客户端浏览器,并存在浏览内存中。
SessionID 值是使用保证唯一性和随机性的算法生成的,其中保证唯一性的目的是确保会话不冲突,保证随机性的目的是确保怀有恶意的用户不能使用新的 SessionID 来计算现有会话的 SessionID。
⑦ SessionID是由服务器的那部分程序生成的
Session一般在服务器上设置了一个30分钟的过期时间,当客户停止活动后自动失效。Session 中保存和检索的信息不能是基本数据类型如 int, double等,而必须是java的相应的对象,如Integer, Double.
Httpsession具有如下API:
getId此方法返回唯一的标识,这些标识为每个session而产生。当只有一个单一的值与一个session联合时,或当日志信息与先前的sessions有关时,它被当作键名用。
GetCreationTime返回session被创建的时间。最小单位为千分之一秒。为得到一个对打印输出很有用的值,可将此值传给Date constructor 或者GregorianCalendar的方法setTimeInMillis.
GetLastAccessedTime返回session最后被客户发送的时间。最小单位为千分之一秒。
GetMaxInactiveInterval返回总时间(秒),负值表示session永远不会超时。
getAttribute取一个session相联系的信息。(在jsp1.0中为 getValue)
Integer item = (Integer) session.getAttrobute("item")//检索出session的值并转化为整型
setAttribute提供一个关键词和一个值。会替换掉任何以前的值。(在jsp1.0中为putValue)
session.setAttribute("ItemValue", itemName);// ItemValue 必须不是must简单类型
在应用中使用最多的是getAttribute和setAttribute.现以一个简单的例子来说明session的应用,test1.jsp(信息写入session),test2.jsp(从session读出信息)。
test1.jsp
<HTML>
<HEAD>
<TITLE> Document </TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
session.setAttribute("str",new String(“this is test”));
</BODY>
</HTML>
test2.jsp
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<%
String ls_str=null;
ls_str=(String)session.getAttribute("str");
out.println(“从session里取出的值为:”+ls_str);
%>
</BODY>
</HTML>
⑧ httpsession中的SessionID是如何生成的
//excel.java
package net.oicp.jing31;
import java.io.File;
import javax.servlet.http.HttpSessionListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSession;
public class excel implements HttpSessionListener
{
public void sessionCreated(HttpSessionEvent se)
{
}
public void sessionDestroyed(HttpSessionEvent se)
{
System.out.println("The session has been destoryed!!");
}
}
如何获得?
如何在JSP工程中填加自己的listener
我把web.xml文件里添加如下内容:
<listener>
<listener-class>net.oicp.jing31.excel</listener-class>
</listener>
public void sessionDestroyed(HttpSessionEvent se)
{
System.out.println("sessionid:\t"+se.getSession().getId());
}
⑨ 如何通过HttpPost从服务器上获得一个sessionid
ava's Web Service is different from HttpPost, HttpGet and HttpResponse that kind of things. It is more easy to pass anything, any Object you like.
如果要利用Web Service返回一个sessionid的话,可以使用从Server返回返回值的形式,也可以在Client端实现SOAPHandler,然后在public boolean handleMessage(SOAPMessageContext context)方法中处理response的cookie,利用正则表达式获取JSESSIONID的值。
因为handleMessage每次都会首先执行,不管是request还是response过程,所以我只谈谈第一种方法,顺便对session过期也做下测试。以下是Demo及说明:
(一)创建Server类
public class HelloServer {
private String sessionid;
public WebServiceContext wsContext;
public String onLogin(){
return null;
}
public String sayHello(String sessionid) {
return null;
}
}
(二)使用MyEclipse工具生成Delegate类
@javax.jws.WebService(targetNamespace = "http://ws.jax_ws.honwhy.com/", serviceName = "HelloServerService", portName = "HelloServerPort", wsdlLocation = "WEB-INF/wsdl/HelloServerService.wsdl")
public class HelloServerDelegate {
HelloServer helloServer = new HelloServer();
public String onLogin() {
return helloServer.onLogin();
}
public String sayHello(String sessionid) {
return helloServer.sayHello(sessionid);
}
}
利用MyEclipse工具生成了Delegate类之外,还生成了sun-jaxws.xml和wsdl路径下的HelloServerService_schema1.xsd和HelloServerService.wsdl文件。
(三)简单修改Delegate类和Server类,加入session部分代码
查看sun-jaxws.xml文件就可以知道HelloServerPort是由HelloServerDelegate类实现的,而在Delegate类中只是new了一个HelloServer对象,然后调用相应方法实现onLogin和sayHello的。参考网上“Web Service管理session”相关的文章,我们可以在HelloServer中加入相关代码获取session,不过本文的建议是在Delegate类中注入@Resource而不是在Server类中注入,不修改sun-jaxws.xml在Server中注入是不会成功的。
参考代码:
public class HelloServerDelegate {
@Resource
private WebServiceContext wsContext;
HelloServer helloServer = new HelloServer();
public String onLogin() {
helloServer.wsContext = this.wsContext;
return helloServer.onLogin();
}
public String sayHello(String sessionid) {
return helloServer.sayHello(sessionid);
}
}
要将wsContext传递给HelloServer,就必须在HelloServer类中新建一个WebServiceContext类型的成员变量,为了方便本文把它设置为public域的变量,且看Server类新增的代码:
public WebServiceContext wsContext;
public String onLogin(){
MessageContext mc = wsContext.getMessageContext();
HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
if (session == null) {
throw new WebServiceException("No session in WebServiceContext");
}
sessionid = session.getId().toString();
return sessionid;
}
(四)设置session过期时间
设置session过期有两种方式可以选择,一种是在sessionid返回之前设置当前session的有效期,使用setMaxInactiveInterval方法,提供int类型的参数,单位是秒。另外一种是在web.xml中加入session-config标签,单位是分钟。
<session-config>
<session-timeout>1</session-timeout>
</session-config>
(五)在sayHello方法中加入必要的逻辑
从Client发起请求首先调用的onLogin,然后才是sayHello,从onLogin调用获得的sessionid作为调用sayHello的参数。
public String sayHello(String sessionid) {
MessageContext mc = wsContext.getMessageContext();
HttpSession session = ((javax.servlet.http.HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession();
if (session == null) {
throw new WebServiceException("No session in WebServiceContext");
}
if(sessionid.equals(session.getId().toString())) {
System.out.println(“Hello!”);
return “OK”;
} else {
return “EXPIRED”;
}
}
(六)创建Client工程,使用工具生成Web Service需要的类
在创建Client工程前可以将Server工程运行起来,从Server工程的HelloServerService.wsdl文件中找到,这个地址会在接下来使用得到。
在Client工程中新建一个Web Service Client,填入刚才的地址加入”?WSDL”,生成Web Service所需的类。
(七)创建Client类用来发起请求与Server通信
public class HelloClient {
private static String sessionid;
public static void main(String[] args) {
HelloServerService service = new HelloServerService();
HelloServerDelegate port = service.getHelloServerPort();
// 设置保留session
((BindingProvider)port).getRequestContext().put(BindingProvider.SESSION_MAINTAIN_PROPERTY,true);
// 第一次调用onLogin获得sessionid
sessionid = port.onLogin();
while(true){
try {
// 休息超过session有效期
Thread.sleep(65000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String result = port.sayHello(sessionid);
if(result.equals("OK")){
System.out.println("session is"+result);
} else {
System.out.println("session is"+result);
break;
}
}// end of while loop
System.out.println("HelloClient::end of while loop");
⑩ js怎么获得服务器端的session id
这种只能够再后台服务器代码里面设置一个方法,在前端Ajax请求的时候,进行返回sessionId信息了。因为不知道具体的语言所以所得比较笼统(比如:Java的话可能会说再action层写一个AJAX处理的方法;PHP不是很好说一般是controller层中写)