struts2中关于ActionMessage在redirect传递时丢失问题的解决方案

  1. @ParentPackage(value="noneedlogin")  
  2. public class AdminLoginAction extends ActionSupport   
  3.     implements SessionAware,ModelDriven<AdminUser>{  
  4. @Action  
  5.     (   
  6.       value="/admin/adminlogin",  
  7.       results={  
  8.         @Result(name="success", location="/admin/admin-login-ok.jsp", type="redirect"),  
  9.         @Result(name="login-failed", location="/admin/login", type="redirect")  
  10.       }    
  11.     )  
  12.     public String login() throws IOException{  
  13.         if(validatecaptchaCode()){  
  14.   
  15.             AdminUser adminUser = adminUserManager.findByUserName(entity.getUserName());  
  16.             String md5String = DigestUtils.md5Hex(entity.getPassword());  
  17.             if(adminUser==null ||(!md5String.equals( adminUser.getPassword() )) ){  
  18.                 log.error("用户名或密码有误,请重请登录");  
  19.                 addActionMessage("用户名或密码有误,请重请登录");  
  20.                 return "login-failed";  
  21.             }  
  22.   
  23.             log.info("login ok!add to session-------------");             
  24.             SessionFactory.addAdminUserSession(session,adminUser);  
  25.   
  26.             String lastVisitUrl = SessionFactory.getLastAdminVistedUrl(session);  
  27.             if(lastVisitUrl!=null && lastVisitUrl.length()>2){  
  28.                 log.info("last visited :"+lastVisitUrl);  
  29.                 ServletActionContext.getResponse().sendRedirect(lastVisitUrl);  
  30.                 return null;  
  31.             }  
  32.             return this.SUCCESS;  
  33.         }else{  
  34.             log.error("验证码有误,请重请登录");  
  35.             addActionMessage("验证码有误,请重请登录");  
  36.             return "login-failed";  
  37.         }  
  38.     } 


这里我们只关注ActionMessage,看到没有无论是成功还是失败都是redirect方式的跳转,我们这里所说的redirect传递丢失ActionMessage问题指的是@Result(name="login-failed", location="/admin/login", type="redirect")这种

方式,这种方式不会直接转换到一个xx.jsp上,而是中间经过了一个其他的Action,大家都知道redirect方式传递关于保存在request请求域中的数值都会丢失,多以我们要做的就是使这个值保存到SESSION中去

具体解决方案

上边的Action类是在noneedlogin包类,我们要做的就是在struts.xml中noneedlogin包的默认拦截器中加入store拦截器


  1. <package name="noneedlogin" extends="convention-default"  >  
  2.     <interceptors>  
  3.         <interceptor-stack name="storeStack">  
  4.             <interceptor-ref name="store">  
  5.                 <param name="operationMode">AUTOMATIC</param>  
  6.             </interceptor-ref>  
  7.             <interceptor-ref name="paramsPrepareParamsStack" />  
  8.         </interceptor-stack>  
  9.     </interceptors>         
  10.     <default-interceptor-ref name="storeStack" />  
  11. </package> 

当然这不是唯一的写法,以一种写法还可以是下面这样的


  1. <constant name="struts.convention.default.parent.package" value="crud-default" />  
  2.     <constant name="struts.convention.package.locators" value="web" />  
  3.     <constant name="struts.convention.package.locators.basePackage" value="com.javacrazyer.demo" />  
  4.   
  5.     <!-- 用于CRUD Action的parent package -->  
  6.     <package name="crud-default" extends="convention-default, json-default">  
  7.         <!-- 基于paramsPrepareParamsStack,  
  8.             增加store interceptor保证actionMessage在redirect后不会丢失 -->  
  9.         <interceptors>  
  10.             <interceptor-stack name="crudStack">  
  11.                 <interceptor-ref name="store">  
  12.                     <param name="operationMode">AUTOMATIC</param>  
  13.                 </interceptor-ref>  
  14.                 <interceptor-ref name="paramsPrepareParamsStack" />  
  15.             </interceptor-stack>  
  16.         </interceptors>  
  17.   
  18.         <default-interceptor-ref name="crudStack" />  
  19.     </package> 

好了上面说到本文章解决方案是针对@Result(name="login-failed", location="/admin/login", type="redirect")而

不是针对@Result(name="success", location="/admin/admin-login-ok.jsp", type="redirect"),这是因为在

直接以redirect方式跳转到JSP页面的这种,本方案是解决不了问题的,所以如果是直接跳转到JSP页面type类型就要改成是dispatcher,即如下方式

  1. @Action(value="/admin/login",results={@Result(name="login", location="/admin/login.jsp", type="dispatcher")}  )  
  2.     public String execute(){          
  3.         return "login";  
  4.     } 





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值