【问题标题】:How to track the session for all URLs in Struts 2如何在 Struts 2 中跟踪所有 URL 的会话
【发布时间】:2013-09-29 11:39:49
【问题描述】:

这是我的Interceptor 代码。我的目标是维护所有 URL 的会话,一旦注销完成,用户就无法访问任何 URL。

import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class AuthenticationInterceptor implements Interceptor {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("inside the destroy() of interceptor");
    }
    public void init() {
        // TODO Auto-generated method stub
        System.out.println("inside the init() of interceptor of new");
    }
    public String intercept(ActionInvocation ai) throws Exception {
        // TODO Auto-generated method stub
        System.out.println("inside the interceptor()......new");
        if(ai.getAction() instanceof LogoutAction){
            Map session = ai.getInvocationContext().getSession();
            if (session.get("user")!=null){
                System.out.println("inside logout of the session");
                return ai.invoke();
            }
            else{
                return "login";
            }
        }
        else
        return ai.invoke();

    }

这是我的注销操作代码:

 package com.uttara.reg;

    import java.util.Map;

    import org.apache.struts2.interceptor.SessionAware;

    import com.opensymphony.xwork2.ActionSupport;

    public class LogoutAction extends ActionSupport implements SessionAware {

        private Map session;
        public void setSession(Map s) {
            session = s;
        }

        @Override
        public String execute() throws Exception {
            System.out.println("inside execute() of LA");
            if(session.get("user")!=null){  
                session.remove("user");
            return "ridirect";
            }
            return "failure";
        }

    }

这是我的另一个操作文件,一旦登录完成,用户将开始注册用户我的问题是如何在这里检查会话

import com.opensymphony.xwork2.ActionSupport;
public class RegisterAction extends ActionSupport implements SessionAware { 
private static final long serialVersionUID = 1L;
public RegisterAction() {
    System.out.println("inside the Register action const.");
}
private RegBean bean;
private Map session;
public RegBean getBean() {
    return bean;
}
public void setBean(RegBean bean) {
    this.bean = bean;
}
@Override
    public String execute() throws Exception {
     System.out.println("inside execute method");
     System.out.println(bean);
        Model m = new Model();
        String result = m.register(bean);
        if(result.equals(SUCCESS))
            return SUCCESS;
        else{
            addActionError(getText(result));
            return "failure";
        }
    }
@Override
    public void validate(){
     System.out.println("inside validate method");

    }
public void setSession(Map session) {
    // TODO Auto-generated method stub
    System.out.println("inside setSession");
    this.session = session;
}

}

【问题讨论】:

  • 正如我在您的代码中看到的,如果他/她之前已注销并尝试再次调用注销操作,您会将用户重定向到登录页面。你真正想要达到什么目的?你能详细解释一下吗?
  • 云任何人请帮助
  • 我的问题一旦用户登录,我将为他创建会话,之后他可以做任何他想做的事情,一旦他完成注销,他就无法在其中输入 do 功能必须重定向到登录页面坦克你
  • 是否需要为登录后创建的所有动作类设置会话

标签: java session struts2 action interceptor


【解决方案1】:

如果您的所有应用程序页面都必须由经过身份验证的用户访问,那么在他/她的会话中没有user 属性的任何情况下,您都必须将用户重定向到login 页面。 问题在于您的if 条件。我不知道你在你的LogoutAction 中做什么,但如果它是通过从他/她的会话中删除user 属性来使用户会话失效,那么你的if 块应该是这样的:

public String intercept(ActionInvocation ai) throws Exception {
    // TODO Auto-generated method stub
    System.out.println("inside the interceptor()......new");
    Map session = ai.getInvocationContext().getSession();
    if ((session.get("user") != null) || 
        ((session.get("user") == null) && (ai.getAction() instanceof LoginAction)) {
        return ai.invoke();
    } else {
        return "login";
    }
}

这样,用户如果没有先通过登录动作,就没有选择的余地了。 LogoutAction 操作只是应用程序中的任何其他操作,并且可以在用户会话中有 user 属性的情况下调用。

您原来的 if 语句仅在请求的操作是注销的情况下检查此条件。

【讨论】:

  • 我做了同样的事情!但发生的事情是我无法自己登录谢谢你
  • 它在 eclips 中使用时工作正常,但我要在无法正常工作的浏览器中使用你能解释一下问题所在
  • 不,我什至无法理解它是什么!一旦我再次注销,用户可以通过单击浏览器后退按钮转到其他 url,但它在 eclipse 默认浏览器中工作正常
  • 由于问题只存在于您的浏览器中,可能是从缓存中读取,而不是您的服务器代码!是否仅通过单击后退按钮会出现问题,或者如果用户尝试在地址栏中键入新地址,您是否会遇到同样的问题?注销后,键入您在注销前未访问过的操作的地址,并在另一个时间输入您在注销前访问过的 URL。
  • 能否请您告诉我注销后如何清除浏览器缓存,谢谢您的帮助..
【解决方案2】:

我认为您在配置中遇到的错误

<action name="logout" class="com.uttara.reg.LogoutAction">
        <result name="success">Login.jsp</result>
        <result name="failure">Error.jsp</result>
</action>

【讨论】:

    猜你喜欢
    • 2011-10-10
    • 1970-01-01
    • 2014-07-27
    • 1970-01-01
    • 2012-06-21
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-05
    相关资源
    最近更新 更多