springboot提供的外部接口跨域问题解决

需要配置一个mvc适配器,基于springboot2.1.3

上面的第一个override是配置了拦截器,拦截登录与否,并排除掉外部接口和登录页面,第二个才是跨域问题解决需要的CorsRegistry ,可直接复制

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.xxccc.aaaa.interceptor.UserLoginInterceptor;
@Configuration
public class UserLoginAdapter implements WebMvcConfigurer{
    
    @Autowired
    private UserLoginInterceptor userLoginInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加对用户是否登录的拦截器,并添加过滤项、排除项
        registry.addInterceptor(userLoginInterceptor).addPathPatterns("/**")
            .excludePathPatterns("/css/**","/js/**","/images/**","/lib/**")//排除样式、脚本、图片等资源文件
            .excludePathPatterns("/index.html")//排除登录页面
            .excludePathPatterns("/get/allBaseInfo")//排除外部接口1
            .excludePathPatterns("/addBaseInfoRight")//排除外部接口2
            .excludePathPatterns("/getUser");//排除用户点击登录按钮
    }
    
    //后台接口跨域
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedMethods("GET", "POST")
                //Access-Control-Allow-Credentials
				/* 该字段可选。它的值是一个布尔值,表示是否允许发送Cookie.默认情况下,不发生Cookie,即:false。
				对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json,这个值只能设为true。
				如果服务器不要浏览器发送Cookie,删除该字段即可。*/
                .allowCredentials(true).maxAge(3600);
    }
}

//之后在需要进行跨域访问的接口上面加上注解:
@CrossOrigin(origins = "*", maxAge = 3600) //* 可以改成ip地址

.....

还有说直接在需要进行跨域访问的接口上面加上注解就ok的(没测试,因为我的项目使用了拦截器)

@CrossOrigin (origins = "*", maxAge = 3600)

网上还能搜到Nginx方向代理解决跨域访问
原文链接:https://blog.csdn.net/crystalcs2010/article/details/88865473

server {
        listen       80; #监听80端口,可以改成其他端口
        server_name  localhost; # 当前服务的域名
        
        # 反向代理所有/apis开头的访问请求
        location /apis {
            proxy_pass   http://localhost:8080;
        }
}
————————————————
版权声明:本文为CSDN博主「众神之翼」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

补全

只get不传参数可以使用上面的方式进行接口处理,但是一旦传值,参数的值一般是JSON但是接收的时候可能是String,也可能是Map,取决于对方的设置请求头,作为一个后台Coder感觉很难过。。。


//post请求会发送OPTIONS请求,需要进行前置处理
//配置新Class外部拦截器OuterInterceptor 
@Component
public class OuterInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
            Object handler) {
        String method = request.getMethod();
        if(HttpMethod.OPTIONS.toString().equals(method)) {
            response.setStatus(HttpStatus.NO_CONTENT.value());
        }
        return true;
    }

}

//adapter类中增加此拦截器的配置
registry.addInterceptor(outerInterceptor).addPathPatterns("/addBaseInfoRight")
            .addPathPatterns("/getUserBaseRight");

//后台代码
@RequestMapping(value="/addBaseInfoRight", method=RequestMethod.POST)
    public Result addBaseInfoRight(@RequestBody String map,HttpServletRequest req) {
        JSONObject requestParam = JSON.parseObject(map);
        String dataString = requestParam.get("data").toString();
        JSONArray dataArray = JSON.parseArray(dataString);
        List<Map<String, Object>> resultData = getResultData(dataArray);
        
        Integer count = 0;
        for (Map<String, Object> map2 : resultData) {
            List<Map<String, Object>> idMap = baseInfoService.selectBaseInfoRightId(map2);
            if(!idMap.isEmpty()) {
                Integer i = baseInfoService.updateBaseInfoRight(map2);
                count+=i;
            }else {
                Integer i = baseInfoService.addBaseInfoRight(map2);
                count+=i;
            }
        }
        //result是我写的返回结果类,继承了hashMap
        if(count != null && count != 0) {
            return Result.outer("0", "修改成功",String.valueOf(count));
        }else {
            return Result.outer("1", "修改失敗",null);
        }
    }

拦截器直接配置拦截POST参数(此方案未尝试,但在面对多个外部接口时,此方案是必要的)

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class ParamInterceptor implements HandlerInterceptor {
	
	private Map<String,String> param = new HashMap<String,String>();
	
	@Override
	public void afterCompletion(HttpServletRequest httpservletrequest, HttpServletResponse httpservletresponse,
			Object obj, Exception exception) throws Exception {
	}
	@Override
	public void postHandle(HttpServletRequest req, HttpServletResponse rep, Object obj,
			ModelAndView modelandview) throws Exception {
		String path = req.getContextPath();
	    String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/";
		req.setAttribute("param", param);
		
		req.setAttribute("basePath", basePath);
	}
	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse rep, Object obj)
			throws Exception {
		Map<String,String[]> map = req.getParameterMap();
				
		for (String key : map.keySet()) {
			if(map.get(key) != null){
				param.put(key, map.get(key)[0].toString());
			}
		}
		
		return true;
	}
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值