Forward 和Redirect的区别
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,刷新请求,自然,是非法访问了,问题就解决了。
==========================================================
redirect 是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址,一般来说浏览器会用刚才请求的所有参数重新请求,所以session,request参数都可以获取。