此文章发布于64
个月前,部分信息可能已经过时
,请自行斟酌确认。
默认 悟空CRM
前端 Vue 项目和后端 Jfinal
项目是放在同一个域名下的,所以默认没有 CORS 跨域请求
问题,但在单独开发调试前端 Vue 项目时域名端口和后端是不一样的,所以需要处理下支持 CORS 跨域请求,技术不精研究了两个小时才搞定。
基于 JFinal 的 悟空CRM 配置支持跨域调用方案:
1、新建全局拦截器 CORSInterceptor:
package com.kakarote.crm9.common.interceptor;
import com.jfinal.aop.Interceptor;
import com.jfinal.aop.Invocation;
import com.jfinal.core.Controller;
/**
* 解决跨域CROS拦截器
* 作者:xinggang
* 邮箱:willcoo(at)qq.com
* 网址:https://weiku.co
* 日期:2019-08-13
* 说明:
*/
public class CORSInterceptor implements Interceptor {
@Override
public void intercept(Invocation invocation) {
Controller controller = invocation.getController();
controller.getResponse().addHeader("Access-Control-Allow-Origin", "*");
controller.getResponse().addHeader("Access-Control-Allow-Headers", "Content-Type,admin-token");
controller.getResponse().addHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS");
invocation.invoke();
}
}
2、注册拦截器
修改文件 com/kakarote/crm9/common/config/JfinalConfig.java
/**
* 配置全局拦截器
*/
@Override
public void configInterceptor(Interceptors me) {
//XG:CORS跨域处理
me.add(new CORSInterceptor());
//添加全局拦截器
me.addGlobalActionInterceptor(new ErpInterceptor());
me.add(new AuthInterceptor());
}
3、其它修改
1) 修改:com/kakarote/crm9/erp/admin/controller/AdminLoginController.java
因为这个控制器用于登录,不需要验证身份所以类上添加了 @clear 清除了所有拦截器,所以需要再单独注册一下
@Clear
@Before(CORSInterceptor.class)
public class AdminLoginController extends Controller{
}
2) 修改:com/kakarote/crm9/common/interceptor/ErpInterceptor.java
前端需要提交 Options 预检请求,此类会对用户身份进行验证,Options 请求是不携带信息的,所以会返回未登录,需要单独处理一下。
public class ErpInterceptor implements Interceptor {
@Override
public void intercept(Invocation invocation) {
try {
Controller controller = invocation.getController();
BaseUtil.setRequest(controller.getRequest());
//XG:options方法放行
if (controller.getRequest().getMethod().toUpperCase().equals("OPTIONS")) {
controller.renderJson(R.ok());
return;
}
String token = controller.getHeader("Admin-Token") != null ? controller.getHeader("Admin-Token") : controller.getCookie("Admin-Token", "");
if (!Redis.use().exists(token)) {
controller.renderJson(R.error(302, "请先登录!"));
return;
}
//。。。。。
}
}
搞定。