Pourquoi les Servlets ne sont pas sécuritaires? [dupliquer]
cette question a déjà une réponse ici:
j'ai besoin de savoir pourquoi les servlets ne sont pas sécuritaires? Et quelle est la raison pour laquelle dans les Struts 2.0 contrôleur servlet est thread-safe ?
6 réponses
Les instances de Servletje dois savoir pourquoi les servlets ne sont pas sécuritaires?
ne sont pas sécurisées en raison de la nature multi-threadée du langage de programmation Java en général. La machine virtuelle Java supporte l'exécution du même code par plusieurs threads. C'est un grand avantage de performance sur les machines qui ont plusieurs processeurs. Cela permet également au même code d'être exécuté par plusieurs utilisateurs concurrents sans se bloquer mutuellement.
Imaginez un serveur avec 4 processeurs où un servlet normal peut traiter 1000 requêtes par seconde. Si ce servlet était threadsafe, alors l'application web agirait comme si elle fonctionnait sur un serveur avec 1 processeur dans lequel le servlet ne peut traiter que 250 requêtes par seconde (OK, ce n'est pas exactement comme ça, mais vous avez l'idée).
si vous rencontrez des problèmes en utilisant des servlets, alors c'est votre faute, pas de Java ni de Servlet. Vous aurez besoin de corriger le code de servlet comme tel que la requête ou la session scoped de données est jamais assigné comme une variable d'instance de la servlet. Pour une explication plus détaillée, Voir aussi Comment fonctionnent les servlets? L'instanciation, les sessions, les variables partagées et le multithreading .
et quelle est la raison pour laquelle Struts 2.0 cadre de contrôleur de la servlet est thread-safe ?
il n'est pas sans fil. Vous confondez le répartiteur de Struts servlet avec les actions de Struts. Les actions struts sont recréées sur chaque requête. Ainsi, chaque requête a sa propre instance de l'action de la requête scoped Struts. Le struts dispatcher servlet filtre ne les stocke pas comme sa propre variable d'instance. Au lieu de cela, il le stocke comme un attribut du HttpServletRequest
.
sont des classes java normales et ne sont donc pas Thread Safe.
mais cela dit, Les classes Java sont sûres si vous n'avez pas de variables d'instance. Seules les variables d'instance doivent être synchronisées. (La variable d'Instance est une variable déclarée dans la classe et non dans ses méthodes.
Variables déclarées dans les méthodes sont thread sûr que chaque thread crée sa propre pile de programme et les variables de fonction sont allouées dans la pile. Ce signifie que la variable dans une méthode est créée pour chaque thread, donc n'a pas de problèmes de synchronisation de thread associés.
Les variables de la méthodesont sans fil, les variables de classe ne le sont pas.
il y a une instance unique de mappage de servlet par servlet; toutes les propriétés d'instance sont partagées entre toutes les requêtes. L'accès à ces propriétés doivent prendre en compte.
Les actionsStruts 2 (et non" controller servlet", ce ne sont ni des servlets ni des controllers) sont instanciées par requête. Les propriétés d'Action ne seront accessibles que par le thread d'une seule requête.
sont normalement multi-filetés.
Les conteneurs Servletgèrent généralement les requêtes concurrentes en créant un nouveau thread Java pour chaque requête. Le nouveau thread reçoit une référence d'objet à la servlet demandée, qui émet la réponse à travers le même thread. C'est pourquoi il est important de concevoir la simultanéité lorsque vous écrivez un servlet, car plusieurs requêtes peuvent être traitées par la même instance de servlet.
la façon dont les conteneurs servlet traitent les requêtes servlet dépend de l'implémentation; ils peuvent utiliser un seul servlet, ils peuvent utiliser la mise en commun de servlet, cela dépend de l'architecture du système du fournisseur.
Struts 2 les objets D'Action sont instanciés pour chaque requête, il n'y a donc pas de problème de sécurité.
Servlet n'est pas thread sûr, mais nous pouvons le rendre comme un thread sûr en mettant en œuvre cette classe de servlet à SingleThreadModel
comme la définition de classe donnée ci-dessous, mais encore une fois le problème de performance sera là, donc meilleure option serait d'utiliser la portion synchronisée
public class SurveyServlet extends HttpServlet
implements SingleThreadModel
{
servlet code here..
...
}
Servlet n'est pas thread-safe par lui-même. Vous pouvez le rendre thread-safe en faisant la méthode de service synchronisé. vous devez mettre en œuvre SingleThreadInterface pour le rendre thread-safe.