嗨,我开发了小型 Web 应用程序,因为所有功能都可以正常工作,但是当我按下浏览器后退按钮时,它会显示上一页,如果您执行或单击任何操作按钮,它将调用并执行该操作如何防止下面是我的用户 Action 类和 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>
注意
正如您在我注销后所看到的那样,我正在清除 session 变量,但是如果用户单击返回它会显示注册页面,如果他单击注册按钮,它将执行注册操作,因此任何人都可以告诉我如何防止在注销后执行该操作如果他点击任何 Action 事件按钮,它应该将其重定向到登录页面。
最佳答案
那么你试图做的事情在我看来是正确的。关于浏览器后退按钮,这与 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 请求,而不是从浏览器的缓存中加载页面,您希望通过将上述 header 添加到响应来指示浏览器不缓存页面:
关于当您点击后退按钮时执行的 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;
}
}
此拦截器将检查用户是否在 session 中,如果用户不在,他将被重定向到登录页面,对于其他情况,请求将转到层次结构中的下一个拦截器。
现在在 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,它提供了强大而灵活的方法来处理这些用例
关于对 struts2 中的每个 Action 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10023951/