很常见的一个应用就是访问某个页面,因为权限不够,进入登陆页面。人性化的设计是能够在登陆之后,系统跳转到用户原本需要访问的页面。这可以借助拦截器来实现。
在我们验证用户登陆的拦截器里面获取请求地址,并存入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 ...