Reputation: 537
I am having various problems with my code:
ActionMessages
and ActionErrors
set by LoginAction
/login
, it does not redirect me to success page.EDIT:
void setSession(Map map)
which was wrong( It should only be a setter function).validate()
method which solved the problem.But I am still not able to view my ActonErrors
and ActionMessages
.
Is it necessary to use <s:form>
. Because it disturbs my CSS and I am not able to find solutions to correct that. Can I assign ID attribute in <s:form>
?
Following is my JSP code:
...
<s:if test="hasActionErrors()">
<div id="errorMessage"><s:actionerror /></div>
</s:if>
<s:if test="hasActionMessages()">
<div id="errorMessage"> <s:actionmessage /></div>
</s:if>
<form action="login" method="POST" id="login-form">
<fieldset>
<p>
<label for="loginUserName">username</label>
<input type="text" id="loginUserName" maxlength="10" placeholder="Eg. EMP0000000"
title="User ID is of format EMP0000000" pattern="(EMP)([0-9]{7})" required
name="loginUserName" class="round full-width-input" autofocus />
</p>
<p>
<label for="loginPassword">password</label>
<input type="password" name="loginPassword" maxlength="20" id="loginPassword" required
class="round full-width-input" />
</p>
<p>I've <a href="#">forgotten my password</a>.</p>
<input type="submit" class="button round blue image-right ic-right-arrow" value="LOG IN" />
</fieldset>
</form>
...
Here is my struts.xml
:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="false" />
<package name="employee" extends="struts-default" namespace="/">
<interceptors>
<interceptor name="login" class="com.sreebhog.interceptors.LoginInterceptor" />
<interceptor-stack name="loginStack">
<interceptor-ref name="login" ></interceptor-ref>
<interceptor-ref name="defaultStack" ></interceptor-ref>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="loginStack"></default-interceptor-ref>
<global-results>
<result name="loginRedirect">/login </result>
</global-results>
<action name="login" class="com.sreebhog.actions.LoginAction">
<result name="input">/JSP/sreebhog_login.jsp</result>
<result name="success">/JSP/index.jsp</result>
</action>
<action name="logout" class="com.sreebhog.actions.LogoutAction">
<result name="logout">/JSP/sreebhog_login.jsp</result>
</action>
</package>
</struts>
Here is my LoginAction
:
package com.sreebhog.actions;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
import com.sreebhog.dao.EmployeeDAO;
import com.sreebhog.interfaces.LoginRequired;
import com.sreebhog.model.dto.Employee;
import com.sreebhog.utility.Cryptography;
public class LoginAction extends ActionSupport implements SessionAware,LoginRequired {
private String loginUserName;
private String loginPassword;
SessionMap<String,Object> sessionMap;
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public void setSession(Map map) {
sessionMap=(SessionMap) map;
sessionMap.put("username", loginUserName);
}
public String execute()
{
String userName = null;
if (sessionMap.containsKey("username"))
{
userName = (String) sessionMap.get("username");
if (userName != null )
{
if (!userName.equals(""))
{
return SUCCESS;
}
}
}
EmployeeDAO employeeDao = new EmployeeDAO();
Employee employee = employeeDao.find(this.getLoginUserName());
if (employee == null || employee.getUserName().equals(""))
{
System.out.println("Here1");
addActionError("Username or password is invalid");
return INPUT;
} else
try {
if (employee.getPassword().equals(Cryptography.getHash("SHA-1", this.getLoginPassword(), employee.getSalt())))
{
System.out.println("Here2");
addActionError("Username or password is invalid");
return INPUT;
}
else {
System.out.println("Here3");
sessionMap.put("username",(String)loginUserName);
sessionMap.put("role",(String)employee.getPermissions().getRole());
return SUCCESS;
}
} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
e.printStackTrace();
}
return INPUT;
}
public void validate()
{
if (loginUserName == null || loginUserName.equals("") || loginPassword == null || loginPassword.equals(""))
{
addActionError("Please fill in username and password");
}
}
public String logout()
{
sessionMap.invalidate();
return INPUT;
}
public String getLoginUserName() {
return loginUserName;
}
public void setLoginUserName(String loginUserName) {
this.loginUserName = loginUserName;
}
public String getLoginPassword() {
return loginPassword;
}
public void setLoginPassword(String loginpassword) {
this.loginPassword = loginpassword;
}
}
Here is my LoginInterceptor
:
package com.sreebhog.interceptors;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import com.sreebhog.actions.LoginAction;
import com.sreebhog.interfaces.LoginRequired;
public class LoginInterceptor extends AbstractInterceptor {
@Override
public String intercept(final ActionInvocation invocation) throws Exception {
Map<String, Object> session = ActionContext.getContext().getSession();
String userName = (String) session.get("username");
if (userName != null && !userName.equals("")) {
return invocation.invoke();
}
Object action = invocation.getAction();
if (!(action instanceof LoginRequired)) {
return invocation.invoke();
}
if (!(action instanceof LoginAction)) {
return "loginRedirect";
}
return invocation.invoke();
}
}
Upvotes: 2
Views: 4050
Reputation: 537
Problem solved. I can't believe i did that. Forgot to place tag-lib in my jsp page. Thanks everyone for help.
Upvotes: 1
Reputation: 1
you were not able to view action messages because you didn't set it via addActionMessage
. The action errors you should see. Also check that !loginUserName.equals("null")
.
Once you logged in and requested /login
you check the session object username
in the interceptor and it should not be empty then login
action invoked. But the parameters are empty, they are only available when you submit the form. Validation should fail and return to the input
. Also don't put the username
to the map when the session is injected, do it before return success
.
Upvotes: 0
Reputation: 1057
put the error message tag and message tag in form. loke as follow
<s:form>
<div id="errorMessage"><s:actionerror /></div>
<div id="errorMessage"> <s:actionmessage /></div>
.
.
.
</s:form>
Upvotes: 0