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 fragment identifier 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.