diff --git a/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java b/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java index 7ac1e6dc8..11b7bae71 100644 --- a/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java +++ b/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java @@ -22,9 +22,11 @@ package org.apache.struts2.dispatcher.mapper; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -285,15 +287,26 @@ public class DefaultActionMapper implements ActionMapper { public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) { // handle special parameter prefixes. + Set uniqueParameters = new HashSet(); Map parameterMap = request.getParameterMap(); for (Iterator iterator = parameterMap.keySet().iterator(); iterator .hasNext();) { String key = (String) iterator.next(); - ParameterAction parameterAction = (ParameterAction) prefixTrie - .get(key); - if (parameterAction != null) { - parameterAction.execute(key, mapping); - break; + + // Strip off the image button location info, if found + if (key.endsWith(".x") || key.endsWith(".y")) { + key = key.substring(0, key.length() - 2); + } + + // Ensure a parameter doesn't get processed twice + if (!uniqueParameters.contains(key)) { + ParameterAction parameterAction = (ParameterAction) prefixTrie + .get(key); + if (parameterAction != null) { + parameterAction.execute(key, mapping); + uniqueParameters.add(key); + break; + } } } } diff --git a/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java b/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java index 8382138fe..3032a27fd 100644 --- a/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java +++ b/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java @@ -239,6 +239,37 @@ public class DefaultActionMapperTest extends StrutsTestCase { assertEquals(actionMapping.getName(), "myAction"); } + + public void testActionPrefix_fromImageButton() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", ""); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.x", ""); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.y", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals(actionMapping.getName(), "myAction"); + } + + public void testActionPrefix_fromIEImageButton() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.x", ""); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.y", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals(actionMapping.getName(), "myAction"); + } public void testRedirectPrefix() throws Exception { Map parameterMap = new HashMap();