0

我有一个小应用学习Struts2 Application

我写了一个管理页面,在里面,我的代码将检查用户是否登录,如果没有,它将重定向到登录页面。

我编写拦截器来检查用户尝试访问但未登录的所有页面,它将将此用户重定向到登录页面。一切正常,但是当我在数据库中输入正确的用户名和密码时,它无法登录,当我删除拦截器时,我可以登录到管理页面

原因可能是拦截器在登录之前和之后检查用户的会话,但也许在某些情况下,我不知道为什么我的应用程序会话为空,尽管我的用户名和密码是真实的,但是当我设置会话时它直到为空。

下面的代码将向您展示我所说的:

登录操作

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dejavu.software.view;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
import org.apache.struts2.interceptor.SessionAware;
import org.dejavu.software.dao.UserDAO;
import org.dejavu.software.model.GroupMember;
import org.dejavu.software.model.User;

/**
 *
 * @author Administrator
 */
public class AdminLoginAction extends ActionSupport {

    private static final long serialVersionUID = -1457633455929689099L;
    private User user;
    private String username, password;
    private String role;
    private UserDAO userDAO;
    private GroupMember group;    

    public AdminLoginAction() {
        userDAO = new UserDAO();

    }

    @Override
    public String execute() {
        String result = null;
        System.out.println(getUsername());
        if (getUsername().length() != 0 && getPassword().length() != 0) {
            setUser(userDAO.checkUsernamePassword(getUsername(), getPassword()));            
            if (getUser() != null) {
                for (GroupMember g : getUser().getGroups()) {
                    boolean admincp = g.getAdminpermission().contains("1");
                    if (admincp == true) {
                        Map session = ActionContext.getContext().getSession();  
                        session.put("userLogged", getUsername());
                        session.put("passwordLogged", getPassword());
                        result = "success";
                    } else {
                        result = "error";
                    }
                }

            }
        }        
        return result;
    }

    @Override
    public void validate() {
        if (getUsername().length() == 0) {
            addFieldError("username", "Username is required");
        }
        if (getPassword().length() == 0) {
            addFieldError("password", getText("Password is required"));
        }

    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRole() {
        return role;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public GroupMember getGroup() {
        return group;
    }

    public void setGroup(GroupMember group) {
        this.group = group;
    }


}

我的自定义拦截器代码:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.dejavu.software.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
import java.util.Map;
import org.apache.struts2.StrutsStatics;

/**
 *
 * @author Anministrator
 */
public class LoginInterceptor extends AbstractInterceptor implements StrutsStatics {

    private static final long serialVersionUID = -3874262922233957387L;

    @Override
    public void destroy() {
    }

    @Override
    public void init() {
    }

    @Override
    public String intercept(ActionInvocation ai) throws Exception {
        Map<String, Object> session = ai.getInvocationContext().getSession();
        Object user = session.get("userLogged");

        if (user == null) {
            return "login";
        } else {
            return ai.invoke();
        }
    }
}

我的 struts 配置

<?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>

    <package name="default" namespace="/" extends="struts-default">
        <action name="index" class="org.dejavu.software.view.HomeAction">
            <result>home.jsp</result>
        </action>
        <action name="about" class="org.dejavu.software.view.AboutHomeAction">
            <result>about.jsp</result>
        </action>
    </package>  

    <package name="admincp" namespace="/admincp" extends="struts-default">
        <interceptors>
            <interceptor name="login" class="org.dejavu.software.interceptor.LoginInterceptor" />
            <interceptor-stack name="stack-with-login">
                <interceptor-ref name="login"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="stack-with-login"/>

        <global-results>
            <result name="login">login.jsp</result>
        </global-results>

        <action name="logincp" class="org.dejavu.software.view.AdminLoginAction">
            <result name="success">dashboard.jsp</result>
            <result name="input">login.jsp</result>
            <result name="error">login.jsp</result>
        </action>

    </package>  

</struts>

当我输入正确的用户名和密码匹配到数据库时,直到重定向到 login.jsp 页面

我对此一无所知

请帮我

非常感谢

4

2 回答 2

1

您必须将登录操作配置为使用默认拦截器堆栈,否则它将不会执行您的方法,因为您的拦截器将返回login结果。

<action name="logincp" class="org.dejavu.software.view.AdminLoginAction">
  <interceptor-ref name="defaultStack" />
  <result name="success">dashboard.jsp</result>
  <result name="input">login.jsp</result>
  <result name="error">login.jsp</result>
</action>
于 2012-10-29T20:44:02.680 回答
0

您还必须检查用户是否是第一次尝试登录。

因为当用户第一次尝试登录时,会话将始终为空,它将重定向到登录页面。

为此,您可以在登录表单中使用另一个参数来检查用户是否第一次尝试在拦截器内登录,如果是,则调用该操作。

例如:

<form action='' method=''>
    <input type='hidden' name='firstLogin' value='1'/>
    <input type='text' name='username'/>
    <input type='password' name='password'/>
</form>

我在这段代码中使用了纯 html,可能你正在使用 struts2-tags,所以你也可以用这种方式实现。

在你的 Interceptor 检查里面。

request = ai.getInvocationContext().get(HTTP_REQUEST);
if(user == null)
{
    if(!StringUtils.isEmpty(request.getParameter('firstLogin'))){
        return ai.invoke();
    }
    return "login";
}
else{
    return ai.invoke();
}
于 2013-04-07T05:21:34.433 回答