Struts2 poignée de délai d'expiration de session à l'aide de l'Intercepteur
Je suis en train de gérer délai d'expiration de session demandes dans mon struts2 application à l'aide d'un Intercepteur. Ci-dessous sont les fichiers liés à ce:
Web.xml:
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
<session-timeout>1</session-timeout>
</session-config>
Struts.xml:
<package name="default" extends="struts-default">
<interceptors>
<interceptor name="sessionInterceptor"
class="com.platform.web.security.SessionInterceptor" />
</interceptors>
<action name="doLogin"
class="com.platform.web.action.LoginAction">
<result name="input">/login/login.jsp</result>
<result name="error">/login/login.jsp</result>
<result type="chain">menuAction</result>
</action>
<action name="menuAction"
class="com.platform.web.action.MenuAction">
<interceptor-ref name="sessionInterceptor"/> //Interceptor included here
<result name="SUCCESS">/jsp/main.jsp</result>
<result name="ERROR">/login/login.jsp</result>
<result name="input">/jsp/myFavourite.jsp</result>
</action>
Intercepteur Classe:
public class SessionInterceptor extends AbstractInterceptor implements StrutsStatics {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String intercept(ActionInvocation invocation) throws Exception {
final ActionContext context = invocation.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) context
.get(HTTP_REQUEST);
HttpSession session = request.getSession(false);
//Is there a "user" object stored in the user's HttpSession?
//Object user = session.getAttribute("User");
if (session == null) {
//The user has not logged in yet.
//Is the user attempting to log in right now?
//String loginAttempt = request.getParameter(LOGIN_ATTEMPT);
/* The user is attempting to log in. */
/*if (!StringUtils.isBlank(loginAttempt)) {
return invocation.invoke();
}*/
return "timeout";
} else {
return invocation.invoke();
}
}
}
LoginAction:
public class LoginAction extends MesActionSupport implements ServletRequestAware {
@Override
public String execute() throws Exception {
setActionNameForAudit("execute123");
FILE_LOGGER.debug("Entering into execute() ... ");
String strSessionId = "";
if (isValidUser == true) {
user = getUser();
strSessionId = request.getSession(true).getId();
setServletRequest(request);
session.put("SessionId", strSessionId);
setSession(session, user);
ServletActionContext.getRequest().getSession().setAttribute("User", user);
FILE_LOGGER.debug("Exit from LoginAction.execute() ... ");
return SUCCESS;
} else {
return ERROR;
}
}
MenuAction:
public class MenuAction extends MesActionSupport implements SessionAware, ParameterAware, RequestAware {
@Override
public String execute() throws Exception {
setActionNameForAudit("execute ");
User user = null; //To store current user
Map<String, ArrayList<String>> category = null; //To store all Menu
//Categories.
StringBuffer menu = new StringBuffer(""); //To store Menu String
StringBuffer dashboardMenu = new StringBuffer("");
//user = (User)(request.getSession().getAttribute("User")==null ? null : request.getSession().getAttribute("User")); //Request object IS NULL HERE!!
user = (User) (mapSession.get("User") == null ? null : mapSession
.get("User")); //mapSession object IS NULL HERE
FILE_LOGGER.debug("user is " + user == null);
if (user != null) {
menu = menuView.getMenu(user);
mapSession.put("Menu", menu.toString());
mapSession.put("dbMenu", dashboardMenu.toString());
ret = "SUCCESS";
} else if (user == null) {
ret = ERROR;
} else {
ret = SUCCESS;
}
return ret;
}
Flux est comme ceci:
1. Écran de connexion s'ouvre
2. L'utilisateur entre les informations d'identification et les soumet
3. LoginAction est appelée, l'utilisateur est authentifié
4. Si l'utilisateur valide - MenuAction est appelé. D'autre redirection de Connexion.jsp
Selon le code ci-dessus, la session sera créé dans le LoginAction, de contrôle atteint l'Intercepteur où l'objet de session est activée. Si la session existe, le contrôle atteint MenuAction.
Mais lorsque cela se produit, le request
objet est remis à NULL! Plus tôt, quand je n'étais pas à l'aide d'un intercepteur, le flux de travail a été complètement bien entre LoginAction et MenuAction.
Ne l'intercepteur réinitialise le HTTPRequest? et donc la Session? En conséquence, je ne suis pas en mesure de procéder.
Toute aide?
Vous devez vous connecter pour publier un commentaire.
J'ai beaucoup de commentaires sur ce code de configuration/certains trivial, d'autres non.
Il n'y a aucune raison de créer votre propre session; ne pas.
Lorsque vous déclarez un intercepteur dans une action de configuration, vous devez déclarer tous intercepteurs. Comme configuré, seulement la session de l'intercepteur est en cours d'exécution pour
menuAction
.Qui signifie pas de paramètres seront comblés, car aucun autre intercepteurs sont en cours d'exécution.
En général, seule l'utilisation
SessionAware
pour accéder à la session. Il est très rarement besoin d'avoir accès directement à la demande.Évidemment, l'intercepteur n'a pas de "définition de la demande pour les nuls", qui n'a même pas de sens.
Je n'ai aucune idée de ce que votre
LoginAction
est censé faire. Quelle est la intention de lignes commesetServletRequest(request);
ousetSession(session, user);
? Il n'y a rien au sujet de ces deux lignes qui semblent corrects.Nom de votre réussite et de l'erreur des résultats qui,
"success"
et"error"
(en minuscules), si vous allez utiliser l'ActionSupport.SUCCESS
etActionSupport.ERROR
constantes. Si vous êtes pas à l'aide de ces constantes dans ce code, je vous recommande d'utiliser d'autres noms pour eux, parce qu'il va confondre quelqu'un qui a effectivement utilisé Struts 2 avant.Lors de la publication des échantillons de code, veuillez enlever des choses qui ne sont pas pertinents. En particulier lorsque vous n'avez pas défini explicitement la coloration syntaxique, il rend les choses beaucoup plus difficile à lire.
Ne pas utiliser le code
if (isValidUser == true)
, utilisezif (isValidUser)
.L'esprit de votre conditionnelles: des trucs comme
if (user == null) ... else if (user != null) ... else ...
fait zéro sens. L'utilisateur est nul, soit il ne l'est pas: il n'y a pas de troisième option.Éviter d'inutiles, de confusion logique, comme
User currentUser = (User) (mapSession.get("User") == null ? null : mapSession.get("User"));
qui dit en gros "Si c'est null, utilisez la valeur null, sinon renvoie la valeur que vous venez de recevoir, mais l'obtenir à nouveau." POURQUOI???Des commentaires comme
User user = null; //To store current user
sont complètement inutile. N'est-il pas évident ceUser user
est? Un utilisateur. Pas assez évident? Que diriez -User currentUser
???Nom au pluriel (par exemple, des collections) comme quelque chose de pluriel. Une carte de la catégorie des noms de listes n'est pas une catégorie unique.
Ne pas déclarer des variables, loin de là où ils sont utilisés; il est très déroutant.
Mettre vos pages JSP sous
WEB-INF
quelque part à interdire direct d'accès au client.Éviter les constructions de langage, comme quand un
if
branche retourne, unelse
n'est pas strictement nécessaire, et de l'OMI, il ajoute du bruit. De même, envisager un retour dès que vous savez que vous êtes de retour. Ce dernier est un peu plus controversé, mais je pense que les gens sont en train de réaliser que c'est bien d'avoir plusieurs points de retour à court méthodes, et de l'OMI, il est plus facile de réfléchir.Utiliser moins de code pour dire les choses. Créer petit utilitaire méthodes pour envelopper trivial fonctionnalités afin de ne pas polluer le code de la canalisation principale.
Utiliser l'action de chaînage presque jamais.
Il n'y a plus, mais c'est assez pour l'instant. Voici le véritable code, nettoyé. Certains ce n'est pas vraiment pertinente, mais je l'ai laissé dans de toute façon.
Il y a aucun moyen vous pouvez dire entre si la session a expiré ou n'a pas encore été créé dans votre intercepteur, sauf si vous ajoutez un peu de suivi de votre front-end, dans la primitive cas, il pourrait être juste un seul paramètre de la requête.
Une combinaison de HttpSessionListener et Servlet3 + AJAX Push notifications serait le droit façon de le faire.