0

Struts2アプリケーションを学ぶための小さなアプリケーションがあります

管理ページを作成し、その中に、ユーザーがログインしているかどうかをコードでチェックします。ログインしていない場合は、ログインページにリダイレクトします。

ユーザーがアクセスしようとしているがログインはしていないすべてのページをチェックするインターセプターを作成します。これにより、このユーザーはログインページにリダイレクトされます。すべてがうまく機能していますが、データベースで正しいユーザー名とパスワードを入力すると、ログインできません。インターセプターを削除すると、管理ページにログインできます。

ログインの前後にユーザーのインターセプターチェックセッションが発生する可能性がありますが、ユーザー名とパスワードがtrueであるにもかかわらず、アプリケーション、セッションがnullになる理由がわからない場合がありますが、セッションを設定すると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();
        }
    }
}

私のストラット設定

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

また、ユーザーが初めてログインしようとしているかどうかを確認する必要があります。

ユーザーが初めてログインしようとすると、セッションは常にnullになるため、ログインページにリダイレクトされます。

このために、ログインフォームで他の1つのパラメーターを使用して、ユーザーがインターセプター内で初めてログインしようとしているかどうかを確認し、ログインしている場合はアクションを呼び出すことができます。

例えば:

<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();
}
于 2013-04-07T05:21:34.433 に答える