標籤:des style blog http color io 使用 java 資料
很常見的一個應用就是訪問某個頁面,因為許可權不夠,進入登陸頁面。人性化的設計是能夠在登陸之後,系統跳轉到使用者原本需要訪問的頁面。這可以藉助攔截器來實現。
在我們驗證使用者登陸的攔截器裡面擷取請求地址,並存入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 MZULE14 * 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 // 擷取session29 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 name36 String path = req.getRequestURI().substring(10);37 // 獲得請求中的參數38 String queryString = req.getQueryString();39 // 預防null 指標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 MZULE11 * 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 // 加入session27 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 ...
在Struts2中實現登陸後跳轉到登入前頁面