如何在Struts 1中实现URL重定向跳转至外部登录页
Struts 1 实现外部站点重定向方案
以下为对应Struts2实现逻辑的Struts1等效实现方案,分为配置与代码两部分:
1. struts-config.xml 配置(对应Struts2的struts.xml配置)
Struts1的核心路由配置文件为struts-config.xml,对应原Struts2的Action映射配置示例如下:
<action path="/Home2" type="com.eppt.action.MasterAccountListAction" <!-- 若使用DispatchAction实现单Action多方法,需加parameter配置指定方法参数名 --> parameter="method" name="masterAccountForm" scope="request"> <!-- 对应原Struts2中unknownerror的Tiles结果,保持项目原有Tiles集成配置即可 --> <forward name="unknownerror" path="masteraccountlist" /> <!-- 预定义重定向逻辑视图,路径后续在业务代码中动态赋值 --> <forward name="wlgn" path="" redirect="true" /> <forward name="success" path="" redirect="true" /> </action>
2. Action业务逻辑实现(对应Struts2的wlgnReDirect方法)
Struts1的Action执行完成后返回ActionForward对象完成视图路由,不需要像Struts2那样返回字符串视图名,动态重定向的代码如下:
普通单方法Action写法
public class MasterAccountListAction extends Action { @Override public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { // 对应原逻辑的重定向地址赋值 String wlgntUrl = "https://wwwdev.idev.com/secure-login/en-us/?redirectUrl=http://www.yahoo.com"; String nextScreen = "wlgn"; // 从配置中拿到对应视图的Forward对象,动态设置重定向地址 ActionForward redirectForward = mapping.findForward(nextScreen); redirectForward.setPath(wlgntUrl); redirectForward.setRedirect(true); return redirectForward; } catch (Exception e) { // 对应原逻辑的异常处理 addGenericError(request); return mapping.findForward("unknownerror"); } } // 保留项目原有通用错误处理方法即可 private void addGenericError(HttpServletRequest request) { // 原有错误处理逻辑 } }
DispatchAction多方法写法
如果项目用DispatchAction实现和Struts2类似的单Action多方法映射,直接定义对应方法即可:
public class MasterAccountListAction extends DispatchAction { public ActionForward wlgnReDirect(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { try { String wlgntUrl = "https://wwwdev.idev.com/secure-login/en-us/?redirectUrl=http://www.yahoo.com"; ActionForward redirectForward = mapping.findForward("wlgn"); redirectForward.setPath(wlgntUrl); redirectForward.setRedirect(true); return redirectForward; } catch (Exception e) { addGenericError(request); return mapping.findForward("unknownerror"); } } private void addGenericError(HttpServletRequest request) { // 原有错误处理逻辑 } }
实现说明
- 以上实现的跳转行为和Struts2的
redirect结果类型完全一致:属于客户端302重定向,跳转后浏览器地址栏会显示外部登录页地址,不会将站内request属性传递到外部站点,符合跨站跳转的安全要求。 - Tiles视图配置不需要额外修改,只要保持项目原有Struts1+Tiles的集成规则,
unknownerror视图能正常路由到masteraccountlist页面即可。 - 如果不想在配置文件中预定义空路径的重定向forward,可以直接在代码中构造重定向结果,写法更简洁,效果完全一致:
// 第二个参数传true即代表使用客户端重定向模式 return new ActionForward(wlgntUrl, true); - 如果重定向地址需要动态拼接参数,直接在赋值给
wlgntUrl前完成拼接即可,Struts1会自动处理重定向响应头的标准格式输出。
内容的提问来源于stack exchange,提问作者JCP
相关产品推荐
相关产品推荐

