新人目前在参考传智播客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 rediectPreviousPage(HttpServletRequest request, HttpServletResponse response, String returnPath)
throws IOException {
returnPath = ReturnPathUtils.getAndDecodeReturnPath(request, returnPath);