1

キーと値のペアが設定されたヘッダーを持つ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>
4

0 に答える 0