帆软报表跨域之插件开发中Controller中定义的方法实现CROS的GET跨域,且请求头带自定义属性

在帆软报表插件开发中,为实现CROS跨域并携带自定义属性X-Access-Token,需处理OPTIONS请求。原方法设置res.setHeader("Access-Control-Allow-Origin", "*")无效。问题源于tomcat的web.xml禁用了OPTIONS请求,需删除相关配置。放开OPTIONS后,服务器返回500错误,需创建过滤器处理OPTIONS请求,返回200状态码,最终成功解决跨域问题。" 125717624,11242599,操作系统详解:Linux与Unix历史、哲学与应用,"['操作系统', 'Linux', 'Unix', '服务器OS', '编程语言']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当我们采用CROS的跨域方案,并且header上需要加上自定义属性的时候,如果仅仅在方法中加上res.setHeader("Access-Control-Allow-Origin", "*");就不管用了。

比如我们的方法这样写:

		function deleteUserByGet(){
			var reportUrl = "http://localhost:8075/webroot/decision/bg/deleteUserByOrgCodeAndName1?userName=demo&orgCode=1111"
            $.ajax({
                type: "GET",
                url: reportUrl,
				 headers:{
					"X-Access-Token":"ssssaaaassss",
                 },
				success:function(res){
					console.log("aaa结果:" + res);
				
				},
            });
		}

header中带上我们自定义的属性X-Access-Token。

这时会报:

 

可以看到这里会先发一个OPTIONS的请求,状态代码是403.403是拒绝访问,这时因为帆软报表的部署包中tomcat的web.xml中将OPTIONS请求给禁用了,所以我们需要放行。将部署包中conf/web.xml中的

 这里面配置的是禁用OPTIONS请求,我们需要将这个删除,或者全部删除。

删除后重启后的效果还是报错:

 

 但是此时状态代码已经是500了,说明OPTIONS请求已经放开了,只是没有正确的 返回。此时我们需要来处理这个OPTIONS请求。

我们定义一个全局的过滤器,

package com.fr.plugin.jsd9683.filter;

import com.fr.decision.fun.impl.AbstractGlobalRequestFilterProvider;
import com.fr.log.FineLoggerFactory;
import com.fr.stable.StringUtils;

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class RequestGlobalFilter extends AbstractGlobalRequestFilterProvider {
    @Override
    public String filterName() {
        return "RequestGlobalFilter";
    }

    @Override
    public String[] urlPatterns() {
        return new String[]{
                "/decision/*",
        };
    }

    @Override
    public void doFilter(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) {

        FineLoggerFactory.getLogger().info("===============================RequestGlobalFilter:" );
        String origin = req.getHeader("Origin");
        FineLoggerFactory.getLogger().info("===============================origin:" +origin);
        if (StringUtils.isNotEmpty(origin)) {
            res.addHeader("Access-Control-Allow-Origin", origin);
            String headers = req.getHeader("Access-Control-Request-Headers");
            FineLoggerFactory.getLogger().info("===============================headers:" +headers);
            if (StringUtils.isNotEmpty(headers))
                res.addHeader("Access-Control-Allow-Headers", headers);

            res.addHeader("Access-Control-Allow-Methods", "*");
            res.addHeader("Access-Control-Max-Age", "3600");
        }

        String methodName = req.getMethod();
        FineLoggerFactory.getLogger().info("===============================methodName:" +methodName);
        if (methodName.equals("OPTIONS")) {
            res.setStatus(HttpServletResponse.SC_OK);
            FineLoggerFactory.getLogger().info("options set status ok");
        }
        else{
            try {
                filterChain.doFilter(req,res);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ServletException e) {
                e.printStackTrace();
            }
        }
    }
}

此时我们判断如果是OPTIONS请求来了,直接返回200状态码,最后的结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帆软爱好者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值