我的代码存在各种问题:
ActionMessages
ActionErrors
和LoginAction
/login
,则不会将我重定向到成功页面。如果会话存在,我现在可以成功重定向。我不得不进行2次更改,我发现:
首先在我的动作类中,我在void setSession(Map map)
中设置了会话变量,这是错误的(它应该只是一个setter函数)。其次,我检查了我的validate()方法中是否存在会话变量,以解决问题。
但我仍然无法查看我的ActonErrors
和ActionMessages
。
是否需要使用<s:form> </s:form>
。因为它扰乱了我的CSS,我无法找到纠正它的解决方案。我可以在<s:form>
中分配ID属性吗?
编辑结束: 问题解决了。我无法相信我这样做了。忘了在我的JSP页面中放置tag-lib。
以下是我的jsp代码:
...
<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>
...
这是我的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>
这是我的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;
}
}
这是我的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();
}
}
答案 0 :(得分:1)
问题解决了。我简直不敢相信。忘了在我的jsp页面中放置tag-lib。谢谢大家的帮助。
答案 1 :(得分:0)
将错误消息标记和消息标记放在表单中。 喜欢以下
<s:form>
<div id="errorMessage"><s:actionerror /></div>
<div id="errorMessage"> <s:actionmessage /></div>
.
.
.
</s:form>
答案 2 :(得分:0)
您无法查看操作消息,因为您未通过addActionMessage
进行设置。您应该看到的操作错误。另请检查!loginUserName.equals("null")
。
登录并请求/login
后,检查拦截器中的会话对象username
,它不应为空,然后调用login
操作。但参数为空,只有在您提交表单时才可用。验证应该失败并返回input
。注入会话时也不要将username
放到地图上,在返回success
之前执行此操作。