`
xiaolongfeixiang
  • 浏览: 234712 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Struts2 result重定向到引用页

阅读更多

问题的由来:


在网页设计中,当一个用户退出登录时,往往要去除Session中的登录信息,然后返回之前引用页。在Action中,删除登录信息,很简单就可以做到。但是如何使result指向引用页呢?

 

尝试

 

1、return的 Action.INPUT:( 失败 )


     报错是 找不到 名为Input的result配置。


2、在result的配置中使用OGNL表达式:( 失败 )

 

<result type="redirect">${#request.header['referer']}</result>

 

    控制台会有警告,大意是 无法解析表达式#request.header['referer']。


    其实,仔细想来(也测试过)。在Struts2的 OGNL context中的 request、session等,仅仅包含 key-value的内容。和Servlet规范中的request、session等不一样。


3、在Action中,直接获取HTTPServletRequest,然后配置result转向。( 成功 )


LogoutAction中有个属性:

 

//................
private String preURL;

public String getPreURL() {
        return preURL;
}

//.................

 

 然后在Action的某个方法(比如execute)中,操作HTTPServletRequest,改变preURL的值。

 

//..........
HttpServletRequest request = ServletActionContext.getRequest();

String contextPath = request.getContextPath();

String preURL = request.getHeader(&quot;referer&quot;);

int begin = preURL.indexOf(contextPath);

preURL = preURL.substring(begin + contextPath.length());
//..........

 

最后,配置result:

<result type="redirect">${preURL}</result>

 

 不足之处:


需要在每一个要求获得引用页的Action中加入相同的代码,解决方式不够优雅 ⊙﹏⊙。


 最终解决:借助于Struts2提供的Interceptor来优雅地解决问题。


1、一个interface -- PreURLAware

 

package edu.xjtu.jxg.struts.aware;

/**
 * Actions that want access to the Where the request is come from should implement this interface.<p />
 *
 * This interface uses the HTTPServletQuest.getHeader("referer") to achieve this goal.<p/>
 */
public interface PreURLAware {
	
	public void setPreURL(String preURL);
}
 

2、一个Interceptor -- PreURLInterceptor

 

package edu.xjtu.jxg.interceptor;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

import edu.xjtu.jxg.struts.aware.PreURLAware;

public class PreURLInterceptor extends AbstractInterceptor {

	private static final long serialVersionUID = 5421682585093337518L;

	@Override
	public String intercept(ActionInvocation invocation) throws Exception {

		Object obj = invocation.getAction();
		if (obj instanceof PreURLAware) {
			HttpServletRequest request = ServletActionContext.getRequest();

			String contextPath = request.getContextPath();
			String preURL = request.getHeader("referer");

			if (preURL == null)
				((PreURLAware) obj).setPreURL(null);
			else {
				int begin = preURL.indexOf(contextPath);
				preURL = preURL.substring(begin + contextPath.length());
				((PreURLAware) obj).setPreURL(preURL);
			}
		}
		return invocation.invoke();
	}
}
 

3、修改需要获得引用页的Action

 

需要获得引用页(preURL)的Action实现 PreURLAware接口

 

4、修改result的配置,即加入PreURLInterceptor

 

   定义Interceptor:

 

 

		<interceptors>
			<interceptor name="preURL"
				class="edu.xjtu.jxg.interceptor.PreURLInterceptor"></interceptor>
		</interceptors>
 


   引用Interceptor:

 

		<action name="logout" class="edu.xjtu.jxg.struts.action.LogoutAction">
			<interceptor-ref name="preURL"></interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<result type="redirect">${preURL}</result>
		</action>
 

大功告成!!O(∩_∩)O

 

3
3
分享到:
评论
3 楼 yangzhuzhi 2012-03-15  
reuqest.getHeader("Referer") 没有这个 头信息吧。。。理论上这个应该是从客户端获取的。。。到底咋回事儿?
2 楼 qq123zhz 2011-09-16  
正需要。。
1 楼 xiaolongfeixiang 2010-04-14  
这样也是可以获取HttpServletReqeust对象的
ActionContext ac = invocation.getInvocationContext();

HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST);

相关推荐

    struts2 重定向

    struts2 重定向struts2 重定向struts2 重定向struts2 重定向struts2 重定向

    struts2 result配置详解

    关于struts2 Result的配置,有例子

    struts2 result转向到action

    从jsp页面提交form表单后,在struts.xml中寻找匹配的action。在action中处理完业务后返回,在struts.xml中的result属性中转向到另外一个action。

    struts2重定向实例源码

    struts result类型中redirect与redirectAction的使用 包括参数传递。

    一个基于struts的重定向和转发实例

    在struts中测试登录的redirect,transmit 一个测试重定向和转发的demo。演示转发到jsp和action的过程。 供参考。

    struts2中result类型之redirect

    struts2中result类型之redirect,重定向

    Struts2 result和type

    Struts2 result和type

    struts2 Result类型

    NULL 博文链接:https://cdxs2.iteye.com/blog/1926350

    struts2 result type 介绍

    NULL 博文链接:https://xiongjiajia.iteye.com/blog/1431330

    Struts2 Result类型

    Struts2 Result类型,整理的非常详细!

    struts2防止表单重复提交--重定向

    struts2防止表单重复提交--重定向

    struts1和struts2的区别

    struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...

    struts2 xslt result 实现

    于是就研究使用Struts2的XSLT result方式来做页面显示。 网上相关的内容非常的少,我也研究了好久才玩转的。一开始总是有一些莫名其妙的问题出现,但最后基本上都是和配置相关的比较多。现在这个例子是整个工程项目...

    struts2简单登录页面

    struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面

    struts2中result类型之redirectAction

    struts2中result类型之redirectAction

    Struts2视频教程

    Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来作为Web框架进行开发,掌握Struts2是每个进行Web开发的Java程序员的一项必备技能。 本视频对Struts2...

    struts2-core.jar

    struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...

    Struts2资源文件在jsp页面中显示乱码解决

    Struts2资源文件在jsp页面中显示乱码解决

    struts2 总结工程大全

    struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...

    struts2 Demo

    这是一个struts2框架的处理流程的demo,里面有...struts2 result type类型的基本解释图片;相信对于初学者,通过这个demo可以基本掌握struts2的使用,注意,该demo是纯粹的struts2,没有其他框架内容,请注意甄别......

Global site tag (gtag.js) - Google Analytics