Entretien frontal de 2020 octets

1. Commencez par introduire quelques langues que vous connaissez, principalement le backend

2. Comprenez-vous le cross-domain?

Domaine: la composition de l'URL d'un site Web comprend le nom du protocole, le nom du sous-domaine, le nom du domaine principal et le numéro de port. Par exemple, https://www.github.com/80 . Où https est le nom du protocole, www.github.com est le nom du sous-domaine, github.com est le nom de domaine principal et le numéro de port est 80. Lorsque vous demandez des données à partir d'une URL sur la page, si le nom du protocole, le nom du sous-domaine et Si l'un quelconque du nom de domaine et du numéro de port est différent, des problèmes interdomaines surviendront. Même si vous  demandez http://127.0.0.1:80/ sur la page  http: // localhost: 80 / il y aura des problèmes entre domaines (car les noms de domaine sont différents). Tous les domaines ici font référence à la collection de protocole \ nom de domaine \ numéro de port, et le même domaine signifie que le nom de domaine du protocole et le numéro de port sont les mêmes

Le problème interdomaine est que les navigateurs sont limités par la politique de même origine. Les js du nom de domaine actuel ne peuvent lire que les propriétés de la fenêtre sous le même domaine. 

Stratégie de même origine: dans le processus de développement frontal, les balises HTML courantes, telles que les opérations <a/>,<form/>,<img/>,<script/>,<iframe/>et ajaxpeuvent pointer vers une adresse de ressource ou peuvent initier une demande pour une ressource, puis les demandes mentionnées ici incluent les demandes du même domaine et les demandes inter-domaines. La stratégie de même origine est la stratégie de sécurité de base du navigateur, qui est utilisée pour se défendre contre les attaques illégales. Mais nous ne pouvons pas bloquer tous les problèmes interdomaines simplement parce que nous voulons nous défendre contre les attaques illégales.

Requête interdomaine: lorsque le domaine de requête est incompatible avec le domaine pointé par la ressource demandée

  • Dans le développement frontal, des interfaces de service tierces (comme un serveur simulé, une fausse API) sont souvent utilisées. Avec l'émergence de la division spécialisée du travail, de nombreux fournisseurs de services d'informations professionnels fournissent diverses interfaces aux développeurs frontaux. Dans ce cas, des requêtes interdomaines sont requises (la plupart sont résolues par cros)
  • Le front-end et le back-end appartiennent à des services différents. Lorsque l'architecture de séparation front-end et back-end est adoptée, il y a des problèmes interdomaines (la plupart sont résolus par des méthodes de proxy inverse)

Solution:

  • Le plus simple et le plus courant: utilisez jsonp, c'est-à-dire json avec padding, qui, comme son nom l'indique, consiste à remplir JSON dans une boîte
  • Une fois pour toutes: configurez directement l'accès aux ressources cross-origin CORS (Cross-Origin Resource Sharing) côté serveur, définissez Access-Control-Allow-Origin dans l'en-tête de la demande pour spécifier le nom de domaine pouvant obtenir des données
  • Simple et efficace: demandez directement une image
  • Rechercher "Papa": traversez les sous-domaines en modifiant document.domain
  • Bons frères: recevez des données sur plusieurs domaines via window.name
  • Neolithic Age: Cross-domain utilisant la méthode HTML5 window.postMessage

3. Parlez-moi du mécanisme de mise en cache http?

Cache Web: il peut être grossièrement divisé en: cache de base de données, cache côté serveur (cache du serveur proxy, cache CDN), cache du navigateur. Le cache du navigateur contient beaucoup de contenu: cache HTTP, indexDB, cookies, stockage local, etc.

Message HTTP: Le bloc de données envoyé et répondu lorsque le navigateur et le serveur communiquent. 
Le navigateur demande des données au serveur et envoie un message de demande (demande); le serveur renvoie des données au navigateur et renvoie un message de réponse (réponse). 
Les informations du message sont principalement divisées en deux parties 

  1. L'en-tête qui contient les attributs ————————– Les informations supplémentaires (cookies, informations de cache, etc.) et les informations de règle liées au cache sont toutes incluses dans l'en-tête 
  2. Contient le corps des données ——————— La partie de la requête HTTP qui veut vraiment être transmise

Propriétés dans les en-têtes de réponse:

  • Etag (priorité plus élevée que Last-Modified / If-Modified-Since): Lorsque le serveur répond à la requête, il indique au navigateur l'identifiant unique de la ressource actuelle sur le serveur (la règle de génération est déterminée par le serveur).
  • Dernière modification: lorsque le serveur répond à la demande, il indique au navigateur l'heure de la dernière modification de la ressource.
  • If-Modified-Since: Lorsque vous demandez à nouveau le serveur, utilisez ce champ pour informer le serveur de l'heure de la dernière modification de la ressource renvoyée par le serveur lors de la dernière requête. Une fois que le serveur a reçu la demande, il trouve l'en-tête If-Modified-Since et le compare à l'heure de la dernière modification de la ressource demandée. Si la dernière heure de modification de la ressource est supérieure à If-Modified-Since, indiquant que la ressource a été modifiée, elle répondra à tout le contenu de la ressource et retournera un code d'état de 200; si la dernière heure de modification de la ressource est inférieure ou égale à If-Modified-Since, la ressource n'a pas La nouvelle modification répondra à HTTP 304, indiquant au navigateur de continuer à utiliser le cache enregistré.
  • If-None-Match: Lorsque vous demandez à nouveau le serveur, utilisez ce champ pour informer le serveur de l'identificateur unique des données mises en cache par le segment client. Une fois que le serveur reçoit la demande, s'il trouve l'en-tête If-None-Match, il sera comparé à l'identificateur unique de la ressource demandée. S'il est différent, indiquant que la ressource a été modifiée, il répondra à l'ensemble du contenu de la ressource et renverra un code d'état de 200; le même, indiquant la ressource S'il n'y a pas de nouvelle modification, il répond avec HTTP 304 pour informer le navigateur de continuer à utiliser le cache enregistré.
  • Expire: il s'agit de HTTP 1.0. Désormais, les navigateurs par défaut utilisent HTTP 1.1 par défaut, son rôle est donc fondamentalement ignoré. 
  • Cache-Control: conformément à Expires, les deux indiquent la période de validité de la ressource actuelle et contrôlent si le navigateur extrait directement les données du cache du navigateur ou renvoie une demande au serveur pour récupérer des données. C'est juste que Cache-Control a plus de choix et des paramètres plus détaillés. S'il est défini en même temps, sa priorité est supérieure à Expire. Il existe six valeurs:
Contrôle du cache C'est la règle la plus importante. Les valeurs courantes sont private, public, no-cache, max-age, no-store et la valeur par défaut est private.
privé Le client peut mettre en cache
Publique Le client et le serveur proxy peuvent être mis en cache (les étudiants front-end peuvent penser que public et privé sont identiques)
âge-max = xxx Le contenu mis en cache expirera dans xxx secondes
pas de cache Besoin d'utiliser le cache de contraste pour vérifier les données mises en cache (décrit plus tard)
pas de magasin:           Tout le contenu ne sera pas mis en cache, le cache forcé et le cache de contraste ne seront pas déclenchés (pour le développement frontal, plus il y a de cache, mieux c'est, donc ... disons en gros 886)   

Mise en cache obligatoire: le serveur informe le navigateur d'une heure de mise en cache. Pendant la durée de mise en cache, la prochaine requête utilisera directement le cache et la stratégie de mise en cache de comparaison sera exécutée si elle est dépassée.  Comparaison du cache: envoyez les informations Etag et Last-Modified dans le cache au serveur via une requête, et le serveur les vérifiera. Lorsqu'un code d'état 304 est renvoyé, le navigateur utilise directement le cache.

4. Présentez-vous des modèles IO?

E / S bloquantes, E / S non bloquantes, E / S multiplexées, E / S commandées par signal et E / S asynchrones.

  1. Blocage d'E / S: le modèle d'E / S le plus traditionnel, c'est-à-dire que le blocage se produit au cours du processus de lecture et d'écriture des données. Une fois que le thread utilisateur a émis une demande IO, le noyau du système d'exploitation vérifiera si les données sont prêtes, si elles ne sont pas prêtes, il attendra que les données soient prêtes, et le thread utilisateur sera dans un état bloqué et le thread utilisateur remettra le processeur. Lorsque les données sont prêtes, le noyau copie les données dans le thread utilisateur et renvoie le résultat au thread utilisateur, et le thread utilisateur libère l'état de bloc.
  2. E / S non bloquantes: lorsqu'un thread utilisateur lance une opération de lecture, il n'a pas besoin d'attendre, mais obtient un résultat immédiatement. Si le résultat est une erreur, il sait que les données ne sont pas prêtes et peut donc renvoyer l'opération de lecture. Une fois que les données du noyau sont prêtes et qu'il reçoit à nouveau une demande du thread utilisateur, il copie immédiatement les données dans le thread utilisateur, puis retourne. Donc, en fait, dans le modèle d'E / S non bloquantes, le thread utilisateur doit constamment demander si les données du noyau sont prêtes, c'est-à-dire que les E / S non bloquantes ne remettront pas le CPU, mais occuperont toujours le CPU. Mais pour les E / S non bloquantes, il y a un problème très sérieux. Dans la boucle while, vous devez constamment interroger si les données du noyau sont prêtes, ce qui entraînera une utilisation très élevée du processeur. Par conséquent, la boucle while est rarement utilisée en général. Lisez les données.
    //伪代码
    while(true){
    new MyThread(socket)
    }
    class MyThread{
    data = socket.read();
    if(data!= error){
    //处理数据
    break;
    }
    
  3. E / S multiplexées: Le modèle d'E / S multiplexées est actuellement le modèle le plus utilisé. Dans le modèle d'E / S multiplexées, il existe un thread qui interroge en permanence l'état de plusieurs sockets. Ce n'est que lorsque la socket a un événement de lecture et d'écriture que les opérations de lecture et d'écriture d'E / S réelles sont réellement appelées. Parce que dans le modèle d'E / S multiplexées, un seul thread peut être utilisé pour gérer plusieurs sockets . Le système n'a pas besoin de créer de nouveaux processus ou threads, ni de gérer ces threads et processus, et uniquement lorsqu'il y a des événements de lecture et d'écriture de socket. Les ressources d'E / S ne seront utilisées que lorsqu'il est temps, ce qui réduit considérablement l'occupation des ressources. Dans Java NIO, le selector.select () est utilisé pour demander si chaque canal a un événement d'arrivée. S'il n'y a pas d'événement, il y sera toujours bloqué. Par conséquent, cette méthode provoquera le blocage du thread utilisateur. Peut-être que certains amis diront que je peux utiliser multithreading + blocking IO pour obtenir des effets similaires, mais parce qu'en multithreading + blocking IO, chaque socket correspond à un thread, ce qui entraînera beaucoup d'occupation des ressources, et surtout pendant longtemps En termes de connexions, les ressources de thread ne seront jamais libérées. S'il y a plusieurs connexions plus tard, cela entraînera un goulot d'étranglement des performances. En mode d'E / S multiplexées, plusieurs sockets peuvent être gérées via un seul thread, et ce n'est que lorsque le socket a réellement un événement de lecture et d'écriture qu'il prendra des ressources pour effectuer les opérations de lecture et d'écriture réelles. Par conséquent, les E / S multiplexées sont plus adaptées aux situations avec un grand nombre de connexions. De plus, la raison pour laquelle les E / S multiplexées sont plus efficaces que le modèle d'E / S non bloquantes est que dans les E / S non bloquantes, l'état du socket est constamment demandé via le thread utilisateur, tandis que dans les E / S multiplexées, chaque socket est interrogée L'état est effectué par le noyau, et cette efficacité est bien supérieure à celle des threads utilisateur. Cependant, il convient de noter que le modèle d'E / S multiplexé détecte si un événement arrive par interrogation et répond aux événements qui arrivent un par un. Par conséquent, pour le modèle d'E / S multiplexé, une fois que le corps de la réponse aux événements est volumineux, les événements suivants ne seront pas traités en retard et affecteront la nouvelle interrogation d'événements.
  4. E / S pilotées par le signal: lorsqu'un thread utilisateur lance une opération de demande d'E / S, il enregistre une fonction de signal dans le socket correspondant, puis le thread utilisateur continue de s'exécuter. Lorsque les données du noyau sont prêtes, un signal est envoyé au thread utilisateur. Une fois que le thread utilisateur reçoit le signal, Appelez les opérations de lecture et d'écriture d'E / S dans la fonction de signal pour exécuter l'opération de demande d'E / S réelle.
  5. E / S asynchrone: c'est le modèle d'E / S le plus idéal. Dans le modèle d'E / S asynchrone, lorsqu'un thread utilisateur lance une opération de lecture, il peut commencer à faire d'autres choses immédiatement. D'un autre côté, du point de vue du noyau, lorsqu'il reçoit une lecture asynchrone, il retournera immédiatement, indiquant que la demande de lecture a été lancée avec succès, donc aucun bloc ne sera généré pour le thread utilisateur. Ensuite, le noyau attendra la fin de la préparation des données, puis copiera les données dans le thread utilisateur. Lorsque tout cela sera fait, le noyau enverra un signal au thread utilisateur pour lui dire que l'opération de lecture est terminée. En d'autres termes, le thread utilisateur n'a pas besoin de la manière dont l'opération d'E / S réelle est exécutée. Il doit simplement lancer une demande au préalable. Lorsque le signal de réussite renvoyé par le noyau est reçu, l'opération d'E / S est terminée et les données peuvent être utilisées directement. En d'autres termes, dans le modèle d'E / S asynchrone, les deux phases de l'opération d'E / S ne bloquent pas le thread utilisateur. Les deux phases sont automatiquement terminées par le noyau, puis un signal est envoyé pour informer le thread utilisateur que l'opération est terminée. Il n'est pas nécessaire d'appeler à nouveau la fonction IO pour une lecture et une écriture spécifiques dans le thread utilisateur. Ce point est différent du modèle piloté par le signal. Dans le modèle piloté par le signal, lorsque le thread utilisateur reçoit le signal, il indique que les données sont prêtes, puis le thread utilisateur doit appeler la fonction IO pour les opérations de lecture et d'écriture réelles; dans le modèle d'E / S asynchrone, Le signal indique que l'opération IO est terminée et qu'il n'est pas nécessaire d'appeler la fonction iO dans le thread utilisateur pour les opérations de lecture et d'écriture réelles. Notez que les E / S asynchrones nécessitent la prise en charge sous-jacente du système d'exploitation, car qu'il s'agisse d'E / S multiplexées ou d'un modèle piloté par le signal, la deuxième étape de l'opération d'E / S entraînera le blocage du thread utilisateur, c'est-à-dire que le processus de copie des données par le noyau laissera le thread utilisateur bloquer.

5. Connaissez-vous le modèle Node?

Node.js utilise des E / S asynchrones et pilotées par les événements pour implémenter un environnement d'exécution JavaScript à un seul thread et à haute concurrence.

6. Connaissez-vous mysql? Connaissez-vous l'index SQL? Il y a une grande quantité de données dans la base de données, comment rechercher rapidement.

Raisons de la lenteur de l'efficacité des requêtes:

1: aucun index ou échec d'index

La condition where utilise l'instruction suivante pour invalider l'index: null,! =, <>, ou connection, in (doit être utilisé, peut être remplacé par le mot-clé exist) et pas in, '% abc%';

Utilisez les paramètres: num = @ num, opération d'expression: où num / 2 = 100, opération de fonction: où sous-chaîne (nom, 1, 3) = nom-'abc';

2: la quantité de données interrogées est trop grande et les lignes et colonnes inutiles sont renvoyées

N'interrogez que les champs utiles, n'utilisez pas * pour interroger tous les champs. Remplacez "*" par une liste de champs spécifique et ne renvoyez aucun champ non utilisé.

Utilisez plusieurs threads pour plusieurs requêtes. Si la condition de requête est une condition de plage telle qu'une certaine période de temps, vous pouvez diviser la condition de temps et combiner plusieurs résultats de requête.

3: verrouillage ou impasse

4: Le débit d'E / S est faible, ce qui crée un effet de goulot d'étranglement.

5: Mémoire insuffisante.

Créez moins d'objets. Les objets ne sont créés que lorsqu'ils doivent être utilisés et ne passent pas dans le contexte.

Nettoyez la mémoire jvm à temps.

6: La vitesse du réseau est lente. 

Méthode d'optimisation SQL

1: Si l'index est un index composite, le premier champ de l'index doit être utilisé comme condition pour garantir que le système utilise l'index, sinon l'index ne sera pas référencé, et l'ordre des champs doit être cohérent avec l'ordre d'index autant que possible.

2: les index ne sont pas autant que possible. Il est préférable de ne pas dépasser 6 index de table. Bien que l'index puisse améliorer l'efficacité de select, il réduit également l'efficacité de l'insertion et de la mise à jour, car l'insertion et la mise à jour reconstruiront l'index, donc la manière de créer l'index doit être soigneusement étudiée.

3: Quelques optimisations de la construction des tables:

Essayez d'utiliser des champs numériques. Si les données ne contiennent que des informations numériques, essayez de ne pas les concevoir comme un type de caractère. Cela réduira les performances de la requête et de la connexion et augmentera la surcharge de stockage. Étant donné que le moteur compare chaque caractère de la chaîne un par un lors du traitement des requêtes et des connexions, et pour les types numériques, il n'a besoin de comparer qu'une seule fois.
Essayez d'utiliser varchar / nvarchar au lieu de char / nchar, car premièrement, les champs de longueur variable ont un petit espace de stockage et peuvent économiser de l'espace de stockage. Deuxièmement, pour les requêtes, l'efficacité de la recherche dans un champ relativement petit est évidemment plus élevée.
4: Essayez d'éviter d'utiliser le curseur, car l'efficacité du curseur est médiocre. Si les données exploitées par le curseur dépassent 10 000 lignes, vous devriez envisager de réécrire. (Le curseur est une fonction très ancienne, presque obsolète.)

5: Tous les index ne sont pas efficaces pour les requêtes. SQL est optimisé pour les requêtes basées sur les données de la table. Lorsqu'une grande quantité de données est répétée dans la colonne d'index, la requête SQL peut ne pas utiliser l'index. Par exemple, il existe des champs sexe, homme et Les femelles sont presque la moitié, donc même si un index est construit sur le sexe, il ne jouera aucun rôle dans l'efficacité des requêtes.

6: Essayez d'éviter les opérations de transactions importantes et d'améliorer la concurrence du système.

Précautions:

1: lorsque vous utilisez comme, n'oubliez pas de vider

... où nom comme '%'. nom de variable. '%'; (la valeur de la variable est transmise de l'extérieur)

Si: la variable est vide, elle devient le sql suivant

... où le nom comme '%%'; - La conséquence de cette condition est 'sélectionner toutes les données ou mettre à jour toutes les données ou supprimer toutes les données', ce qui équivaut à aucune condition d'écriture, ce qui est un problème sérieux après qu'il se produit.

2: Comme avec les jokers: l'utilisation de% et _

La classification des
caractères génériques: %% wildcard: indique que tout caractère apparaît un nombre
illimité de fois ** (peut être égal à 0) **. _Joker inderscore: il ne peut correspondre qu'à un seul caractère, ni plus ni moins, juste un caractère.

Opérateur Like: La
fonction de LIKE est d'indiquer que le modèle de recherche derrière mysql consiste à utiliser des caractères génériques au lieu d'une correspondance directe à égalité pour la comparaison.
Remarque: Si vous utilisez l'opérateur like, l'effet de ce dernier sans utiliser l'opérateur de correspondance général est cohérent avec =, SELECT * FROM produits WHERE products.prod_name comme '1000'; Le seul résultat correspondant est 1000, mais il ne peut pas correspondre au résultat comme JetPack 1000.

1)% wildcard use:
correspond aux enregistrements commençant par "yves": (y compris l'enregistrement "yves")
SELECT * FROM products WHERE products.prod_name like'yves% ';

Faire correspondre les enregistrements contenant "yves" (y compris l'enregistrement "yves")
SELECT * FROM produits WHERE products.prod_name comme '% yves%';

Faites correspondre les enregistrements se terminant par "yves" (y compris l'enregistrement "yves", à l'exclusion de l'enregistrement "yves", c'est-à-dire les enregistrements avec des espaces après yves, ce qui nécessite une attention particulière ici)
SELECT * FROM produits WHERE products.prod_name comme '% yves';

2) Utilisation de caractères génériques:
SELECT * FROM products WHERE products.prod_name like'_yves '; Le
résultat correspondant est: enregistrer comme "yyves".

SELECT * FROM produits WHERE products.prod_name like'yves__ '; Le
résultat correspondant est: des enregistrements comme "yvesHe". (Un trait de soulignement ne peut correspondre qu'à un caractère, ni plus ni moins)

Autres opérations:

 insérer dans tb (...) valeurs (...), (...) ...; vaut mieux que insérer dans tb (...) valeurs (...); insérer dans tb (...) valeurs (...); ... La méthode d'insertion par lots est très efficace [raison]: La principale raison de la grande efficacité de la deuxième exécution SQL ici est le volume du journal après la fusion (les transactions binlog et innodb de MySQL réduisent le journal), ce qui réduit le journal La quantité et la fréquence de brossage des données, améliorant ainsi l'efficacité. En fusionnant des instructions SQL, il peut également réduire le nombre d'analyses d'instructions SQL et réduire les E / S de transmission réseau.

7. Comprenez-vous les processus et les threads? Quelle est l'unité de base du traitement CPU?

Le processus est l'unité de base de l'allocation des ressources du système d'exploitation, et le thread est l'unité de base de la planification et de l'exécution des tâches. Process est un conteneur de threads

8. Parlez-moi de l'algorithme de traitement CPU?

9. Qu'est-ce qu'un blocage de processus?

Définition de l'impasse: l'impasse est le phénomène selon lequel plusieurs processus dans un ensemble de processus attendent les uns les autres en raison de la concurrence pour les ressources. Par exemple: A et B mangent des boulettes, A contient de la sauce soja, B contient du vinaigre, A veut du vinaigre et B veut de la sauce soja. En conséquence, ils attendent tous les deux pour manger des boulettes.

Causes de blocage: ressources système insuffisantes; séquence d'avancement déraisonnable de plusieurs processus; allocation de ressources incorrecte

Conditions nécessaires à l'impasse:

(1) Exclusion mutuelle: les ressources ne peuvent pas être partagées et ne peuvent être utilisées que par un seul processus.

(2) Conditions de demande et de mise en attente (mise en attente et attente): les processus qui ont déjà obtenu des ressources peuvent à nouveau demander de nouvelles ressources.

(3) Nopre-emption: les ressources allouées ne peuvent pas être privées de force du processus correspondant.

(4) Condition d'attente circulaire (attente circulaire): plusieurs processus du système forment une boucle et chaque processus de la boucle attend que les ressources soient occupées par des processus adjacents.

Il y a quatre façons de gérer le blocage: 1) Empêcher le blocage 2) Éviter le blocage 3) Détecter et supprimer le blocage

Évitez les impasses: détruisez l'une des quatre conditions nécessaires

① Destruction des conditions d'exclusion mutuelle: permet le partage des ressources. Par exemple, la technologie SPOOLing peut permettre à plusieurs processus de générer des données d'impression en même temps.

Inconvénients: la technologie SPOOLing n'est pas applicable à toutes les ressources, telles que les tables de processus, il est donc plus difficile de détruire l'exclusion mutuelle des ressources, et cette méthode n'est pas très bonne

②Demande de destruction et conditions de rétention: les ressources sont allouées en une seule fois.

Inconvénients: avec ce mécanisme, le processus ne s'applique plus aux ressources pendant le processus d'exécution, mais l'efficacité de cette méthode est extrêmement faible et les ressources ne peuvent pas être pleinement utilisées.

③Break la condition inaliénable: il existe deux méthodes, l'une consiste à abandonner les ressources initialement occupées lorsque les ressources demandées ne sont pas remplies; l'autre méthode n'est applicable qu'au processus de demande de ressources avec une priorité plus élevée Lorsque la priorité de processus de la ressource est élevée, si la ressource demandée par un processus est occupée par d'autres processus et que la priorité du processus demandeur est plus élevée, cela peut forcer le processus occupant la ressource à abandonner. Cette méthode est généralement applicable aux processeurs et aux ressources de stockage.

④Conditions d'attente du cycle de destruction: le système attribue un numéro à chaque type de ressource, et chaque processus demande la ressource dans l'ordre du nombre croissant, et la libération est l'inverse (comme le problème du repas philosophe)

Il existe deux façons d'éviter les blocages: 1) Les ressources sont allouées dans l'ordre et 2) l'algorithme du banquier.

Il existe deux façons de supprimer le blocage: 1) Méthode de privation de ressources 2) Méthode d'annulation de processus 3) Méthode de restauration de processus

10. Donnez-vous l'url d'un site Web, veuillez noter toutes les URL de cette URL et toutes les URL redirigées après avoir passé ces URL qui ne sont pas des résultats répétés?

11. Quelle est la différence entre le type de contenu de téléchargement d'un fichier et le clic sur un bouton? Quelle est la différence entre le protocole de transmission http?

type de contenu :

Fait généralement référence au type de contenu qui existe dans la page Web, qui est utilisé pour définir le type de fichier réseau et le codage de la page Web, et déterminer la forme et le codage que le navigateur lira ce fichier. Ceci est le résultat de la fréquence de certains clics sur la page Web PHP. Est la raison du téléchargement d'un fichier ou d'une image. L'en-tête indique au client le type de contenu du contenu réellement renvoyé. Il s'agit du champ d'en-tête d'entité de Http. Il est utilisé pour décrire la méthode de codage de la demande ou du corps du message renvoyé. Il existe à la fois dans l'en-tête de la demande et dans l'en-tête de la réponse.

Types communs:

text / (plain, css, html, xml) (text ,, css, html, xml) type
application / (x-javascript, json, xml, octet-stream) (js, json, xml, binary stream data) type
image / png jpg image gif / *    

Téléchargez un fichier Excel: .xls     application/vnd.ms-excel

12. Problème d'algorithme: affichez un tableau int {1, 2, 5, -7, 8, -10} tel que le sous-tableau continu avec la plus grande somme

 

Pour résumer:

La préparation cette fois-ci est principalement de la connaissance du jeu. Je ne m'attendais pas à ce que l'interview d'octets soit de très bas niveau et je ne l'ai pas revue. . . Je n'ai pas revu les questions algorithmiques, je l'ai fait pendant une demi-heure et je n'ai pas pu le faire. . . Cela semble beaucoup plus difficile que l'interview d'Ant Financial il y a quelque temps. . .

Je suppose que tu aimes

Origine blog.csdn.net/weixin_45440502/article/details/109586398
conseillé
Classement