首先来看一段ACTION代码
@ParentPackage(value="noneedlogin")
public class AdminLoginAction extends ActionSupport
implements SessionAware,ModelDriven<AdminUser>{
@Action
(
value="/admin/adminlogin",
results={
@Result(name="success", location="/admin/admin-login-ok.jsp", type="redirect"),
@Result(name="login-failed", location="/admin/login", type="redirect")
}
)
public String login() throws IOException{
if(validatecaptchaCode()){
AdminUser adminUser = adminUserManager.findByUserName(entity.getUserName());
String md5String = DigestUtils.md5Hex(entity.getPassword());
if(adminUser==null ||(!md5String.equals( adminUser.getPassword() )) ){
log.error("用户名或密码有误,请重请登录");
addActionMessage("用户名或密码有误,请重请登录");
return "login-failed";
}
log.info("login ok!add to session-------------");
SessionFactory.addAdminUserSession(session,adminUser);
String lastVisitUrl = SessionFactory.getLastAdminVistedUrl(session);
if(lastVisitUrl!=null && lastVisitUrl.length()>2){
log.info("last visited :"+lastVisitUrl);
ServletActionContext.getResponse().sendRedirect(lastVisitUrl);
return null;
}
return this.SUCCESS;
}else{
log.error("验证码有误,请重请登录");
addActionMessage("验证码有误,请重请登录");
return "login-failed";
}
}
这里我们只关注ActionMessage,看到没有无论是成功还是失败都是redirect方式的跳转,我们这里所说的redirect传递丢失ActionMessage问题指的是@Result(name="login-failed", location="/admin/login", type="redirect")这种
方式,这种方式不会直接转换到一个xx.jsp上,而是中间经过了一个其他的Action,大家都知道redirect方式传递关于保存在request请求域中的数值都会丢失,多以我们要做的就是使这个值保存到SESSION中去
具体解决方案
上边的Action类是在noneedlogin包类,我们要做的就是在struts.xml中noneedlogin包的默认拦截器中加入store拦截器
<package name="noneedlogin" extends="convention-default" >
<interceptors>
<interceptor-stack name="storeStack">
<interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="storeStack" />
</package>
当然这不是唯一的写法,以一种写法还可以是下面这样的
<constant name="struts.convention.default.parent.package" value="crud-default" />
<constant name="struts.convention.package.locators" value="web" />
<constant name="struts.convention.package.locators.basePackage" value="com.javacrazyer.demo" />
<!-- 用于CRUD Action的parent package -->
<package name="crud-default" extends="convention-default, json-default">
<!-- 基于paramsPrepareParamsStack,
增加store interceptor保证actionMessage在redirect后不会丢失 -->
<interceptors>
<interceptor-stack name="crudStack">
<interceptor-ref name="store">
<param name="operationMode">AUTOMATIC</param>
</interceptor-ref>
<interceptor-ref name="paramsPrepareParamsStack" />
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="crudStack" />
</package>
好了上面说到本文章解决方案是针对@Result(name="login-failed", location="/admin/login", type="redirect")而
不是针对@Result(name="success", location="/admin/admin-login-ok.jsp", type="redirect"),这是因为在
直接以redirect方式跳转到JSP页面的这种,本方案是解决不了问题的,所以如果是直接跳转到JSP页面type类型就要改成是dispatcher,即如下方式
@Action(value="/admin/login",results={@Result(name="login", location="/admin/login.jsp", type="dispatcher")} )
public String execute(){
return "login";
}
分享到:
相关推荐
在Struts2框架中,ActionError和ActionMessage是处理用户输入验证和错误反馈的重要组件,它们使得开发者能够优雅地管理应用程序中的错误信息和用户消息。 ActionError类是用来存储错误信息的,它继承自`java.lang....
在Struts2中,`ActionError`和`ActionMessage`是两个重要的概念,它们用于处理用户界面与控制器之间的错误信息和成功消息传递。这两个类是Struts2提供的一种灵活的方式来管理验证失败或操作成功时的反馈信息。 **...
标题中的"Struts2漏洞检查工具2018版.rar"指的是一个专门针对Struts2框架的2018年发布的漏洞检测工具。这个工具可能包含了针对那时已知的Struts2安全问题的扫描功能,帮助系统管理员和开发者识别并修复潜在的安全...
这个标签在Struts1中没有直接对应的标签,但在Struts2中非常有用,特别是在需要用户选择多个选项的情况下。 - **`<s:combobox>`**:类似于HTML的下拉列表框,但提供了更多功能,如自动完成、动态加载等特性。 ####...
在给定的标题和描述中,提到了几个关键的Struts2漏洞,包括S2-057、S2-048、S2-046、S2-045、S2-016、S2-019和S2-037、S2-032。下面将详细阐述这些漏洞及其解决方案。 1. S2-057:此漏洞也被称为“CVE-2017-5638”...
然而,Struts2在过去的几年中遭受了一系列的安全漏洞,这些漏洞使得恶意攻击者能够利用这些弱点对服务器进行攻击,包括远程代码执行(RCE)、信息泄露等严重问题。本文将深入探讨Struts2漏洞及其利用工具,帮助读者...
以下是一些关于Struts框架中常见的问题及其解决方案: 1. **ActionServlet配置问题**:如果在web.xml文件中没有正确配置ActionServlet,可能会导致应用无法启动。确保 `<servlet>` 和 `<servlet-mapping>` 配置正确...
Struts1.3提供ActionMessage和ActionError接口,它们可以在ActionContext中存储,并在JSP页面上显示。在Action类中添加错误或消息,然后在JSP页面通过Struts标签库进行渲染。 4. 配置文件中的全局转发与重定向 ...
Struts2是一个强大的MVC框架,它在Java Web开发中占据着重要的地位。WebWork2是Struts2的前身,其思想和设计被融入到Struts2中,为开发者提供了丰富的功能和便捷的API。本参考文档主要关注的是Struts2中的标签(Tags...
Struts2的安全问题主要集中在其ActionMessage、ActionError和ActionSupport类的使用上。例如,S2-016、S2-045、S2-012等漏洞,都是由于框架处理用户输入时的不当操作导致的。攻击者可以通过精心构造的HTTP请求来...
3. **S2-016(CVE-2013-2261)**:这是一个关于Struts2的ActionMessage类的漏洞,攻击者可以通过构造特定的OGNL表达式来触发远程代码执行。虽然这个漏洞相对较老,但仍有未打补丁的系统可能受到影响。 4. **S2-048...
- `<s:hidden></s:hidden>`:创建一个隐藏字段,用于在表单中传递不可见的值。 **I. 国际化和包含** - `<s:i18n name=""></s:i18n>`:加载资源包到值堆栈,实现国际化。 - `<s:include value=""></s:include>`:...
在Struts中,ActionForm类是处理用户输入数据的核心组件,它封装了请求参数并负责业务逻辑验证。本文将详细讨论如何在Struts中使用ActionForm的`validate`方法进行数据验证。 `validate`方法是在ActionForm中定义的...
接下来,关于在第二个Action中获取第一个Action的`actionMessage`,`actionMessage`是Struts提供的一个机制,用于在Action之间传递消息。在第一个Action中,我们可以创建一个`ActionMessage`对象,添加消息,并将其...
在Struts2中,数据验证提供了多种方式来检查用户输入的有效性。传统的方法包括在JSP页面或Servlet中进行验证,以及使用JavaScript进行前端验证。然而,这些方法往往不够灵活和易于维护。Struts2引入了自己的数据验证...
而在 Struts2 中,所有的标签都被统一管理,并通过在 JSP 文件头部声明 `<%@ taglib prefix="s" uri="/struts-tags" %>` 来启用 Struts2 的标签库。这种方式简化了开发过程中的配置工作,使得开发者可以更加专注于...
在Struts2中,标签库是其核心功能之一,极大地简化了视图层的开发工作。"struts2-tags-API.rar"包含的是Struts2标签库的详细API文档,对于开发者来说是不可或缺的参考资料。 `struts2-api`标签表示这个资源与Struts...
其基本原理是在客户端与服务器之间传递一个随机生成的唯一标识符(即令牌),通过对比客户端提交时携带的令牌与服务器端存储的令牌是否一致来判断请求是否有效。如果令牌匹配,则认为是合法请求;反之,则拒绝该请求...
在Struts2中实现文件和图片上传是一项常见的需求,尤其在处理用户提交的表单数据时,比如上传个人头像或者上传文档附件等。本篇文章将详细介绍如何在Struts2中实现这一功能。 首先,我们需要在Struts2的配置文件...