【问题标题】:Authentication on every action in struts2对 struts2 中的每个操作进行身份验证
【发布时间】:2012-04-18 22:02:38
【问题描述】:

您好,我开发了小型 Web 应用程序,所有功能都可以正常工作,但是当我按下浏览器后退按钮时,它会显示上一页,如果您执行或单击任何操作按钮,它将调用并执行该操作如何防止用户下面是我的动作类和 struts 配置文件

 public class LoginAction extends ActionSupport implements ModelDriven, SessionAware,    ServletRequestAware {

private static final long serialVersionUID = -3197657749784237381L;
@SuppressWarnings("unchecked")
private Map session;
private HttpServletRequest request;
private LoginBean logBean = new LoginBean();

public LoginAction() {
}

public Object getModel() {
    return logBean;
}

public LoginBean getLogBean() {
    return logBean;
}

public void setLogBean(LoginBean logBean) {
    this.logBean = logBean;
}

public Map getSession() {
    return session;
}

public void setSession(Map session) {
    this.session = session;
}

/*  public static Log getLOG() {
    return LOG;
}

public static void setLOG(Log LOG) {
    ActionSupport.LOG = LOG;
}
*/

public void setServletRequest(HttpServletRequest request) {
    this.request = request;
}


public String execute() {
    return SUCCESS;
}

public String verifyLogin() {
    String target = "";
    LoginDB logDB = new LoginDB();
    UserBean ub = new UserBean();
    String ipAddress = request.getRemoteAddr();
    ub = logDB.verifyLogin(logBean.getLoginID(), logBean.getPassword());
    if (ub.getInvalid().equals("1")) {
        if (ub.getActive() != 0) {
            session = ActionContext.getContext().getSession();
            session.put("userBean", ub);
            target = SUCCESS;
        }
        else {
            addActionError("Your status is inactive!!!Please Contact Admin Or Activate Link");
            target = INPUT;
        }
    } 
    else {
        addActionError("Invalid LoginID or Password!");
        target = INPUT;
    }

    return target;
}

@SuppressWarnings("unchecked")
@SkipValidation
public String logOut() {
    //LoginDB loginDB = new LoginDB();
    String status = "";
   // String id = request.getParameter("userID");
    String ipAddress = request.getRemoteAddr();
    //int a = loginDB.logOut(id, ipAddress);
    if (true) {
        session.clear();
        session = null;
        if (session instanceof org.apache.struts2.dispatcher.SessionMap) {
            try {
                ((org.apache.struts2.dispatcher.SessionMap) session).invalidate();
            } catch (IllegalStateException e) {
            }
        }
        status = "success";
    } else {
        addActionError(getText("system.ERROR"));
        status = "error";
    }

    return status;
}

}

我的注册班

     public String execute() throws SQLException, ClassNotFoundException {
     Register rt = new Register();
     String status = rt.trailUser(user);
     if (status.equalsIgnoreCase("1")) 
    {
        if(Mail()==1)
        {
            addActionMessage("Congratulation you have success fully singed In check your  mail  to Activate Your Acount!");
            return SUCCESS;
        } 
        else
        {
            addActionError("Sign In Again!");
            return INPUT;
        }

    } 
    else {
        return ERROR;
    }
}

struts.xml

// <struts>
<!-- Configuration for the default package. -->
<constant name="struts.Devmode" value="false"></constant>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.custom.i18n.resources" value="ApplicationResources" />
<package name="default" extends="struts-default">
        <action name="users">
        <result>home.jsp </result>
    </action>
    <action name="UserAction" class="com.java.action.RegisterAction">
        <result name="input">/signup.jsp</result>
        <result name="success">/home.jsp</result>
        <result name="error">/error.jsp</result>
    </action>
    <action name="trialregister">
        <result>signup.jsp</result>
    </action>
    <action name="Activate" class="com.java.action.ActivationAction">
        <result name="input">/error.jsp</result>
        <result name="success">/home.jsp</result>
        <result name="error">/test1.jsp</result>
    </action>
    <action name="verifyLogin" class="com.java.action.LoginAction" method="verifyLogin">
        <result name="input">/home.jsp</result>
        <result name="success">/test1.jsp</result>
    </action>

    <action name="logOut" class="com.java.action.LoginAction" method="logOut">
        <interceptor-ref name="clear-cache"></interceptor-ref>
        <result name="error">/error.jsp</result>
        <result name="success">/home.jsp</result>
    </action>

    <action name="Back">
    <result>/home.jsp</result>    
    </action>
</package>
</struts>

注意 正如您在我注销后看到的那样,我正在清除会话变量,但是如果用户单击返回它会显示注册页面,并且如果他单击注册按钮它将执行注册操作,所以任何人都可以告诉我如何防止在注销后执行该操作如果他单击任何操作事件按钮,它应该将其重定向到登录页面。

【问题讨论】:

    标签: authentication struts2


    【解决方案1】:

    嗯,你想做的事情对我来说似乎是正确的。关于浏览器的后退按钮,这与 S2 无关,因为浏览器会因为浏览器缓存而将您移回点击后退按钮。

    虽然您可以请求浏览器清除缓存并设置一些标头,例如

    response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1.
    response.setHeader("Pragma", "no-cache"); // HTTP 1.0.
    response.setDateHeader("Expires", 0); // Proxies.
    

    上面的代码可以移动到拦截器中,并且可以配置您的注销操作,以便可以请求浏览器跟随您的标头。 上面的代码将在服务器上重新触发一个真正的 HTTP 请求,而不是从浏览器的缓存中加载页面,您想通过将上述标头添加到响应中来指示浏览器不缓存页面:

    关于当你点击返回按钮时你的 Action 类代码被执行,我建议你创建一个拦截器并配置该拦截器,以便只有登录的用户可以执行这些操作,并且应该要求未登录的用户首先登录。

    示例拦截器

    public class LoginInterceptor implements Interceptor {
    
    public LoginInterceptor() {
    }
    
    public void destroy() {
    
    }
    
    public void init() {
    
    }
    
    public String intercept(ActionInvocation actionInvocation) throws Exception {
    
        final ActionContext context = actionInvocation.getInvocationContext();
        HttpServletRequest request = (HttpServletRequest) context.get(ServletActionContext.HTTP_REQUEST);
        HttpSession session = request.getSession(true);
    
        //Code
    
        try {
    
            Users user= (Users) session.getAttribute("user");
    
            if (user== null) {
    
                return "login";
            }
    
        } catch (Exception e) {
            Logger.getLogger(LoginInterceptor.class.getName()).log(Level.INFO, "message", e);
        }
    
        //Invoke action
        String result = actionInvocation.invoke();
    
        return result;
    }
    }
    

    如果用户不存在,此拦截器将检查用户是否在会话中,他将被重定向到登录页面,对于其他情况,请求将转到层次结构中的下一个拦截器。

    现在在 struts.xml 文件中配置这个拦截器

    struts.xml

    <interceptors>  
           <interceptor class="myclass.LoginInterceptor" name="loginInterceptor">  
                          </interceptor>  
           <interceptor-stack name="loginStack">  
            <interceptor-ref name="loginInterceptor">  
            <interceptor-ref name="defaultStack">  
           </interceptor-ref>  
          </interceptor-ref>  
     </interceptors>
     <default-interceptor-ref name="loginStack">  
    

    配置完成后,您可以对所有您希望该用户登录的操作调用使用拦截器。

    有关如何执行此操作的更多详细信息,请参阅本教程。

    此拦截器技术仅用于学习目的,如果您想在实际项目中实现这样的用例,我建议使用一些安全框架,如 Spring-Security,它提供了强大而灵活的方式来处理这些用例

    【讨论】:

    • 我遇到了错误,我按照链接中完全相同的步骤操作,但我的项目在运行时显示错误,但未部署。
    • 你能说明错误是什么,否则很难提出任何建议
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多