Hi,
I recently implemented a login mechanism but did it slightly differently
after recommendations from this mailing list to use an interceptor.
Each action/page that requires a validated login is directed via a
Interceptor.
The sole purpose of the interceptor is to verify the existence of an
object in the session. Here is the guts of the method:
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext ac = invocation.getInvocationContext();
Map session = ac.getSession();
// retrieve the login status from the session by key name.
User user = (User) session.get(Constants.USER_SESSION_SCOPE);
// if the user object is non null, the user is logged in.
if (user != null) {;
return invocation.invoke();
}
return "notLoggedIn";
}
It is then necessary to create a new interceptor stack:
<interceptor-stack name="my.validationWorkflowStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="amr.validation"/>
</interceptor-stack>
I also defined a global-result as follows to take care of directing the
client when not logged in.
<global-results>
<result name="notLoggedIn" type="redirectAction">
<param name="actionName">showLogin</param>
</result>
</global-results>
Finally, here is an example of a protected action using the new
interceptor stack:
<action name="showControlPanel">
<!-- Include our validation stack to ensure user is logged
in -->
<interceptor-ref name="my.validationWorkflowStack"/>
<result type="freemarker">/controlPanel.ftl</result>
</action>
You then simply need a regular action to take of the "login" which will
place a valid object/flag in the session.
Hope this helps
mathias-ewald wrote:
Hi,
I am trying to implement a login mechanism. I will now explain what I did
and what error I get but in case there is a more sophisticated way to do
that - please tell me!
I created a BaseAction which is the parent of all my Actions. The BaseAction
is supposed to be responsible for displaying a login page if there is no
User object in session scope. Then the login form should put the username
and password into the BaseAction. The BaseAction then tries to find a match
in the database and places the User object into session scope:
---------------------
public abstract class BaseAction {
private String username;
private String password;
protected Log log;
private Boolean loginStatus;
public String execute() {
if(log == null) {
log = LogFactory.getLog(getClass());
}
if(isProtected()) {
Map<String, Object> session =
ActionContext.getContext().getSession();
Object o = session.get("user");
if(o instanceof User) {
loginStatus = true;
} else {
return "login";
}
}
return executeAction();
}
public abstract String executeAction();
public abstract Boolean isProtected();
public Boolean getLoginStatus() {
return loginStatus;
}
public void setLoginStatus(Boolean loginStatus) {
this.loginStatus = loginStatus;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
---------------------
An Action that wants to be password protected must implement #isProtected()
to return "true". This is my JSP file that is shown if #isProtected() ==
true and there's no User in session scope:
---------------------
...
<s:form>
<s:textfield label="Username" name="userData.username"></s:textfield>
<s:password label="Password" name="userData.password"></s:password>
<s:submit></s:submit>
</s:form>
...
---------------------
This is the error I get
---------------------
20:35:42,179 WARN OgnlValueStack:49 - Error setting value
ognl.OgnlException: target is null for setProperty(null, "password",
[Ljava.lang.String;@1f22dad5)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1651)
at ognl.ASTProperty.setValueBody(ASTProperty.java:101)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.ASTChain.setValueBody(ASTChain.java:172)
at ognl.SimpleNode.evaluateSetValueBody(SimpleNode.java:177)
at ognl.SimpleNode.setValue(SimpleNode.java:246)
at ognl.Ognl.setValue(Ognl.java:476)
...
---------------------
Why is that happening?
cu
mathias
------------------------------------------------------------------------
No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 8.5.387 / Virus Database: 270.13.16/2240 - Release Date: 07/15/09 17:58:00