千家信息网

java后台调用接口及处理跨域问题怎么解决

发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,这篇文章主要介绍"java后台调用接口及处理跨域问题怎么解决",在日常操作中,相信很多人在java后台调用接口及处理跨域问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对
千家信息网最后更新 2025年01月18日java后台调用接口及处理跨域问题怎么解决

这篇文章主要介绍"java后台调用接口及处理跨域问题怎么解决",在日常操作中,相信很多人在java后台调用接口及处理跨域问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"java后台调用接口及处理跨域问题怎么解决"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

java调用接口及处理跨域

在做系统的时候,有些时候系统A的js代码需要调用系统B的接口,这就会产生跨域现象,可以通过后台调用处理跨域

问题,这就有点 "代理" 的意思了。

在这记录一个通用的方法

public String httpPost(String urlStr,Map params){    URL connect;    StringBuffer data = new StringBuffer();      try {          connect = new URL(urlStr);          HttpURLConnection connection = (HttpURLConnection)connect.openConnection();          connection.setRequestMethod("POST");          connection.setDoOutput(true);         connection.setDoInput(true);        connection.setUseCaches(false);//post不能使用缓存        connection.setInstanceFollowRedirects(true);        connection.setRequestProperty("accept", "*/*");        connection.setRequestProperty("connection", "Keep-Alive");        connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");        OutputStreamWriter paramout = new OutputStreamWriter(  connection.getOutputStream(),"UTF-8");         String paramsStr = "";   //拼接Post 请求的参数        for(String param : params.keySet()){           paramsStr += "&" + param + "=" + params.get(param);        }          if(!paramsStr.isEmpty()){            paramsStr = paramsStr.substring(1);        }        paramout.write(paramsStr);          paramout.flush();          BufferedReader reader = new BufferedReader(new InputStreamReader(                      connection.getInputStream(), "UTF-8"));          String line;                      while ((line = reader.readLine()) != null) {                      data.append(line);                    }           paramout.close();              reader.close();          } catch (Exception e) {              // TODO Auto-generated catch block              e.printStackTrace();          }         return data.toString();}

调用外部接口引起的跨域问题

背景:在我们系统上,从外部引用了一个建议系统,在建议系统当用户被给予评论或回复之后,我的消息中显示未读消息数。

实现的效果:在建议系统中当未读消息数大于0时,我们的系统引入建议系统的位置上会出现提示有未读消息的红点。

在建议系统的后台,我们写了一个countBlog的接口,用来获取未读消息数量(json格式)

在我们的系统的前台,引入接口通过返回的未读消息数量来控制红点显示

运行后报跨域问题的bug:

解决问题

方法一:注解@CrossOrigin

方法二:addCorsMappings配置

@Override    public void addCorsMappings(CorsRegistry registry) {        registry.addMapping("/**")                .allowedOrigins("*")                  .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")                .allowCredentials(true)                .maxAge(3600)                .allowedHeaders("*");      }

弊端:使用此方法配置之后再使用自定义拦截器时跨域相关配置就会失效。

原因是请求经过的先后顺序问题,当请求到来时会先进入拦截器中,而不是进入Mapping映射中,所以返回的头信息中并没有配置的跨域信息。浏览器就会报跨域异常。

方法三:使用CorsFilter过滤器

private CorsConfiguration corsConfig() {    CorsConfiguration corsConfiguration = new CorsConfiguration();    * 请求常用的三种配置,*代表允许所有,当时你也可以自定义属性(比如header只能带什么,只能是post方式等等)    */    corsConfiguration.addAllowedOrigin("*");    corsConfiguration.addAllowedHeader("*");    corsConfiguration.addAllowedMethod("*");    corsConfiguration.setAllowCredentials(true);    corsConfiguration.setMaxAge(3600L);    return corsConfiguration;}@Beanpublic CorsFilter corsFilter() {    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();    source.registerCorsConfiguration("/**", corsConfig());    return new CorsFilter(source);}

到此,关于"java后台调用接口及处理跨域问题怎么解决"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

0