So I just stumbled into doing this little trick. It may go against some pattern, or best practice, but I’m sure there’s a use for it somewhere.
In Struts 1.3 (and probably any Struts 1.x), it is sometimes useful to have a request chain across multiple Action classes, maybe to break them up into more manageable sections. But maybe you don’t want step-2 of a multi-Action process be accessible externally. If you configure your Actions like this in your
struts-config.xml, you can do just that.
<action path="/refresh" type="com.philihp.action.RefreshPartOne"> <forward name="default" path="/refresh#2.do" /> </action> <action path="/refresh#2" type="com.philihp.action.RefreshPartTwo"> <forward name="default" path="/" redirect="true" /> </action>
To trigger it, have the user goto
/refresh.do. Struts will call
RefreshPartOne.execute(), and assuming it returns the default ActionForward,
it will call RefreshPartTwo.execute().
If the user tries to call
/refresh#2.do, they will get an error.
The browser will strip out the
from the URL and tell the server it wants to see /refresh, which doesn’t
exist. It may be possible to carefully craft a request to the server though,
and it’s up to your container (e.g. Tomcat, Glassfish) to strip out the
fragment. Behavior is probably undefined because
RFC 1738 says the
#’ is unsafe and should never be sent in a URL. So test it out
if you’re really curious.