在Struts2中实现登陆后跳转到登录前页面


很常见的一个应用就是访问某个页面,因为权限不够,进入登陆页面。人性化的设计是能够在登陆之后,系统跳转到用户原本需要访问的页面。这可以借助拦截器来实现。

在我们验证用户登陆的拦截器里面获取请求地址,并存入session。

package  com.tuanplus.interceptor;
 
import  java.util.Map;
import  javax.servlet.http.HttpServletRequest;
import  org.apache.struts2.ServletActionContext;
import  com.opensymphony.xwork2.ActionContext;
import  com.opensymphony.xwork2.ActionInvocation;
import  com.opensymphony.xwork2.interceptor.Interceptor;
 
/**
  * 验证用户登陆
  *
  * @author MZULE
  *
  */
public  class  UserLoginInterceptor implements  Interceptor {
 
     private  static  final  long  serialVersionUID = 1593745236481514166L;
 
     public  void  destroy() {
     }
 
     public  void  init() {
     }
 
     public  String intercept(ActionInvocation invocation) throws  Exception {
         ActionContext context = invocation.getInvocationContext();
         // 获取session
         Map<String, Object> session = context.getSession();
         Object user = session.get( "user" );
         // 用户还未登陆
         if  (user == null ) {
             // 获取HttpServletRequest对象
             HttpServletRequest req = ServletActionContext.getRequest();
             // 获取此请求的地址,请求地址包含application name,进行subString操作,去除application name
             String path = req.getRequestURI().substring( 10 );
             // 获得请求中的参数
             String queryString = req.getQueryString();
             // 预防空指针
             if  (queryString == null ) {
                 queryString = "" ;
             }
             // 拼凑得到登陆之前的地址
             String realPath = path + "?"  + queryString;
             // 存入session,方便调用
             session.put( "prePage" , realPath);
             return  "login" ;
         }
         // 用户已经登陆,放行
         return  invocation.invoke();
     }
 
}

在用户登陆的action中加入字符串类型的prePage属性,用来存储拦截器放入session的prePage值(即登陆前的请求地址)。

package  com.tuanplus.action;
 
import  com.tuanplus.po.User;
import  com.tuanplus.service.IUserService;
import  com.tuanplus.util.AuthCodeUtil;
 
/**
  * 登陆Action
  *
  * @author MZULE
  *
  */
public  class  LoginAction extends  BaseAction {
 
     private  static  final  long  serialVersionUID = -6179170126070438432L;
     private  IUserService userService;
     private  User user;
     //验证码
     private  String auth;
     //登录前页面
     private  String prePage;
 
     public  String execute() {
         // 获取登陆的User对象
         User seuser = userService.get(user.getEmail());
         // 加入session
         session.put( "user" , seuser);
         //获取跳转到登陆界面之前的页面地址,由拦截器提供
         prePage = (String) session.get( "prePage" );
         //清除session中的数据
         session.remove( "prePage" );
         if  (prePage == null ) {
             //不是拦截器跳转到登陆页面的,直接访问的登陆页面
             return  "myorder" ;
         } else  {
             return  SUCCESS;
         }
     }
     ...
}

在struts.xml中配置使用action的属性prePage决定物理视图资源。

...
<!-- 登陆 -->
<action name= "login"  class = "loginAction" >
     <result type= "redirectAction" >${prePage}</result>
     <result name= "myorder"  type= "redirectAction" >myOrder</result>
     <result name= "input" >/login.jsp</result>
</action>
...

嗯,一个小技巧,希望对大家有用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值