`
netfork
  • 浏览: 490447 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

由IE浏览器引发的Struts2的Bug(submit无法传至服务器)

阅读更多
Struts2问题还真不少,哎,无耐已经上了这条船。
现在公开这个由IE浏览器引起的Bug,希望引起大家的注意。
下文也将给出一个简单的解决方案。

另注:如果觉得本文还点价值,请顺便帮忙解决一下以下的问题,不胜感激。
(问题放到“问答”里,没人理啊,无耐再次被扔到“问答”里,javaeye管理员的某些倾向性实在无法理解)
http://www.iteye.com/problems/7876

测试环境:IE(6和7均可)、Struts2(struts2-core-2.1.2.jar)

背景及现象描述
写一个基于Struts2的页面,使用Struts2的动态方法调用(struts.enable.DynamicMethodInvocation设为true)。
注意在这个页面上只有一个输入框,其他的标签只要不是输入框均可以加上去,加上submit标签,给这个submit标签增加一个method属性,或是将name属性定义为:method:xxxx,即使用动态方法提交。
通过IE访问刚刚写的页面,将光标放到页面唯一的一个输入框中,回车,你会发现,你的页面并不会提交到我们指定的动态方法中,搞不好在页面上还会出现异常信息。但是,如果是通过鼠标点击那个submit标签生成的提交按钮,就没有任何问题;或是换用Firefox浏览器,也没有任何问题。
后来经过测试,如果页面上有两个输入框,通过IE提交,也没有任何问题。

具体代码
<h3>修改个人信息</h3>
<div class="sect-content">
    <@s.form cssClass="nf" validate="true">
        <#if (fieldErrors?exists && fieldErrors?size > 0)>
           <div class="msg-error"><@s.fielderror /></div>
        </#if>
        <p>
            <label class="f-label">用户名</label>
            <span>
                ${user.username}
                <@s.hidden name="user.id" />
                <@s.hidden name="user.username" />
            </span>
        </p>
        <p>
            <label class="f-label" for="user.occupation">职业</label>
            <@s.select cssClass="f-select" id="user.occupation" name="user.occupation" list=util.occupationMap required="true" />
        </p>
        <p>
            <label class="f-label" for="user.email">电子邮箱</label>
            <@s.textfield cssClass="f-text" id="user.email" name="user.email" required="true" />
        </p>
        <p class="act">
            <@s.submit cssClass="f-button" value="修改" method="iEdit" />
        </p>
    </@s.form>
</div>


注意,上面的代码中,只有电子邮箱一个输入框textfield,其他的有hidden、select、submit。
IE浏览器下,当将光标放到电子邮箱的输入框后,直接回车,将无法提交到action的“iEdit”方法,而会重复提交到当面页面action对应的方法。

页面截图:


原因分析
还得对Struts2的源代码进行Debug。
发现org.apache.struts2.dispatcher.mapper.DefaultActionMapper类的handleSpecialParameters方法中会调用request的getParameterMap()方法,然后从中提出submit的name,然后分离出要调用的method名。
不幸的是,IE这个大垃圾并没有象struts2的开发者所预期的那样,只要给submit起了名就会通过request向服务器端提交。当页面上只有一个textfield时,直接在这个输入框下按下回车时,submit这个按钮的name是传不到后台的。
另外,如果页面上有两个输入框,通过IE浏览器提交时,不会有这个Bug。

下面是通过鼠标点提交按钮时的Debug截图。此时,submit的name是可以传到服务器端的。


解决方法
明白了出现这个Bug的原因,其实解决方案可以有好多种。这里说一个简单点的。
可以在定义submit标签时,不要定义method属性;当然也不要定义如name="method:xxxx"这样的属性。
在页面上加一个html的hidden标签,name属性可以定义为如:name="method:xxxx"(xxxx是对应Action类中的方法名)这样,即可解决因为IE引发的Bug。

解决方案的具体代码如下
<p class="act">
    <@s.submit cssClass="f-button" value="修改" />
    <input type="hidden" name="method:iEdit" />
</p>


其他的方法大家自己想吧,我还能想到的是重定义一下submit标签,当带有method属性时,生成的html代码中,顺便加一个html的hidden标签,这样,就不需要在每个可能有问题的页面中单独对应了。

  • 大小: 32.3 KB
  • 大小: 38 KB
分享到:
评论
7 楼 energykey 2009-08-13  
向楼主学习了,至今我还没跟踪到源码里去哈,个破IE。。。
6 楼 kjj 2009-07-27  
就不会变通一下么,非得跟ie对这干!!
5 楼 netfork 2009-06-24  
好久不搞java了,eclipse好久不开了。
可以通过eclipse把jar包跟源码关联起来,如果不太明白,google一下吧。
4 楼 xiangtui 2009-06-24  
请问一下楼主,debug的时候,怎样可以去看Jar包里的内容。
3 楼 kimmking 2009-05-22  
你那个cglib的问题,
异常信息中有一句:
Superclass has no null constructors but no arguments were given  
2 楼 goldpicker 2009-05-21  
仔细看了文档,原来Submit控件的Button样式就是在IE6下有问题,只能换Input了。
1 楼 goldpicker 2009-05-21  
我在IE6下发现另外一个怪异的问题,还不知道咋解决
如果有两个Submit控件,method是不同的方法,IE7只会提交点击的那个,而IE6会把两个方法都提交上去,结果服务器始终执行一个方法A,即使我点击的是B的按钮。真晕

相关推荐

    Struts2 校验器

    6. **拦截器(Interceptor)**:Struts2的校验过程是由一系列拦截器完成的,如`ValidationInterceptor`负责调用校验规则。开发者可以通过调整拦截器栈顺序或添加自定义拦截器来定制校验流程。 7. **国际化支持**:...

    Struts2教程:处理一个form多个submit.doc

    Struts2是一个流行的Java web开发框架,用于构建MVC(模型-视图-控制器)架构的应用程序。在处理一个表单(form)中存在多个submit按钮的情况时,Struts2提供了一种优雅的方式来区分用户点击了哪个按钮,而无需像...

    struts2-scan_struts2-scan_struts2scan_scan_struts2漏洞_

    Struts2是一个非常流行的Java MVC框架,用于构建企业级Web应用程序。然而,它在历史上曾出现过多个安全漏洞,其中最著名的就是“Struts2漏洞”。这个标题和描述提到的"struts2-scan"是一种工具,专门用来检测Struts2...

    Struts2_s2-016&017&ognl2.6.11_patch漏洞补丁

    struts.xml文件中新增以下内容: &lt;!-- 为修复struts2 s2-016、s2-017漏洞,重写DefaultActionMapper --&gt; &lt;bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myDefaultActionMapper" class=...

    struts2-016/017漏洞解决

    Struts2是一个非常流行的Java Web开发框架,它提供了一种模型-视图-控制器(MVC)架构,便于开发者创建动态、数据驱动的Web应用程序。然而,任何软件都可能存在安全漏洞,Struts2也不例外。"struts2-016/017漏洞"指...

    struts2 最新漏洞 S2-016、S2-017修补方案 .docx

    Struts2 是一个基于 Java 的 Web 应用程序框架,由 Apache 软件基金会维护。最近,Struts2 发生了两个严重的漏洞,分别是 S2-016 和 S2-017,这两个漏洞可能会导致攻击者执行恶意代码,从而危害到网站的安全。 S2-...

    Struts2漏洞检查工具Struts2.2019.V2.3

    Struts2是一款非常流行的...同时,对于开发者来说,了解Struts2的安全隐患以及如何避免它们是至关重要的,这样才能更好地保障应用的安全性。定期进行漏洞扫描和更新Struts2到最新版本,是防止这类安全问题的有效手段。

    struts2简单例子

    Struts2是一个强大的Java EE应用程序框架,用于构建MVC(模型-视图-控制器)架构的Web应用。这个“struts2简单例子”是初学者理解Struts2工作原理和核心概念的一个很好的起点。让我们深入探讨一下Struts2的基础知识...

    struts2项目部署

    Struts2是一个流行的Java web框架,它为开发者提供了一种模型-视图-控制器(MVC)架构,便于创建结构清晰、可维护性高的企业级应用程序。本教程将详细介绍如何部署一个基于Struts2的项目,特别适合初学者。由于实际...

    struts2官方中文帮助文档最新修复Bug版(绝版)

    Struts2官方中文帮助文档是开发者了解和学习该框架的重要参考资料,其最新修复Bug版更是对原有文档的错误进行了修正,提升了学习和使用的体验。 Struts2框架的主要特性包括: 1. **Action类**:每个业务逻辑操作...

    K8 Struts2 Exp 20160516(Struts2综合漏洞利用工具)

    2. **安全配置**:正确配置Struts2的过滤器和拦截器,避免暴露不必要的OGNL表达式执行路径。 3. **输入验证**:对用户输入进行严格检查和过滤,防止恶意数据进入系统。 4. **日志监控**:密切关注系统日志,及时发现...

    struts2 跳转至404 页面的解决方案

    总之,解决Struts2跳转至404页面的问题需要对整个应用的配置进行仔细检查,从Action、命名空间、拦截器到结果类型、资源路径,甚至包括服务器和IDE的设置。理解Struts2的工作原理,结合日志信息,通常可以找出导致...

    Struts2视频教程

    Struts2使用过滤器(Filter)作为前端控制器,相比于Struts1使用servlet作为前端控制器更加优雅。 - **适用范围**:Struts2广泛应用于企业级Java Web项目的开发中,特别是那些需要处理大量用户交互和数据展示的应用。 ...

    Struts2漏洞利用工具

    Struts2是一个基于MVC设计模式的Web应用框架,但2存在远程代码执行的漏洞,现在Struts2漏洞检测工具2017版增加S2-046,官方发布S2-046和S2-045漏洞引发原因一样,只是利用漏洞的位置发生了变化,S2-046方式可能绕过...

    struts2图片上传到服务器并异步加载显示服务器中图片

    在本场景中,我们关注的是如何使用Struts2实现图片上传到服务器,并且能异步加载显示这些图片。这个过程涉及的技术点包括文件上传、服务器存储、Ajax异步请求以及前端展示。 首先,我们需要在Struts2的配置文件...

    struts2 Https 配置

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展、模块化且易于管理的企业级应用程序。在当今网络安全日益重要的环境下,使用HTTPS协议来确保数据传输的安全性变得至关重要。Struts2支持HTTPS配置,可以...

    struts2验证框架

    Struts2 验证框架主要由以下几个组件组成: 1. Validator Framework:Validator Framework 是 Struts2 验证框架的核心组件,负责对用户输入的数据进行验证。Validator Framework 提供了一个通用的验证机制,可以对...

    struts2入门例子

    6. **运行流程**:当一个请求到达服务器,Struts2框架会解析`struts.xml`中的配置,找到对应的Action并执行。Action执行完毕后,根据返回的结果名找到相应的Result进行页面跳转。在整个过程中,拦截器链会被触发,...

    struts2ajax项目

    此外,为了更好地展示数据,可能还需要在Struts2中使用Interceptor(拦截器),例如,`params`拦截器用于将请求参数绑定到Action,`validation`拦截器负责验证表单数据,`workflow`拦截器管理Action的生命周期。...

    15年9月传智播客视频struts2

    根据提供的文件信息,我们可以推断出这是一套关于Struts2框架的教学视频资料,由知名的教育机构传智播客在2015年9月发布。下面将对Struts2框架进行详细介绍,并基于该视频资料可能涵盖的核心知识点进行展开。 ### ...

Global site tag (gtag.js) - Google Analytics