Hi,
recently I was told using Interceptors was better than using a BaseAction
object performing the login process. I agree. Still I have some trouble:
This is what happens: I have a JSP that creates a button liked with another
action:
AgencyDetails.jsp
---------------------------------
...
<s:url id="url" value="/rating/Rate">
<s:param name="staffResourceId"><s:property value="staffResource.id"
/></s:param>
</s:url>
<s:a href="%{url}"><button>Place Rating!</button></s:a><br>
...
---------------------------------
This is the struts.xml configuration for that Action:
rating.xml
---------------------------------
<package name="rating" namespace="/rating" extends="default">
<default-interceptor-ref name="defaultLoginStack" />
<action name="Rate"
class="de.mathiasewald.projektseminar.action.rating.Rate">
<result>
/rating/Rate.jsp
</result>
</action>
</package>
---------------------------------
This is the inteceptor stack in struts.xml
---------------------------------
<interceptors>
<interceptor name="login"
class="de.mathiasewald.projektseminar.interceptor.LoginInterceptor">
</interceptor>
<interceptor-stack name="defaultLoginStack">
<interceptor-ref name="login" />
</interceptor-stack>
</interceptors>
---------------------------------
and finally the LoginInterceptor.java
---------------------------------
public class LoginInterceptor extends AbstractInterceptor implements
StrutsStatics {
/**
*
*/
private static final long serialVersionUID = -6647897949084333127L;
private LoginManager loginManager = new LoginManager();
private static final Log log =
LogFactory.getLog(LoginInterceptor.class);
private static final String USER_HANDLE =
"QUADRAN_USER_SESSSION_HANDLE";
private static final String LOGIN_ATTEMPT = "QUADRAN_LOGIN_ATTEMPT";
private static final String USERNAME = "QUADRAN_USERNAME";
private static final String PASSWORD = "QUADRAN_PASSWORD";
public void init () {
log.info ("Intializing LoginInterceptor");
}
public void destroy () {}
public String intercept (ActionInvocation invocation) throws Exception {
// Get the action context from the invocation so we can access
the
// HttpServletRequest and HttpSession objects.
final ActionContext context = invocation.getInvocationContext
();
HttpServletRequest request = (HttpServletRequest)
context.get(HTTP_REQUEST);
HttpSession session = request.getSession (true);
// Is there a "user" object stored in the user's HttpSession?
Object user = session.getAttribute (USER_HANDLE);
if (user == null) {
// The user has not logged in yet.
// Is the user attempting to log in right now?
String loginAttempt = request.getParameter
(LOGIN_ATTEMPT);
if (loginAttempt != null &&
loginAttempt.trim().length() > 0) { // The
user is attempting to log in.
log.info("User tries to log in - processing
attempt...");
// Process the user's login attempt.
if (processLoginAttempt (request, session) ) {
// The login succeeded send them the
login-success page.
log.info("User " + loginAttempt + "
logged in successfully.");
return invocation.invoke ();
} else {
// The login failed. Set an error if we
can on the action.
log.info("Error authenticating user " +
loginAttempt);
Object action = invocation.getAction ();
if (action instanceof
com.opensymphony.xwork2.ValidationAware) {
((com.opensymphony.xwork2.ValidationAware) action).addActionError
("Username or password incorrect.");
}
}
}
// Either the login attempt failed or the user hasn't
tried to login yet,
// and we need to send the login form.
return "login";
} else {
return invocation.invoke ();
}
}
/**
* Attempt to process the user's login attempt delegating the work to
the
* SecurityManager.
*/
public boolean processLoginAttempt (HttpServletRequest request,
HttpSession
session) {
// Get the username and password submitted by the user from the
HttpRequest.
String username = request.getParameter (USERNAME);
String password = request.getParameter (PASSWORD);
// Use the security manager to validate the user's username and
password.
Object user = loginManager.login(username, password);
if (user != null) {
// The user has successfully logged in. Store their
user object in
// their HttpSession. Then return true.
session.setAttribute (USER_HANDLE, user);
return true;
} else {
// The user did not successfully log in. Return false.
return false;
}
}
}
---------------------------------
Clicking the button I showed ealier, the Rate action is invoked and
intercepted by LoginInterceptor. As you can see the Action gets a parameter
"staffResourceId". As I click it the login page shows up and the address bar
of my browser tells
"http://localhost:8080/projektseminar/rating/Rate?staffResourceId=1".
Next, I enter my login credentials, the log tells me I was logged in
successfully, the browser address bar says
"http://localhost:8080/projektseminar/rating/Rate" and the log messages from
the Rate action say that there was no staffResourceId parameter set.
Why is that?
cu
mathias
--
View this message in context:
http://www.nabble.com/Problem-with-LoginInterceptor-tp24565562p24565562.html
Sent from the Struts - User mailing list archive at Nabble.com.
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]