悟空CRM 解决 CORS 跨域访问问题(基于JFinal)

此文章发布于 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;
            }
            
            //。。。。。
     }
}

搞定。

最后修改:2019 年 08 月 15 日 05 : 39 PM
如果觉得我的文章对你有用,请随意赞赏

发表评论