我一定错过了一些关于cookie的基本知识.在本地主机上,当我设置在服务器端的cookie,并明确指定域为localhost(或.localhost).某些浏览器似乎没有接受cookie.
Firefox 3.5:我在Firebug中检查了HTTP请求.我看到的是:
Set-Cookie:
name=value;
domain=localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
Run Code Online (Sandbox Code Playgroud)
或者(当我将域设置为.localhost时):
Set-Cookie:
name=value;
domain=.localhost;
expires=Thu, 16-Jul-2009 21:25:05 GMT;
path=/
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,都不会存储cookie.
IE8:我没有使用任何额外的工具,但cookie似乎也没有存储,因为它不会在后续请求中发回.
Opera 9.64: localhost和.localhost都工作,但是当我检查Preferences中的cookie列表时,域名设置为localhost.local,即使它列在localhost下(在列表分组中).
Safari 4: localhost和.localhost都可以工作,但它们在Preferences中始终列为.localhost.另一方面,没有显式域的cookie,它显示为localhost(无点).
localhost有什么问题?由于存在这么多的不一致,必须有一些涉及localhost的特殊规则.另外,我不完全清楚为什么域名必须以点为前缀?RFC 2109明确声明:
Domain属性的值不包含嵌入点或不以点开头.
为什么?该文件表明它必须对安全做些什么.我不得不承认我没有阅读整个规范(稍后可能会这样做),但听起来有点奇怪.基于此,在localhost上设置cookie是不可能的.
似乎已经在stackoverflow上讨论了类似的东西,但我找不到完全相同的东西.
我正在尝试使用CORS(跨源资源共享)发送Cookie,但它无法正常工作.
这是我的代码.
$.ajax(
{
type: "POST",
url: "http://example.com/api/getlist.json",
dataType: 'json',
xhrFields: {
withCredentials: true
},
crossDomain: true,
beforeSend: function(xhr) {
xhr.setRequestHeader("Cookie", "session=xxxyyyzzz");
},
success: function(){
alert('success');
},
error: function (xhr) {
alert(xhr.responseText);
}
}
);
Run Code Online (Sandbox Code Playgroud)
我没有在请求HEADER中看到这个cookie.
我知道之前已经以各种形式提出过这个问题,但我似乎无法解决这个问题.我已经尝试使用jQuery和本机JS API来发出Ajax请求.
我的情况如下(见附图):
在任何人开始关于跨域请求的讲座之前,请先说明一些事情:
Access-Control-Allow-Origin在响应中设置标头的原因(我使用的是Chrome和Firefox,两者都支持CORS)那么,为什么,为什么,为什么浏览器在进行HTTPS Ajax调用时不会传递cookie?有任何想法吗?我快要忘了......
+-----------+ HTTP Request +-----------+
|Browser |+---------------->|Server |
+-----------+ +-----------+
HTTP Response
<----------------+
Set-cookie
Ajax HTTP Req.
+---------------->
Cookie (OK)
HTTP Response
<----------------+
Set-cookie (OK)
Ajax HTTPS Req.
+---------------->
No Cookie (!!!)
Run Code Online (Sandbox Code Playgroud) 好的,这真的有点开始让我烦恼.我有一个简单的Web项目设置位于:"C:\ Projects\MyTestProject \".在我的机器上的IIS中,我已经将虚拟目录映射到此位置,因此我可以在本地运行我的站点(我知道我可以从Visual Studio运行它,我更喜欢这种方法).我已将此虚拟目录命名为"mtp",我通过http://localhost/mtp/index.aspx访问它.这一切都很好.
但是,每当我尝试创建一个cookie时,它根本就不会被写出来?我在FF3和IE7中试过这个,它只是简单的不会写出cookie.我不明白.我的主机文件中有"127.0.0.1 localhost",我真的无法想到我能做的其他事情.谢谢你的建议.
詹姆士
出于某种原因,我的浏览器(我尝试了几个)不设置cookie,即使服务器返回有效的set-cookie响应,当使用fetch api 通过Ajax进行GET调用来发出请求时
如果我通过将URL放在浏览器中进行相同的GET调用,则浏览器会尊重(相同的)set-cookie响应头并保存cookie.
我通过LiveHeaders和Chrome网络检查器检查了请求和响应标头,没有区别.
编辑:澄清一下,这不是ajax向服务器发送cookie的问题.这是一个问题,当一个响应返回时,有效的set-cookies标题(根据文档应该遵守是否ajax),浏览器根本不保存cookie.
我有一个Jetty服务器在/app上下文中运行Spring应用程序.该应用程序使用会话,因此它设置会话cookie,响应如下:
set-cookie:JSESSIONID=679b6291-d1cc-47be-bbf6-7ec75214f4e5; Path=/app; HttpOnly
Run Code Online (Sandbox Code Playgroud)
我需要cookie来获取路径/而不是webapp的上下文.另外,我想使用安全的cookie.我想要这个回复:
set-cookie:JSESSIONID=679b6291-d1cc-47be-bbf6-7ec75214f4e5; Path=/; HttpOnly; Secure
Run Code Online (Sandbox Code Playgroud)
在哪里配置会话cookie的适当位置?春天有助于此吗?它应该在web.xml吗?或者我是否需要以容器特定的方式配置它,例如jetty-web.xml?
我尝试了很多东西,但到目前为止还没有任何工作.以下是我尝试过的一些事情.
创建WEB-INF/jetty-web.xml如下:
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
<Get name="sessionHandler">
<Get name="sessionManager">
<Set name="sessionCookie">MYJETTYSESSION</Set>
<Set name="sessionPath">/</Set>
<Set name="secureCookies" type="boolean">true</Set>
<Set name="httpOnly" type="boolean">true</Set>
</Get>
</Get>
</Configure>
Run Code Online (Sandbox Code Playgroud)
这会导致抛出异常:
2012-10-05 02:41:41.180:WARN:oejx.XmlConfiguration:Config error at <Set name="sessionPath">/</Set> java.lang.NoSuchMethodException: class org.eclipse.jetty.server.session.HashSessionManager.setSessionPath(class java.lang.String)
2012-10-05 02:41:41.180:WARN:oejx.XmlConfiguration:Config error at <Get name="sessionManager"><Set name="sessionCookie">MYJETTYSESSION</Set><Set name="sessionPath">/</Set><Set name="secureCookies">true</Set><Set name="httpOnly">true</Set></Get> java.lang.NoSuchMethodException: class org.eclipse.jetty.server.session.HashSessionManager.setSessionPath(class java.lang.String)
2012-10-05 02:41:41.180:WARN:oejx.XmlConfiguration:Config error at <Get name="sessionHandler"><Get name="sessionManager"><Set name="sessionCookie">MYJETTYSESSION</Set><Set name="sessionPath">/</Set><Set name="secureCookies">true</Set><Set name="httpOnly">true</Set></Get></Get> java.lang.NoSuchMethodException: class …Run Code Online (Sandbox Code Playgroud) 我在Passport/ExpressJS中使用会话时遇到问题.
当我登录时req.session,我可以看到护照是{}:
{ cookie:
{ path: '/',
_expires: Mon Sep 29 2014 19:37:16 GMT-0300 (BRT),
originalMaxAge: 3594522,
httpOnly: true,
secure: true },
passport: {} }
Run Code Online (Sandbox Code Playgroud)
此外,我正在使用Facebook进行身份验证,并且passport.deserializeUser没有被调用.这是我的代码:
passport.use(new FacebookStrategy({
// pull in our app id and secret from our auth.js file
clientID : configAuth.facebookAuth.clientID,
clientSecret : configAuth.facebookAuth.clientSecret,
callbackURL : configAuth.facebookAuth.callbackURL
},
// facebook will send back the token and profile
function(token, refreshToken, profile, done) {
// asynchronous
process.nextTick(function() {
console.log("profile " + profile.id);
console.log("profile.name "+profile.name.givenName) …Run Code Online (Sandbox Code Playgroud) 我试图通过javascript向服务器(这是一个REST服务)发出POST请求,并在我的请求中我想发送一个cookie.我的下面的代码无法正常工作,因为我无法在服务器上接收cookie side.Below是我的客户端和服务器端代码.
客户端 :
var client = new XMLHttpRequest();
var request_data=JSON.stringify(data);
var endPoint="http://localhost:8080/pcap";
var cookie="session=abc";
client.open("POST", endPoint, false);//This Post will become put
client.setRequestHeader("Accept", "application/json");
client.setRequestHeader("Content-Type","application/json");
client.setRequestHeader("Set-Cookie","session=abc");
client.setRequestHeader("Cookie",cookie);
client.send(request_data);
Run Code Online (Sandbox Code Playgroud)
服务器端:
public @ResponseBody ResponseEntity getPcap(HttpServletRequest request,@RequestBody PcapParameters pcap_params ){
Cookie cookies[]=request.getCookies();//Its coming as NULL
String cook=request.getHeader("Cookie");//Its coming as NULL
}
Run Code Online (Sandbox Code Playgroud) 我正在使用C#,MVC和AngularJS.
我的问题是我的MVC程序创建了一个HttpContext.Current.Items["value"]并在初始主控制器中设置了值,但是当我的AngularJS用ajax调用命中应用程序时,它会创建一个新的会话而我无法获得我之前在HttpContext.Current.Items["value"]调用中设置的值.
我有什么办法可以解决这个问题吗?我想继续使用HttpContext.Current.Items["value"].
为什么我的AngularJS调用会创建新的会话?我知道会话是新的原因是因为我使用它时它们有不同的ID:
String strSessionId = HttpContext.Session.SessionID;
Run Code Online (Sandbox Code Playgroud) 以前,servlet使用response.sendRedirect("pages/my_page.jsp?foo=bar");没有问题.可以在重定向到的后续页面中检索会话属性.
目前,我正在改变发送请求的方式.最初,Javascript使用myForm.submit();,但我现在已将其更改为jQuery.ajax("my_page.jsp?foo=bar", {...});.然后,servlet在JSON响应中包含一个URL,而不是response.sendRedirect()在success函数中,我window.location.replace(url);用来导航到新页面.但是,无法在后续页面中获取已保存的会话属性.
我通过插入<%= session.getId() %>JSP页面来比较会话ID .他们是一样的.这里的问题是重定向到的页面中的session.getAttribute("myAttribute_1")返回null.
我不确定这是否重要,但我实际上是在使用多个JSP页面执行此任务:
A.jsp --- (redirect) ---> B.jsp --- (redirect) ---> C.jsp
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如何获取保存的会话属性C.jsp?
下面是我用来保存会话属性的代码片段.
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(true);
response.setContentType("application/json");
CustomObject customObject = new CustomObject();
// ...
session.setAttribute("myAttribute_1", customObject);
PrintWriter writer = response.getWriter();
JsonObject json = new JsonObject();
Gson gson = new GsonBuilder().setPrettyPrinting().create();
json.addProperty("url", "next_page.jsp?foo=bar"); …Run Code Online (Sandbox Code Playgroud) cookies ×6
javascript ×4
ajax ×3
java ×2
jquery ×2
session ×2
angularjs ×1
asp.net-mvc ×1
c# ×1
cross-domain ×1
express ×1
fetch ×1
http ×1
http-headers ×1
http-post ×1
httprequest ×1
https ×1
jetty ×1
jsp ×1
localhost ×1
node.js ×1
passport.js ×1
setcookie ×1
spring ×1