8
votes

Pourquoi les classes d'action de Struts ne sont-elles pas en sécurité?

Je peux lire dans de nombreux sites Web que les classes d'action Struts ne sont pas en sécurité. Je ne suis pas capable de comprendre pourquoi c'est le cas.

Aussi j'ai lu un livre qui dit que les classes d'action "Struts sont mises en cache et réutilisées pour la performance Optimisation au prix de la mise en œuvre des classes d'action de manière thread-sûreté "

Comment est la cache des classes d'action et être un fil de sécurité? .


4 commentaires

Où avez-vous lu ceci?


Ce Book


Juste pour la perspicacité, le livre a été publié le 31 mars 2007. Struts2 a été publié 2008. Voir: EN.Wikipedia .org / wiki / apache_struts # Historique ... de toute façon S2 est un produit très différent de S1 ... juste en disant cela pour vous assurer que vous comprenez S1 et S2 ne sont liés que par leur nom.


J'ai ajouté la balise STRUTS , car cela est devenu une sorte de comparaison de la manière dont les instances de la classe d'action diffèrent entre les versions 1 et 2.


5 Réponses :


5
votes

Si une classe est mise en cache et réutilisée, il existe un risque de corruption pour les accès simultanés par plusieurs threads. Dans une application Web, chaque demande est traitée sur un fil. Disons que vous disposez de 10 cas d'action, mais votre conteneur traite 20 demandes - dans ce cas, vos 10 actions sont chacune réutilisées, car vous avez plus de demandes en vol que des actions disponibles pour les servir.

Le problème de sécurité du fil n'approrte que sa tête s'il y a un état réutilisé dans l'action. Si tel est le cas, une action qui entretient une demande peut définir une valeur dans la variable partagée, mais un autre thread peut alors prendre la relève et l'action pourrait à nouveau modifier la variable partagée. Dans ce cas, lorsque le thread d'origine prend la relève, l'état partagé a été modifié.

Le moyen facile de traiter avec ceci est de configurer votre pile pour simplement utiliser une nouvelle action ou assurez-vous de ne pas avoir d'état partagé dans vos actions.


1 commentaires

Comment configurons-nous la pile pour toujours utiliser une nouvelle action? Est-il possible de le faire dans des jambes de force 1?



2
votes

Pourquoi ne pas créer une nouvelle "action" d'objet par demande? Quoi dans le monde ??

Parce que les jambes de force sont si âgées, il pense à créer un autre objet par cycle de demande est aussi coûteux que de payer un dollar pour un café. (C'est très cher. Parce qu'il est vraiment vieux.)


5 commentaires

Struts2 n'est pas vieux. Voici une belle table de comparaison: Strutures.apache .Org / 2.0.14 / Docs / Comparaison-Struts-1-and-2.HTML


Je pense que l'irréparable faisait référence aux Struts 1, ce qui est vieux. D'accord que Struts 2 n'est pas vieux, cependant.


Absolument! Je viens d'écrire le commentaire ci-dessus, de sorte que les nouveaux programmeurs ne prennent pas une mauvaise impression sur les jambes de force. Quand nous disons "Struts" aujourd'hui, nous voulons dire Struts2 la plupart du temps ...


En raison de la façon dont les mauvaises jambes de force sont à la réputation de Struts2, lors de l'écriture, j'essaie de dire "Struts2", puis utilisez S2 pour toutes les références futures. Quelle douleur leur choix de nommage était!


Oui je suis d'accord. Je souhaite que ce soit toujours appelé Webwork. Quoi que nous appelions cela, c'est un excellent cadre.



24
votes

Comment la mise en cache des classes d'action et être le fil de sécurité?

Si vous mettez en cache et réutilisez des instances d'une classe, permettant à plusieurs threads d'accéder à la même instance simultanément, puis la classe est intrinsèquement pas thread-coffre-fort *. Si vous deviez placer une instance mutable ou des champs statiques sur la classe, les résultats sous concurrence seraient inattendus et problématiques. D'autre part, si chaque fil a sa propre instance de la classe, la classe est intrinsèquement thread-coffre-fort.

  • Struts 1 Les classes d'action ne sont pas du thread-coffre-fort. Vous ne devez pas placer des champs mutables sur la classe, à l'aide d'une classe de beans de formulaire pour les champs de formulaire passés à l'action.
  • Struts 2 Les classes d'action sont du thread-coffre-fort. Les nouvelles copies sont instanciées pour chaque demande et placer des champs d'instance de la classe est un concept de base dans le cadre.

    * Si l'instance ou le champ statique est immuable, c'est une amende pour plusieurs threads pour y accéder simultanément.


1 commentaires

Pourriez-vous expliquer ce concept de jambes de force 1 et de jambe de force 2 différence avec un bel exemple de travail



1
votes

En regardant la source de jambes de force, vous verrez que cela retourne simplement des cours d'action instanciés. Donc, sur, deux demandes peuvent toucher la même variable d'instance, créant de nombreux problèmes si ce n'est pas synchronisé correctement. XXX


0 commentaires

0
votes

Lors de la recherche d'une solution pour ce problème pour un ancien projet de Struts 1 qui se comportait au hasard en raison de quelques appels AJAX à la même action, je pensais que vous pouvez résoudre le problème de sécurité du fil pour ce cas en utilisant Scope = "Demande" sur votre Struts-config.xml fichier. XXX

Peut-être que cela aide


0 commentaires