Java Webアプリケーションにおけるクロスドメインリクエストの実装方法

JSONPを使用したクロスドメイン通信

JSONP(JSON with Padding)は、同一生成元ポリシーの制限を回避するための一般的な手法です。以下にJavaバックエンドとJavaScriptフロントエンドの実装例を示します。

サーバーサイド実装

package com.example.web.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.LinkedHashMap;
import java.util.Map;

@RestController
public class CrossDomainController {

    @GetMapping("/api/data")
    public void handleRequest(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        
        Map<String, Object> responseData = new LinkedHashMap<>();
        responseData.put("code", 200);
        responseData.put("status", "success");
        responseData.put("payload", "クロスドメイン通信テスト");
        
        ObjectMapper jsonMapper = new ObjectMapper();
        String jsonString = jsonMapper.writeValueAsString(responseData);
        
        PrintWriter writer = resp.getWriter();
        String callbackFunction = req.getParameter("callback");
        
        if (callbackFunction == null || callbackFunction.isEmpty()) {
            writer.print(jsonString);
        } else {
            writer.print(callbackFunction + "(" + jsonString + ")");
        }
        
        writer.close();
    }
}

クライアントサイド実装

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>クロスドメイン通信サンプル</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h1>JSONP通信テスト</h1>
    <div id="result"></div>
    
<script>
    // 通常のAJAXリクエストではCORSエラーが発生します
    /*
    $.ajax({
        method: "GET",
        url: "http://api.example.com:8080/api/data",
        success: function(response) {
            $("#result").html("<pre>" + JSON.stringify(response, null, 2) + "</pre>");
        },
        error: function(xhr) {
            $("#result").html("エラー: " + xhr.status);
        }
    });
    */
    
    // JSONPを使用したクロスドメイン通信
    $.ajax({
        method: "GET",
        url: "http://api.example.com:8080/api/data",
        dataType: "jsonp",
        jsonp: "callback",
        jsonpCallback: "receiveData",
        success: function(response) {
            $("#result").html("<pre>" + JSON.stringify(response, null, 2) + "</pre>");
            console.log("サーバーからの応答:", response);
        },
        error: function(xhr) {
            $("#result").html("通信エラー: " + xhr.status);
            console.error("JSONPリクエスト失敗");
        }
    });
</script>
</body>
</html>

JSONPの仕組みでは、サーバーはデータをJSON形式で返す際に、クライアントが指定したコールバック関数でラップします。これにより、ブラウザの同一生成元ポリシーをバイパスできます。ただし、JSONPはGETリクエストのみサポートしており、セキュリティ上の考慮事項もあります。

タグ: Java Web開発 クロスドメイン JSONP Spring Boot

7月24日 18:35 投稿