{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
问题:向某银行发送支付请求时,如果客户端cookie开启,第一次请求时,请求地址会自动增加一jsessionid,第二次没有问题。如果客户端cookie关闭,无论如何请求地址会自动添加一jsessionid,从而导致支付页面不能显示。
查了网上的一些解决办法,找到原因,如下:
在你的程序第一次访问服务器的时候,服务端并不知道你的客户端浏览器是否支持cookie,因此,当你第一次请求发起的时候,服务端会默认url重写,也就是将sessionid写到url中传递在请求过后,服务器会根据你提交的客户端浏览器信息自动检查客户端是否启用了cookie,如果启用,将不再进行url重写。如果没有,则还是进行url重写因为互联网协议本身是不维护状态的,因此引进了cookie来协助完成这项功能,sessionid其实也是对状态的一种维持。
解决办法:可在过滤器中加入如下代码
if(!(requestinstanceofhttpservletrequest)){chain.dofilter(request,response);return;}httpservletrequesthttprequest=(httpservletrequest)request;httpservletresponsehttpresponse=(httpservletresponse)response;//clearsessionifsessionidinurlif(httprequest.isrequestedsessionidfromurl()){httpsessionsession=httprequest.getsession();if(session!=null)session.invalidate();}//wrapresponsetoremoveurlencodinghttpservletresponsewrapperwrappedresponse=newhttpservletresponsewrapper(httpresponse){@overridepublicstringencoderedirecturl(stringurl){returnurl;}@overridepublicstringencoderedirecturl(stringurl){returnurl;}@overridepublicstringencodeurl(stringurl){returnurl;}@overridepublicstringencodeurl(stringurl){returnurl;}};
关于url重写:
url重写,在用户浏览器禁止cookie的情况下,保持用户回话....response的encodeurl()及encoderedirectedurl()方法首先判断cookies是否被浏览器支持;如果支持,则参数url被原样返回,sessionid将通过cookies来维持.url重写实际上就是把sessionid放在url里面,一般上如果browser开启cookie那么sessionid就存放在cookie里面,但如果cookie被禁用那么sessionid就会放在url里面,这就是url重写.
url重写是保证一个会话操作的方法之一比如当你登陆http://host/path/file.html表单时进行某些操作,那些url额外的数据就附加到表示该会话的每个url上,并且服务器把这个标识符与关于会话所有储存的数据相关联.重写后为http://host/path/file?jsessionid=12345附加会话信息为jsessionid=12345即使浏览器不支持cookie或用户禁用cookie时,这种方法也能起作用.其他还有隐藏表单字段,还有就是现在最常用的cookie另外
关于session与cookie,网上有一文章不错,如下:
一、cookie机制和session机制的区别具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其他选择。二、会话cookie和持久cookie的区别如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个ie窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。三、如何利用实现自动登录当用户在某个网站注册后,就会收到一个惟一用户id的cookie。客户后来重新连接时,这个用户id会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。四、如何根据用户的爱好定制站点网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。五、cookie的发送1.创建cookie对象2.设置最大时效3.将cookie放入到http响应报头如果你创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如果你希望浏览器将该cookie存储在磁盘上,则需要使用maxage,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用httpservletresponse的addcookie方法,将cookie插入到一个set-cookiehttp请求报头中。由于这个方法并不修改任何之前指定的set-cookie报头,而是创建新的报头,因此我们将这个方法称为是addcookie,而非setcookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。六、cookie的读取1.调用request.getcookie要获取有浏览器发送来的cookie,需要调用httpservletrequest的getcookies方法,这个调用返回cookie对象的数组,对应由http请求中cookie报头输入的值。2.对数组进行循环,调用每个cookie的getname方法,直到找到感兴趣的cookie为止cookie与你的主机(域)相关,而非你的servlet或jsp页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。例如:stringcookiename=“userid”;cookiecookies[]=request.getcookies();if(cookies!=null){for(inti=0;i
sso相关:
1、域名
www.a.com和sub.a.com具有相同的父域:.a.com;
response可以在www.a.com域中把cookie设置到sub.a.com下。这种情况是:父域相同。但是在.a.com域中无法把cookie设置到.b.com下,这种情况属于父域不同(同源策略)
2、跨域写cookie
在每个域下的应用中提供一个/setcookie接口:
packagecom.app2.controller;importjava.io.ioexception;importjavax.servlet.servletexception;importjavax.servlet.annotation.webservlet;importjavax.servlet.http.cookie;importjavax.servlet.http.httpservlet;importjavax.servlet.http.httpservletrequest;importjavax.servlet.http.httpservletresponse;@webservlet(urlpatterns="/setcookie")publicclasscookiecontrollerextendshttpservlet{@overrideprotectedvoiddoget(httpservletrequestreq,httpservletresponseresp)throwsservletexception,ioexception{httpservletrequestrequest=(httpservletrequest)req;httpservletresponseresponse=(httpservletresponse)resp;//p3p协议。ie浏览器如果不加这句话,就无法把cookie设置成功。response.addheader("p3p","cp=curaadmadevapsaopsdoourbusunipurintdemstaprecomnavotcnoidspcor");response.setcontenttype("text/javascript");stringcookiekey=request.getparameter("cookiekey");stringcookievalue=request.getparameter("cookievalue");cookiecookie=newcookie(cookiekey,cookievalue);cookie.setpath("/");response.addcookie(cookie);}@overrideprotectedvoiddopost(httpservletrequestreq,httpservletresponseresp)throwsservletexception,ioexception{this.doget(req,resp);}}
通过