Обычно это делается с помощью HttpServletRequestWrapper . Это объект, который позволяет добавлять или переопределять методы в стандартном HttpServletRequest
.
Внутри вашего фильтра оберните оригинал HttpServletRequest
своим RequestWrapper
, а затем отправьте RequestWrapper
сервлету вместо оригинала HttpServletRequest
.
Например, вот простой RequestWrapper
для передачи аутентифицированного идентификатора пользователя:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class AuthenticatedRequest extends HttpServletRequestWrapper {
private int userId;
public AuthenticatedRequest(HttpServletRequest req, int userId) {
super(req);
this.userId = userId;
}
public int getUserId() {
return userId;
}
}
Оберните исходный запрос в свой фильтр аутентификации перед отправкой в цепочку сервлетов:
// in filter class
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws ServletException {
int userId = null;
// do something to get your authentication data (userId)
// ...
// wrap the original request with the "AuthenticatedRequest"
AuthenticatedRequest authRequest = new AuthenticatedRequest(req, userId);
// forward the AuthenticatedRequest to the servlet
chain.doFilter(authRequest, res);
}
Сервлет может затем использовать ваши новые методы упакованного запроса для доступа к данным аутентификации:
// in servlet class
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException
{
// this request object is actually your own AuthenticatedRequest wrapper
int userId = req.getUserId();
Это и это охватывают еще некоторые детали реализации.