JSONP (JSON with Padding) 利用 <script> 標籤不受同源策略限制的特性,請求伺服器返回「包裹在回調函數中的 JSON 資料」,瀏覽器直接作為 JavaScript 執行,實現跨域資料獲取。
@RestController
@RequestMapping("/api")
public class ItemController {
@Autowired ItemService itemService;
@GetMapping("/categories")
public Object getCategories(@RequestParam(required = false) String callback) {
CategoryResult result = itemService.getCategoryTree();
// 無 callback 參數:返回純 JSON (支援 CORS 或同域)
if (StringUtils.isBlank(callback)) return result;
// 有 callback:包裝為 JSONP
MappingJacksonValue container = new MappingJacksonValue(result);
container.setJsonpFunction(callback); // 設定回調函數名
return container;
}
}
$.ajax({
url: "https://api.example.com/api/categories",
dataType: "jsonp", // 關鍵:告訴 jQuery 使用 JSONP
jsonp: "callback", // 參數名 (對應後端 @RequestParam)
jsonpCallback: "handleCategories", // 自定義回調函數名 (可選,jQuery 預設生成)
success: function(data) {
renderMenu(data); // data 即為解析後的 JSON 物件
}
});
callback (Spring MVC 預設)。jsonpCallback 便於快取與除錯,或讓 jQuery 自動生成 (預設 jQuery123456789)。| 特性 | JSONP | CORS |
|---|---|---|
| 瀏覽器支援 | 極廣 (IE6+) | IE10+ (需伺服器配置) |
| HTTP 方法 | 僅 GET | 支援所有方法 |
| 安全性 | 較低 (腳本注入風險) | 較高 (標準化、可控) |
| 錯誤處理 | 困難 (無狀態碼) | 完整 (onerror, status) |
| 適用場景 | 舊瀏覽器、純 GET 公開 API | 現代應用、需認證、非 GET |
callback 參數格式 (僅允許字母數字下劃線),防止 XSS 注入。Content-Type: application/javascript;charset=UTF-8 (Spring 自動處理)。