日期:2014-05-17  浏览次数:20745 次

关于重定向到注册或登录前的页面
新人目前在参考传智播客itcastbbs项目的代码,用的是struts1,其中actionbase里重写了actionforward 的 executre方法



public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
throws Exception {
try {
return super.execute(mapping, form, request, response);
}
// 如果没有权限执行某个方法
// FIXME 这里不起作用了,因为PrivilegeInterceptorDelegatingRequestProcessor是在Action外层,无权限异常在外层抛出
catch (PermissionDeniedException e) {
// 1. 如果未登陆, 转到登陆界面
if (!MemberAuthenticationUtils.isLoggedOn(request)) {
// 可以在登陆后再转到登陆前的页面, 这个页面地址可以放到 request 作用域中;
String unencodedReturnPath = (String) request.getAttribute(WebConstants.REQUEST_UNENCODED_RETURN_PATH);
// 转到登录页面
ReturnPathUtils.toLoginWithReturnPathDefaultIsCurrentRequestURI(request, response, unencodedReturnPath);
return null;
}

// 2. 如果已登陆, 抛出权限不足异常
throw e;
}
}





疑惑的有两点:1、WebConstants.REQUEST_UNENCODED_RETURN_PATH, 以下是这个类,它起什么作用呢,什么叫 登录成功后返回的路径(未编码的) 登录成功后返回的路径(编码的)?上面的代码为什么要取得这个String,还有这个String为什么会在request对象中?实在觉得不可思议


package cn.itcast.bbs.web;

/**
 * Web作用域变量存储时用到的常量。格式为:{标识}_{其他名称部分}<br>
 * 标识可以为以下值:<br>
 * PAGE、REQUEST、SESSION、APPLICATION 代表是相应的作用域的变量的KEY<br>
 * PARAMETER 代表是请求参数名称<br>
 * COOKIE 代表是Cookie的名称<br>
 * 
 * @author tyg
 */
public class WebConstants {

/** 主题类型列表 */
public static final String APPLICATION_TOPIC_TYPE_LIST = "APPLICATION_TOPIC_TYPE_LIST";

/** 当前登录用户 */
public static final String SESSION_LOGGED_ON_USER = "SESSION_LOGGED_ON_USER";

/** 登录成功后返回的路径 */
public static final String PARAMETER_RETURN_PATH = "PARAMETER_RETURN_PATH";

/** 自动登录的Cookie的名称 */
public static final String COOKIE_NAME_AUTO_LOGIN = "COOKIE_AUTO_LOGIN_ITCASTBBS";

// FIXME 以下要统一。
/** 登录成功后返回的路径(未编码的) */
public static final String REQUEST_UNENCODED_RETURN_PATH = "REQUEST_UNENCODED_RETURN_PATH";

/** 登录成功后返回的路径(已编码的) */
public static final String REQUEST_ENCODED_RETURN_PATH = "REQUEST_ENCODED_RETURN_PATH";

public static final String REQUEST_HAS_EXCEPTIONACTION = "REQUEST_HAS_EXCEPTIONACTION";

}




2、ReturnPathUtils调用的方法,以下是这个类的代码


public class ReturnPathUtils {

/**
 * 重定向到上一次访问的(注册或登录之前的)页面
 * 
 * @param request
 * @param response
 * @return 是否已重定向到之前页面(如果没有地址,就返回false)
 */
public static boolean rediectPreviousPage(HttpServletRequest request, HttpServletResponse response) throws IOException {
return rediectPreviousPage(request, response, null);
}

public static boolean rediectPreviousPa