|
|
@@ -0,0 +1,33 @@
|
|
|
+package common.handler;
|
|
|
+
|
|
|
+import com.jfinal.handler.Handler;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 全局 CORS 处理器,允许所有来源的跨域请求。
|
|
|
+ * ⚠️ 仅用于开发和测试环境,生产环境请勿直接使用 '*'
|
|
|
+ * 而是应该指定具体的 allowedOrigin。
|
|
|
+ */
|
|
|
+public class AllCorsHandler extends Handler {
|
|
|
+ @Override
|
|
|
+ public void handle(String target, HttpServletRequest request, HttpServletResponse response, boolean[] isHandled) {
|
|
|
+ // 设置所有响应头字段,允许所有来源的跨域
|
|
|
+ response.setHeader("Access-Control-Allow-Origin", "*"); // 允许所有来源
|
|
|
+ response.setHeader("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS"); // 允许所有常用方法
|
|
|
+ response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers,dl-token,dl_token"); // 允许所有常用头
|
|
|
+ response.setHeader("Access-Control-Max-Age", "3600"); // 预检请求缓存时间为 1 小时
|
|
|
+ response.setHeader("Access-Control-Allow-Credentials", "true"); // 允许发送 Cookie 等凭证(如果前端有发送,这里也要允许)
|
|
|
+
|
|
|
+ // 处理 OPTIONS 预检请求
|
|
|
+ if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
|
|
|
+ response.setStatus(HttpServletResponse.SC_OK); // 浏览器收到 200 OK 就会继续发送实际请求
|
|
|
+ isHandled[0] = true; // 拦截请求,不再往下执行 Controller,直接返回
|
|
|
+ return; // 结束方法执行
|
|
|
+ }
|
|
|
+
|
|
|
+ // 继续执行后续的 Handler 和 Controller
|
|
|
+ next.handle(target, request, response, isHandled);
|
|
|
+ }
|
|
|
+}
|