【发布时间】:2019-10-28 13:57:06
【问题描述】:
我有一个通过 JWT 令牌授权 REST 调用的身份验证过滤器。我已经通过 JWT 实现了身份验证,并通过过滤器实现了 JWT 验证。如何在过滤过程中将来自 JWT 的用户 id 传递给 servlet?
【问题讨论】:
标签: java servlets servlet-filters
我有一个通过 JWT 令牌授权 REST 调用的身份验证过滤器。我已经通过 JWT 实现了身份验证,并通过过滤器实现了 JWT 验证。如何在过滤过程中将来自 JWT 的用户 id 传递给 servlet?
【问题讨论】:
标签: java servlets servlet-filters
通常这是通过HttpServletRequestWrapper 完成的。它是一个允许您在标准 HttpServletRequest 上添加或覆盖方法的对象。
在您的过滤器中,用您自己的RequestWrapper 包装原始HttpServletRequest,然后将您的RequestWrapper 发送到servlet而不是原始HttpServletRequest。
例如,这里有一个简单的RequestWrapper 来传递经过身份验证的 userId:
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;
}
}
在转发到您的 servlet 链之前,将原始请求包装在您的身份验证过滤器中:
// in filter class
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws ServletException {
int userId;
// 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);
}
然后,Servlet 可以使用新包装的请求方法来访问身份验证数据:
// 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();
【讨论】: