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

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

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

 1 package com.tuanplus.interceptor;
 2  
 3 import java.util.Map;
 4 import javax.servlet.http.HttpServletRequest;
 5 import org.apache.struts2.ServletActionContext;
 6 import com.opensymphony.xwork2.ActionContext;
 7 import com.opensymphony.xwork2.ActionInvocation;
 8 import com.opensymphony.xwork2.interceptor.Interceptor;
 9  
10 /**
11  * 验证用户登陆
12  * 
13  * @author MZULE
14  * 
15  */
16 public class UserLoginInterceptor implements Interceptor {
17  
18     private static final long serialVersionUID = 1593745236481514166L;
19  
20     public void destroy() {
21     }
22  
23     public void init() {
24     }
25  
26     public String intercept(ActionInvocation invocation) throws Exception {
27         ActionContext context = invocation.getInvocationContext();
28         // 获取session
29         Map<String, Object> session = context.getSession();
30         Object user = session.get("user");
31         // 用户还未登陆
32         if (user == null) {
33             // 获取HttpServletRequest对象
34             HttpServletRequest req = ServletActionContext.getRequest();
35             // 获取此请求的地址,请求地址包含application name,进行subString操作,去除application name
36             String path = req.getRequestURI().substring(10);
37             // 获得请求中的参数
38             String queryString = req.getQueryString();
39             // 预防空指针
40             if (queryString == null) {
41                 queryString = "";
42             }
43             // 拼凑得到登陆之前的地址
44             String realPath = path + "?" + queryString;
45             // 存入session,方便调用
46             session.put("prePage", realPath);
47             return "login";
48         }
49         // 用户已经登陆,放行
50         return invocation.invoke();
51     }
52  
53 }

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

 1 package com.tuanplus.action;
 2  
 3 import com.tuanplus.po.User;
 4 import com.tuanplus.service.IUserService;
 5 import com.tuanplus.util.AuthCodeUtil;
 6  
 7 /**
 8  * 登陆Action
 9  * 
10  * @author MZULE
11  * 
12  */
13 public class LoginAction extends BaseAction {
14  
15     private static final long serialVersionUID = -6179170126070438432L;
16     private IUserService userService;
17     private User user;
18     //验证码
19     private String auth;
20     //登录前页面
21     private String prePage;
22  
23     public String execute() {
24         // 获取登陆的User对象
25         User seuser = userService.get(user.getEmail());
26         // 加入session
27         session.put("user", seuser);
28         //获取跳转到登陆界面之前的页面地址,由拦截器提供
29         prePage = (String) session.get("prePage");
30         //清除session中的数据
31         session.remove("prePage");
32         if (prePage == null) {
33             //不是拦截器跳转到登陆页面的,直接访问的登陆页面
34             return "myorder";
35         } else {
36             return SUCCESS;
37         }
38     }
39     ...
40 }

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

1 ...
2 <!-- 登陆 -->
3 <action name="login" class="loginAction">
4     <result type="redirectAction">${prePage}</result>
5     <result name="myorder" type="redirectAction">myOrder</result>
6     <result name="input">/login.jsp</result>
7 </action>
8 ...

 

转载于:https://www.cnblogs.com/kxxiang/p/3984372.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值