キーと値のペアが設定されたヘッダーを持つResponse
オブジェクトを返す tomcat サーバーでサービスを実行しています。Set-Cookie
ブラウザにサービス URL を入力してその URL を直接クエリすると、Cookie が保存され、同時クエリ時に Cookie 情報がサーバーに送信されます。現在、同じ URL を指定して XMLHTTPRequest を介してそのサービス リクエストを作成しようとすると、Cookie 情報が保存されません。jsコードを以下に示します
function loadXMLDoc() {
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp = new XMLHttpRequest();
}
xmlhttp.onreadystatechange = function () {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
}
}
xmlhttp.open("GET", url, true);
xmlhttp.send();
}
ヘッダー情報は次のとおりです
Request URL: url //removed the actual URL
Request Method:GET
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:192.168.11.11:8080
Origin:null
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36
Response Headersview source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:Origin, Content-Type, Accept, X-Json, Cookie
Access-Control-Allow-Methods:GET, POST, DELETE, PUT, OPTIONS
Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Fri, 06 Sep 2013 10:04:49 GMT
Server:Apache-Coyote/1.1
Set-Cookie:key=value;Version=1 //removed actual cookie content
Transfer-Encoding:chunked
XHR 呼び出しで要求されたときに Cookie が失われる原因は何ですか?
前もって感謝します
編集 1: 2 番目のシナリオ (javascript xmlHttpRequest を使用して呼び出す) では、Cookie がブラウザー自体に保存されていないことがわかりました。なぜこれが起こっているのかについての指針。ブラウザにサービス URL を直接入力すると、Cookie が保存されます。xmlHttpRequest を介して、保存されません。Request または Response ヘッダーに欠けているものはありますか?
編集 2: Java クラスと web.xml も追加して、より明確にします。
package com.gk.rest;
import javax.ws.rs.CookieParam;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
import com.sun.jersey.spi.container.ContainerRequest;
import com.sun.jersey.spi.container.ContainerResponse;
import com.sun.jersey.spi.container.ContainerResponseFilter;
@Path("/rest")
public class RestJersey implements ContainerResponseFilter {
@Path("/response")
@GET
@Produces(MediaType.TEXT_PLAIN)
public Response sendResponse(@CookieParam(value = "userId") String userId ){
return Response.ok("Something").cookie(new NewCookie("userId","cookie1")).build();
}
@Override
public ContainerResponse filter(ContainerRequest creq,
ContainerResponse cres) {
cres.getHttpHeaders().add("Access-Control-Allow-Origin", "*");
cres.getHttpHeaders()
.add("Access-Control-Allow-Headers",
"origin, content-type, accept, cookie, x-json");
cres.getHttpHeaders().add("Access-Control-Allow-Credentials", "true");
cres.getHttpHeaders().add("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD");
cres.getHttpHeaders().add("Access-Control-Max-Age", "1209600");
return cres;
}
}
WEB.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>RestJersey</display-name>
<servlet>
<servlet-name>RestJersey</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.gk.rest</param-value>
</init-param>
<init-param>
<param-name>com.sun.jersey.spi.container.ContainerResponseFilters</param-name>
<param-value>com.gk.rest.RestJersey</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestJersey</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>