Maison >Java >javaDidacticiel >Comment résoudre l'interface d'appel en arrière-plan Java et gérer les problèmes inter-domaines

Comment résoudre l'interface d'appel en arrière-plan Java et gérer les problèmes inter-domaines

WBOY
WBOYavant
2023-05-16 11:04:051265parcourir

Interface d'appel Java et gestion inter-domaines

Lors de la construction d'un système, parfois le code js du système A doit appeler l'interface du système B, ce qui provoquera des phénomènes inter-domaines

pouvant être gérés via. appels en arrière-plan. Cela signifie en quelque sorte « agence ».

Enregistrez ici une méthode courante

public String httpPost(String urlStr,Map<String,String> 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();
}

Problèmes inter-domaines causés par l'appel d'interfaces externes

Contexte :Sur notre système, un système de suggestion est référencé de l'extérieur dans le système de suggestion, après que l'utilisateur a reçu un commentaire. ou répondez , le nombre de messages non lus s'affiche dans Mes messages.

Effets obtenus : Lorsque le nombre de messages non lus dans le système de suggestion est supérieur à 0, un point rouge indiquant la présence de messages non lus apparaîtra à l'endroit où notre système introduit le système de suggestion.

Dans le backend du système proposé, nous avons écrit une interface countBlog pour obtenir le nombre de messages non lus (format json)

Dans le frontend de notre système, nous avons introduit une interface pour contrôler l'affichage du point rouge en renvoyant le nombre de messages non lus

Bogue de problème inter-domaines signalé après l'exécution :

Résoudre le problème

Méthode 1 : Annoter @CrossOrigin

Méthode 2 : configuration addCorsMappings

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

Inconvénients : Utilisez cette méthode pour configurer, puis utiliser un intercepteur personnalisé À ce stade, les configurations liées à plusieurs domaines deviendront invalides.

La raison est l'ordre des requêtes. Lorsque la requête arrive, elle entrera d'abord dans l'intercepteur au lieu d'entrer dans le mappage, il n'y a donc aucune information inter-domaine configurée dans les informations d'en-tête renvoyées. Le navigateur signalera une exception inter-domaines.

Méthode 3 : Utiliser le filtre CorsFilter

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer