问题的由来:
在网页设计中,当一个用户退出登录时,往往要去除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("referer");
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
分享到:
相关推荐
struts2 重定向struts2 重定向struts2 重定向struts2 重定向struts2 重定向
关于struts2 Result的配置,有例子
从jsp页面提交form表单后,在struts.xml中寻找匹配的action。在action中处理完业务后返回,在struts.xml中的result属性中转向到另外一个action。
struts result类型中redirect与redirectAction的使用 包括参数传递。
在struts中测试登录的redirect,transmit 一个测试重定向和转发的demo。演示转发到jsp和action的过程。 供参考。
struts2中result类型之redirect,重定向
Struts2 result和type
NULL 博文链接:https://cdxs2.iteye.com/blog/1926350
NULL 博文链接:https://xiongjiajia.iteye.com/blog/1431330
Struts2 Result类型,整理的非常详细!
struts2防止表单重复提交--重定向
struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...
于是就研究使用Struts2的XSLT result方式来做页面显示。 网上相关的内容非常的少,我也研究了好久才玩转的。一开始总是有一些莫名其妙的问题出现,但最后基本上都是和配置相关的比较多。现在这个例子是整个工程项目...
struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面struts2简单登录页面
struts2中result类型之redirectAction
Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来作为Web框架进行开发,掌握Struts2是每个进行Web开发的Java程序员的一项必备技能。 本视频对Struts2...
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 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全struts2 总结工程大全...
这是一个struts2框架的处理流程的demo,里面有...struts2 result type类型的基本解释图片;相信对于初学者,通过这个demo可以基本掌握struts2的使用,注意,该demo是纯粹的struts2,没有其他框架内容,请注意甄别......