В принятом ответе @BalusC есть один существенный недостаток. Подстрока должна начинаться с 0, а не с 1. Вместо
<base href="${fn:replace(req.requestURL, fn:substring(uri, 1, fn:length(uri)), req.contextPath)}" />
должно быть
<base href="${fn:replace(req.requestURL, fn:substring(uri, 0, fn:length(uri)), req.contextPath)}" />
С 1 вы получаете двойную косую черту: http://localhost:8080//appcontext/
С 0 вы получите, http://localhost:21080/appcontext/
В моем приложении request.getSession (false) всегда возвращал ноль, когда заканчивался двойной косой чертой !!!