在struts2中使用Interceptor时无法登录

时间:2012-10-29 19:25:00

标签: struts2 actioncontext

我有一个小应用程序来学习Struts2应用程序

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

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

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

我的代码将向您展示我所说的内容:

登录操作

/*
 * 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页面

我根本不知道

请帮帮我

非常感谢

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

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

例如:

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

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

在拦截器检查中。

request = ai.getInvocationContext().get(HTTP_REQUEST);
if(user == null)
{
    if(!StringUtils.isEmpty(request.getParameter('firstLogin'))){
        return ai.invoke();
    }
    return "login";
}
else{
    return ai.invoke();
}
相关问题