Struts2 Griff-session-timeout mit Interceptor
Ich versuche zu verarbeiten session-timeout Anfragen in meinem struts2 Anwendung, die mit einem Interceptor. Unten sind die Dateien, die zu diesem Zusammenhang:
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>
Interceptor-Klasse:
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;
}
Flow ist wie diese:
1. Login-Bildschirm öffnet sich
2. Benutzer-Anmeldeinformationen und sendet
3. LoginAction heißt, der Benutzer authentifiziert ist
4. Wenn gültige Benutzer - MenuAction aufgerufen. Sonst Umleitung auf Login.jsp
Gemäß dem obigen code, der die session erzeugt wird, in der LoginAction, Steuerung erreicht die Abfangjäger, wo die session-Objekt aktiviert ist. Wenn die Sitzung existiert, wird die Steuerung erreicht MenuAction.
Aber wenn dies geschieht, die request
- Objekt wird auf NULL zurückgesetzt! Früher, wenn ich mich nicht mit einen interceptor, der Fluss war die Arbeit völlig in Ordnung zwischen LoginAction und MenuAction.
Gilt der Auffänger setzt die HTTPRequest? und damit die Session? Als Ergebnis bin ich nicht in der Lage, um fortzufahren.
Hilfe?
InformationsquelleAutor DarkKnightFan | 2013-02-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe viele Kommentare zu diesem code/Konfiguration, einige trivial, andere nicht.
Es keine Grund für erstellen Sie Ihre eigene Sitzung; nicht.
Wenn Sie erklären, einen interceptor in einem action-Konfiguration müssen Sie angeben alle Abfangjäger. Wie konfiguriert, nur der Sitzung interceptor läuft
menuAction
.Das bedeutet, dass keine Parameter gefüllt werden, da sonst kein Abfangjäger ausgeführt werden.
Im Allgemeinen, verwenden Sie nur
SessionAware
Zugriff auf die Sitzung. Es ist sehr selten zugreifen zu können, müssen den Antrag direkt.Offensichtlich ist der Flieger nicht", setzt die Anfrage auf null", ist das gar nicht sinnvoll.
Ich habe keine Ahnung, was Ihre
LoginAction
soll, zu tun. Was ist der Absicht von Zeilen wiesetServletRequest(request);
odersetSession(session, user);
? Es gibt nichts über diese beiden Linien, die Aussehen korrigieren.Nennen Sie Ihre Erfolge und Fehler die Ergebnisse nur, dass
"success"
und"error"
(tiefer Fall), wenn du gehst zu verwenden, dieActionSupport.SUCCESS
undActionSupport.ERROR
Konstanten. Wenn Sie nicht Verwendung dieser Konstanten in diesem code, ich würde empfehlen, mit anderen Namen für Sie, weil sonst jeder, der tatsächlich verwendet Struts 2 vor.Beim posten von code-Beispielen bitte entfernen Sie Sachen, die nicht relevant. Besonders, wenn Sie nicht explizit festlegen, syntax-highlighting, es macht die Dinge viel schwieriger zu Lesen.
Nicht verwenden, code wie
if (isValidUser == true)
verwendenif (isValidUser)
.Daran Ihre Bedingungen: Sachen wie
if (user == null) ... else if (user != null) ... else ...
macht null Sinn. Der user gleich null ist, oder es ist es nicht: es gibt keine Dritte option.Vermeiden Sie unnötige, verwirrende Logik, wie
User currentUser = (User) (mapSession.get("User") == null ? null : mapSession.get("User"));
die im Grunde sagt "Wenn es null, null, andernfalls den Rückgabewert muss man einfach haben, aber es wieder zu bekommen." WARUM???Kommentare wie
User user = null; //To store current user
sind völlig wertlos. Ist es nicht offensichtlich wasUser user
ist? Einen Benutzer. Nicht offensichtlich genug? Wie wäreUser currentUser
???Namen Pluralformen (z.B. Sammlungen) als etwas im plural. Eine Karte der Kategorie die Namen zu Listen, die nicht einer einzelnen Kategorie.
Nicht Variablen deklarieren, weit entfernt, von wo Sie verwendet werden; es ist sehr verwirrend.
Setzen Sie Ihre JSP-Seiten unter
WEB-INF
irgendwo zu verbieten, direkten Clientzugriff.Vermeiden Sie unnötige Konstrukte, wie wenn ein
if
Zweig zurück, einelse
ist nicht unbedingt notwendig, und IMO, es fügt Rauschen. Ebenso betrachten die Rückkehr so bald wie Sie wissen, die Sie zurückgeben. Letzteres ist ein bisschen mehr umstritten, aber ich denke, dass die Leute kommen, um zu realisieren, es ist okay, mehrere return-Punkte in kurzen Methoden, und IMO ist es einfacher zu denken.Weniger Programmcode Dinge zu sagen. Erstellen Sie kleine utility-Methoden zu wickeln triviale Funktionalität, so dass es nicht verschmutzen die mainline-code.
Use action-chaining fast nie.
Es gibt noch mehr, aber das ist genug für jetzt. Hier die aktuellen relevanten code, bereinigt. Einiges davon ist nicht wirklich relevant, aber ich ließ es trotzdem.
Ich wütend :/
+1, ich würde es anderen upvote, wenn ich könnte, denn es war auch lustig. Geht zu zeigen, eine Menge motivation kommen kann, von einem genervten Programmierer! Join the dark side.
InformationsquelleAutor Dave Newton
Gibt es keine Möglichkeit Sie sagen können unterscheiden, ob die session abgelaufen ist oder es einfach noch nicht erstellt wurden, die in Ihrer Abfangjäger, es sei denn, Sie fügen Sie einige tracking front-end, im primitiven Fall könnte es nur ein einziges request-parameter.
Einer Kombination von HttpSessionListener und Servlet3 + AJAX Push-Benachrichtigungen wäre die Recht Weg, es zu tun.
er sagt, er möchte Griff Sitzungs-timeout-Anfragen, das soll anders sein als die überprüfung, ob der Benutzer gültig ist oder nicht, aber wer weiß
Ich sicher nicht-ich dachte, der OP meinte "ich habe eine Anfrage, aber meine Sitzung abgelaufen" basiert auf dem code, aber es war auch schwer für m um den code zu verstehen :/ +1 sowieso 🙂
InformationsquelleAutor Oleg Mikheev