您的位置:首页 > 其它

J2EE学习总结之——会话数据管理cookie和Session

2016-08-07 16:38 573 查看

一、什么是会话?

简单来说:

     会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

     有状态会话:用户甲访问网站A,下次再访问A网站,A网站知道这甲这个用户曾经访问过自己,这称之为有状态会话。

二、javaWeb在会话过程中要解决的问题:

   每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。

三、保存会话数据两种技术

1、cookie:是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

2、session:是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

四、Cookie操作实例:

1、设置cookie的java类

<span style="font-family:KaiTi_GB2312;font-size:18px;">
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;

public class SetCookie extends HttpServlet {
protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException
{

Cookie c1 = new Cookie("Bill","234");
resp.addCookie(c1);

Cookie c2 = new Cookie("Cindy","93");
c2.setMaxAge(60*60);
resp.addCookie(c2);

resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().println("setSession Succeed!");

}
}</span>

2、获取Cookie的Java类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class ShowCookies extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

Cookie[] cookie = request.getCookies();
for(int i=0;i < cookie.length;i++){
Cookie c = cookie[i];
System.out.println(c.getName()+c.getValue());
response.getWriter().println(c.getName()+c.getValue());
}
}
}
</span>

五、Session操作实例:

1、设置Session的java类

<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class SetSession extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);
// session.setAttribute("URL", request.getRequestURL());
session.setAttribute("host",request.getRemoteHost());
response.getWriter().println("setSession Succeed!");
}
} </span>

2、获取Session的Java类:
<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class ShowSession extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
HttpSession session = request.getSession(true);
// StringBuffer URL = (StringBuffer)session.getAttribute("URL");
String host = (String) session.getAttribute("host");
response.getWriter().println("host=" + host);
}
} </span>

六、关于cookie和session要注意的细节

    1、使用cookie

          一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)

         一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。

         浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。

        如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

   2、使用session:

            失效时间: session对象默认30分钟没有使用,则服务器会自动销毁session,在服务器的web.xml文件中可以手工配置session的失效时间。如下代码

<span style="font-family:KaiTi_GB2312;font-size:18px;"> <session-config>
<session-timeout>30</session-timeout>
</session-config></span>

            当禁用了cookie之后要使用URL重写来实现
        response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。

  response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写

七、小结和拓展:

   cookie和session的关系:根据session的实现原理,在Web客户端和Web服务端,同时存储一份Sessionid,在session的生命周期内,首先服务端生成了sessionid后,通过httpresponse对象将sessionid返回到web客户端,并写入到cookie中。客户端再次发送请求的时候,会在cookie中获取到sessionid等一些信息,通过httprequst对象发送到服务器端,web服务端通过request对象的getSession方法获取到session信息。

   Cache:它存储于 服务器的内存中,允许您自定义如何缓存项以及将它们缓存多长时间。例如,当缺乏系统内存时,缓存会自动移除很少使用的或优先级较低的项以释放内存。该技术 也称为清理,这是缓存确保过期数据不使用宝贵的服务器资源的方式之一。

    优点:它不与会话相关,所以它是多会话共享的,是所有用户都可以访问和共享的,因为从Cache中读数据比较快,因此使用它可以提高网站性能

    缺点:但是可能泄露 用户的安全信息,还由于在服务器缺乏内存时可能会自动移除Cache因此需要在每次获取数据时检测该Cache项是否还存在。

    关键特性有:存储于服务器内存中,与会话无关,根据服务器内存资源的状况随时可能被丢弃,不被序列化,不发生服务器-客户端数据传输。

   MermCached:是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon
)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信

  

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