通过过滤器将经过身份验证的用户ID添加到Java Servlet

时间:2019-06-13 23:04:48

标签: java servlets servlet-filters

我有一个身份验证过滤器,可以通过JWT令牌授权REST调用。我已经通过JWT实现了身份验证,并通过Filter实现了JWT验证。如何在过滤过程中将来自JWT的用户ID传递给servlet?

1 个答案:

答案 0 :(得分:2)

通常,这是通过HttpServletRequestWrapper完成的。该对象使您可以在标准HttpServletRequest上添加或覆盖方法。

在过滤器中,将原始HttpServletRequest用自己的RequestWrapper包装,然后将您的RequestWrapper发送到原始{{1}的servlet 中}。

例如,下面是一个简单的HttpServletRequest来传递经过身份验证的用户ID:

RequestWrapper

将原始请求包装在身份验证过滤器中,然后转发到servlet链:

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可以使用新包装的请求方法访问auth数据:

// 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);

}

Thisthis涵盖了更多实施细节。