我正在阅读Struts2 in Action,并且它说如果拦截器B在拦截器A之后触发,并且B确定不应该允许控制转到Action(因为可能存在由DefaultWorkFLowInterceptor完成的验证错误).然后它返回“输入”..并且页面呈现给用户.然后控件返回到拦截器A,但是A现在无法修改结果,因为页面已经发送到客户端.
但是,由于拦截器B只返回一个字符串,拦截器A只能在其位置返回另一个字符串,结果会发生变化. DefaultWorkFLowInterceptor只返回一个字符串,它实际上并没有向响应流写任何东西,所以当控制返回到它的前面的拦截器时,为什么它们不能改变输入呢?
解决方法:
即使您更改了结果字符串,也因为结果已经呈现给客户端(UI)而为时已晚.
拦截器调用以相反的顺序发生,因此任何后处理工作都可以像清理任何资源或编写任何关键信息一样完成.
如果您有兴趣更改结果,可以使用PreResultListener.A PreResultListener可以影响拦截器/动作阶段和结果阶段之间的动作调用.典型用途包括切换到不同的Result或以某种方式在Result执行之前修改Result或Action对象.
有关详细信息,请参阅文档