servlet request request.getcookiess总是一个 jsessionid,请问为什么

● Web基础(14)
------【Servlet和JSP】(11)
&&&&&&& 上一节我们总结了cookie技术,这节主要总结一下session技术。1.&session对象&&&&&&& 在web开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。&&&&&&& session和cookie的主要区别在于:cookie是把用户的数据写给用户的浏览器(保存在客户机);session技术把用户的数据写到用户独占的session中(保存在服务器)。&&&&&&& session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。2.&session实现原理&&&&&&& 浏览器A第一次访问Servlet1,服务器会创建一个session,每个session都有一个id号,创建好了后,服务器将id号以cookie的形式回送给客户机(这些是服务器自动完成的)。当浏览器未关闭前再次发请求访问Servlet2时,就会带着这个id号去访问服务器,这时候服务器检索下内存中有没有与之对应的session,有就用这个session为其服务。&&&&&&& 如果想要关掉浏览器再打开还可以使用同一个session,则需要给服务器回送的cookie设置有效时间(服务器自动回送的时候是没有有效期的)。具体做法是通过session对象的getId方法获得该session的id,然后创建一个cookie,该cookie的名字为&JSESSIONID&,值就是刚刚获得的id,再将该cookie设置下有效期,(也可以设置下Path),并添加到cookie中即可。但是有效期不得超过30分钟,因为浏览器关掉后,session只保存30分钟。&&&&&&&&下面通过一个案例来说明一下session的使用。3.&session的一个案例&&&&&&& 通过三个servlet来实现简单的购物功能:&&&&&&& IndexServlet显示首页,并列出所有书(这个servlet和上一节cookie的案例中基本一致)//首页:列出所有书
public class IndexServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(&text/charset=UTF-8&);
PrintWriter out = response.getWriter();
out.write(&本网站有如下书:&br/&&);
Set&Map.Entry&String,Book&& set = DB.getAll().entrySet();
for(Map.Entry&String, Book& me : set) {
Book book = me.getValue();
out.write(book.getName() + &&a href='/test/servlet/BuyServlet?id=&+book.getId()+&'&购买&/a&&br/&&);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
//写一个类来模拟数据库
class DB {
private static Map&String,Book& map = new LinkedHashMap();
//静态代码块中的内容只执行一次,该类在加载时,往map集合中put一系列书,map也需要设置为静态的
map.put(&1&, new Book(&1&, &javaweb开发&,&老张&, &一本好书&));
map.put(&2&, new Book(&2&, &spring开发&,&老倪&, &一本好书&));
map.put(&3&, new Book(&3&, &hibernate开发&,&老童&, &一本好书&));
map.put(&4&, new Book(&4&, &struts开发&,&老毕&, &一本好书&));
map.put(&5&, new Book(&5&, &ajax开发&,&老张&, &一本好书&));
map.put(&6&, new Book(&6&, &java基础&,&老孙&, &一本好书&));
public static Map getAll() {
class Book {
public Book() {
public Book(String id, String name, String author, String description) {
this.name =
this.author =
this.description =
public String getId() {
public void setId(String id) {
public String getName() {
public void setName(String name) {
this.name =
public String getAuthor() {
public void setAuthor(String author) {
this.author =
public String getDescription() {
public void setDescription(String description) {
this.description =
&&&&&&&& 从上面程序中可以看出,当用户点击购买时,将书的id号带上,并跳转到BuyServlet去处理:public class BuyServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String id = request.getParameter(&id&); //获得url中带过来的参数id
Book book = (Book)DB.getAll().get(id); //在DB中获得该id号的book
HttpSession session = request.getSession(); //获得当前session对象
Cookie cookie = new Cookie(&JSESSIONID&, session.getId()); //设置新的cookie,注意cookie名必须为JSESSIONID,值为该session的id
cookie.setMaxAge(30*60); //设置cookie有效期
cookie.setPath(&/test&); //设置cookie的路径
response.addCookie(cookie); //将cookie添加到cookies中带给浏览器,下次浏览器访问,就会将此cookie带过来了
//先把书加到容器里,再把容器加到session中。一般先检查用户的session中有没有保存书的容器,没有就创建,有就加
List list = (List)session.getAttribute(&list&);
if(list == null) {
list = new ArrayList();
session.setAttribute(&list&, list);
list.add(book);
//跳转到显示用户买过哪些商品
request.getRequestDispatcher(&/servlet/ListCartServlet&).forward(request, response);
response.sendRedirect(&/test/servlet/ListCartServlet&);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}&&&&&& 从上面的程序可以看出,当用户点击购买后,会将书的id号带过来,我们拿到id号后就可以找到相应的书,同时我们将当前session的id保存到cookie中,再带给浏览器,这样下次浏览器访问的时候就会将当前session的id带过来了。拿到相应的书后,放到list中,再把list放到session中,这样下次跳转的时候,浏览器带来的cookie中有当前session的id,我们可以通过getSession()获得当前的session,再把session中保存的list拿出来,就知道用户买了哪些书了。这就是购物车的原理,请看下面的ListCartServlet:public class ListCartServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType(&text/charset=UTF-8&);
PrintWriter out = response.getWriter();
HttpSession session = request.getSession(); //获得当前的session
List&Book& list = (List)session.getAttribute(&list&); //从session中拿出list
if(list == null || list.size() == 0) {
out.write(&对不起,您还没有购买任何商品!&);
out.write(&您买过如下商品:&br/&&);
for(Book book : list) {
out.write(book.getName() + &&br/&&);
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}4.&浏览器禁用cookie后的session处理&&&&&&& 由上文可知,session通过向浏览器回送cookie,如果用户将浏览器的cookie禁用了该如何解决?&&&&&&& 解决方案:url重写,让session的id不以cookie的形式带过来,以url中带过来。有两个url重写的方法:response.encodeRedirectURL(java.lang.String url);
//用于对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url);
//用于对表单action和超链接的url地址进行重写。在BuyServlet.java中,把session的id号写入cookie的几行代码去掉,将response.sendRedirect(&/test/servlet/ListCartServlet&);改为:response.sendRedirect(response.encodeRedirectURL(&/test/servlet/ListCartServlet&));在IndexServlet.java中,把out.write(book.getName() + &&a href='/test/servlet/BuyServlet?id=&+book.getId()+&'&购买&/a&&br/&&);改写成:String url= &/test/servlet/BuyServlet?id=& + book.getId();
url= response.encodeURL(url);
out.write(book.getName() + &&a href='& + url + &'&购买&/a&&br/&&);还有最后一步很重要:在out.write(&本网站有如下书:&br/&&);之前加上request.getSession();因为要实现共享一个session,必须首先获得session。这样就算浏览器禁用了cookie,我们依然可以共享一个session了。5.&总结&&&&&&& 1. 服务器是如何做到一个session为一个浏览器的多次请求而服务的?&&&&&&& 服务器创建session出来后,会把session的id号以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机带session的id过来了,就会使用内存中与之对应的session为之服务。&&&&&&& 2. 如何做到一个session为多个浏览器服务?&&&&&&& 服务器第一次创建session,程序员把session的id号手动以cookie的形式回送给浏览器,并设置cookie的有效期,这样即使用户的浏览器关了,开新的浏览器时,还会带着session的id号找服务器,服务器从而就可以用内存中与之对应的session为第二个浏览器窗口服务。&&&&&&& 3. 如何做到用户禁用cookie后,session还能为多次请求而服务?&&&&&& 把用户可能点击的每一个超链接后面,都跟上用户的session id号。&&&&&&& 4. session对象的创建和销毁时机&&&&&&& 用户第一次request.getSession时创建。session对象默认在30分钟没有使用,则服务器会自动销毁session。但是用户可以在web.xml文件中手动配置session的失效时间:& 下面表示1分钟失效:&session-config&
&session-timeout&1&/session-timeout&
&/session-config&&&&&&&& 用户也可以手动调用session.invalidate方法,摧毁session。&&&&&& session就总结这么多,如有错误之处,欢迎留言指正~_____________________________________________________________________________________________________________________________________________________-----乐于分享,共同进步!-----我的博客主页:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:629298次
积分:9116
积分:9116
排名:第1371名
原创:162篇
评论:733条
文章:11篇
阅读:81141
文章:16篇
阅读:51683
文章:19篇
阅读:51050
文章:30篇
阅读:167846
阅读:23665
文章:16篇
阅读:74706
文章:19篇
阅读:35768
文章:29篇
阅读:7163750880人阅读
Java(33)
Java.Struts(5)
Java.JSP(6)
本文属于本人原创,转载请注明出处:
【前面的话】
在网上经常看到有人对request.getSession(false)提出疑问,我第一次也很迷惑,看了一下J2EE1.3 API,看一下官网是怎么解释的。&
【官方解释】
& getSession&
getSession(boolean&create)
Returns the current HttpSession associated with this request or, if if there is no current session and
create is true, returns a new session.
If create is false and the request has no valid
HttpSession, this method returns null.
To make sure the session is properly maintained, you must call this method before the response is committed. If the container is using cookies to maintain session integrity and is asked to create a new session when the response
is committed, an IllegalStateException is thrown.
Parameters: true - to create a new session for this
false to return null if there's no current session
Returns: the HttpSession associated with this request or
null if create is false and the request has no valid session
getSession(boolean&create)意思是返回当前reqeust中的HttpSession ,如果当前reqeust中的HttpSession 为null,当create为true,就创建一个新的Session,否则返回null;
简而言之:
HttpServletRequest.getSession(ture) 等同于 HttpServletRequest.getSession()
HttpServletRequest.getSession(false) 等同于 如果当前Session没有就为null;
【问题和bug】:
我周围很多同事是这样写的;
HttpSession session = request.getSession();
// a new session created if no session exists, 哈哈!完蛋啦!如果session不存在的话你又创建了一个!
String user_name = session.getAttribute(&user_name&);
需要注意的地方是request.getSession() 等同于 request.getSession(true),除非我们确认session一定存在或者sesson不存在时明确有创建session的需要,否则尽量使用request.getSession(false)。在使用request.getSession()函数,通常在action中检查是否有某个变量/标记存放在session中。这个场景中可能出现没有session存在的情况,正常的判断应该是这样:
HttpSession session = request.getSession(false);
if (session != null) {
String user_name = session.getAttribute(&user_name&);
【投机取巧】:
如果项目中用到了Spring(其实只要是Java的稍大的项目,Spring是一个很好的选择),对session的操作就方便多了。如果需要在Session中取值,可以用WebUtils工具(org.springframework.web.util.WebUtils)的getSessionAttribute(HttpServletRequest request, String name)方法,看看高手写的源码吧:哈哈。。
* Check the given request for a session attribute of the given name.
* Returns null if there is no session or if the session has no such attribute.
* Does not create a new session if none has existed before!
* @param request current HTTP request
* @param name the name of the session attribute
* @return the value of the session attribute, or &code&null&/code& if not found
public static Object getSessionAttribute(HttpServletRequest request, String name) {
Assert.notNull(request, &Request must not be null&);
HttpSession session = request.getSession(false);
return (session != null ? session.getAttribute(name) : null);
注:Assert是Spring工具包中的一个工具,用来判断一些验证操作,本例中用来判断reqeust是否为空,若为空就抛异常。
上面的代码又可以简洁一下啦,看吧:
HttpSession session = request.getSession(false);
String user_name = WebUtils.getSessionAttribute(reqeust, &user_name&);&&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1015587次
积分:9919
积分:9919
排名:第1169名
原创:184篇
转载:68篇
评论:152条
(1)(4)(5)(3)(1)(10)(1)(3)(2)(3)(3)(1)(2)(1)(3)(5)(3)(7)(1)(1)(1)(9)(4)(7)(9)(1)(1)(1)(5)(5)(10)(3)(6)(4)(3)(5)(4)(8)(5)(3)(3)(8)(10)(2)(3)(1)(3)(6)(5)(3)(13)(11)(5)(9)(8)(6)(4)jsp jsessionid问题_百度知道真心求解:为什么会每次request后session都不一样 - Java Web开发当前位置:& &&&真心求解:为什么会每次request后session都不一样真心求解:为什么会每次request后session都不一样&&网友分享于:&&浏览:0次真心求解:为啥会每次request后session都不一样情况是这样:
环境:jdk6&+&eclipse&+&tomcat&6&
其它:IE浏览器或者Firefox
WEB工程情况:struts&2&Hibernate,serlvet,jQuery,filter
出现问题:
以下一个简单的servlet,主要就两句话
//Servlet1.java
&*&@see&HttpServlet#doGet(HttpServletRequest&request,&HttpServletResponse&response)
protected&void&doGet(HttpServletRequest&request,&HttpServletResponse&response)&throws&,&&{
System.out.println("STL2-2&--------"&+&request.getSession().getId());
&*&@see&HttpServlet#doPost(HttpServletRequest&request,&HttpServletResponse&response)
protected&void&doPost(HttpServletRequest&request,&HttpServletResponse&response)&throws&ServletException,&IOException&{
System.out.println("STL2-3&--------"&+&request.getSession().getId());
直接请求这个servlet
http://127.0.0.1:8080/TW/Servlet1
并不断刷新
1.按上面操作,每次打印出的sessionID都不一样。
2.检查,发现所有Struts2的Action&session每次都一样。但重新请求Servlet1后,session都会变。
&&同时,有这样一个流程:JSP请求另外一个Servlet,两个地方的session居然也不一样。。
&&至此我已经相当无语了。。。。。
3.后来我把struts和所有的filter全都注释掉了,web.xml中只剩下只个servlet的配置。每次session还是不样。
&&但是,我新建一个WEB工程,就简单的一个Servlet,不断刷新,却每次都是同一个session...
&&至此,快疯掉了....
4.没办法,各种重启之后,那个JSP请求Servlet的简单流程,两处session居然一样了。但那个直接请求servlet的流程居然还TM不一样。。。。。。
&各种操蛋。。。。。
5.NND,心想就算了吧,把那个Servlet1.java删掉。。。。
6.过了一阵,心里还不服,再新建一个servlet,还叫Servlet1.java,重复操作,不断刷新。。。。
&我日了,session居然又全部一样了。。。。。。
现在还没找找原因,我觉得整个工程就没修改个啥,结构也相当简单,求解!!!!
如果有朋友遇到这样的问题,可以讨论一下!!
我还有出问题的版本和不出问题版本两个版本都有,有兴趣的可以直接发给你研究一下。。。
注:出问题时,我已经打包发布到tomcat目录下,问题还是有,所以应该与eclipse没什么关系。
------解决思路----------------------友情帮顶,看得有点糊涂&一样不一样....
我好想也遇到过类似的情况,会不会和提交方式有关get/post?和浏览器缓存有关?当时我找出的问题好想是这两个...等高手------解决思路----------------------也很糊涂;
偶想问题发生在Tomcat,JSP/Servlet的实现是Tomcat,&Session也是Tomcat创建和维护的;
看下是否Debug模式,tomcat的\work\Catalina\localhost下的东西是否每次请求都有变化(时间戳);------解决思路----------------------顶一下,我也看的很糊涂------解决思路----------------------看的有点乱了,,希望早日解决------解决思路----------------------
估计还是有不一样的地方吧。。还要具体分析。。。------解决思路----------------------这问题真的是神奇了,持续关注------解决思路----------------------下载,测试,都一样,你tomcat有问题,鉴定完毕。如果说名字是形式,只要能解决问题就行,那我是不是可以理解成,只要功能能实现,规范不重要?------解决思路----------------------在偶的环境中
运行没发现楼主说的问题
环境:jdk6,tomcat&6.0.20&&
其它:IE浏览器或者Firefox
建议是更换Tomcat版本再测试;&或使用Jboss测试或其它web服务器测试;
------解决思路----------------------有结果了吗?------解决思路----------------------Test&Result&as&follow:
------解决思路----------------------Sorry,确有这问题;------解决思路----------------------呃,看糊涂了……理不清了……------解决思路----------------------引用:终于找到问题的原因了,是因为我的工程名里有个括号。。。。
详细吃完饭再解释。。。。。。
是这个问题引起的;
偶的理解是URL重解释;丢失了JSESSIONID;
测试结果如下:
http://hi.csdn.net/attachment//6340236OcPO.png
Cookie[]&cookies&=&request.getCookies();
if(cookies&!=&null&&&&cookies.length&&&0){
for(Cookie&cookie&:&cookies){
System.out.println(cookie.getName()&+&"&:&"&+&cookie.getValue()&+&"&"&+&cookie.getVersion());
System.out.println("++++++++++++++++++++++++++++++++++++");
System.out.println(request.getMethod()&+&"&"&+&request.getRequestURI()&+&"&"&+&&request.getProtocol());
Enumeration&headerNames&=&request.getHeaderNames();
while(headerNames.hasMoreElements()){
String&headerName&=&(String)headerNames.nextElement();
System.out.println(headerName&+&"&:&"&+&request.getHeader(headerName));
System.out.println("++++++++++++++++++++++++++++++++++++");
System.out.println("ValidSrv&=*=*=*=*=*=*"&+&session.getId());
System.out.println();
有点兴趣,花了点时间测试;------解决思路----------------------上面说的URL解析是:
(&-&&%28&-&&(
)&-&&%29&-&&)
root&context(ReferenceCode_T400(web))会发生变化;
不知道楼主的理解如何,因对HTTP协议是不很熟,只是个人的理解;------解决思路----------------------引用:引用:
上面说的URL解析是:
(&-&&%28&-&&( 共&2&页:
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有

我要回帖

更多关于 request获取cookies 的文章

 

随机推荐