Forward是container直接将request到一个别的组件,这种方式下,实际上也就是response之前,用户请求request对象可以经过多个组件处理。request的parameters会传递到新的组件,如果新的组件path也包含query string,这部分参数也会加到request中,如果参数名重复,就覆盖旧的值。这种是Forward 元素定义的forward对象缺省的转向方式。
Redirect方式利用的是HTTP协议中的redirect机制,让客户端发起新的请求,到新的URI。初始的参数和request上下文都不在了。只有Action Forward路径中定义的参数。这种方式需要在struts配置文件中,将Forward元素的redirect属性设置为true。
项目中遇到相关的问题。点击logout,虽然session invalidate了,但是,退回到登录提交的地方,刷新页面就可以再次进入。用了一些方法,如清除历史, html头设置no cache,响应头设no cache都没有作用。后来发现是浏览器在刷新某个历史页面的时候,同时提交了历史的表单。于是,我们在struts配置文件中将登录后的Action Forward 设置为redirect方式的,这样,历史中登录提交的页面实际上是Forward后的Action,刷新请求,自然,是非法访问了,问题就解决了。
==========================================================
forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器,浏览器根本不知道服务器发送的内容是从哪儿来的,所以它的地址栏中还是原来的地址。
redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。
--转自
该贴由koei123转至本版2015-7-14 11:05:51