0

我需要将带有登录信息的自定义 HTTP 标头发送到我的播放应用程序(播放 1.2.5)。该自定义标头由过滤器添加。

问题是当我尝试阅读时,play 总是抛出 NullPointerException:

String loggedUser = request.headers.get("loggeduser").value();

我还有一个用于测试的 servlet,其中以下从标头正确打印 vale。

out.println(request.getHeader("loggeduser"));

我在游戏中错过了什么吗?

谢谢

编辑:这是我的过滤器

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    CustomHeaderWrapper wrapper = new CustomHeaderWrapper((HttpServletRequest) request);
    String username = ((HttpServletRequest) request).getRemoteUser();
    wrapper.addHeader("loggeduser", username);
    chain.doFilter(wrapper, response);
}

CustomHeaderWrapper

private Map<String, String> customHeaderMap = null;

public CustomHeaderWrapper(HttpServletRequest request) {
    super(request);
    customHeaderMap = new HashMap<String, String>();
}

@Override
public String getHeader(String name) {
    String header = super.getHeader(name);
    return (header != null) ? header : this.getParameter(name);
}

@Override
public Enumeration getHeaderNames() {
    List<String> names = Collections.list(super.getHeaderNames());
    names.addAll(Collections.list(super.getParameterNames()));
    return Collections.enumeration(names);
}

@Override
public String getParameter(String name) {
    String paramValue = super.getParameter(name); // query Strings
    if (paramValue == null) {
        paramValue = customHeaderMap.get(name);
    }
    return paramValue;
}

public void addHeader(String headerName, String headerValue) {
    customHeaderMap.put(headerName, headerValue);
}
4

1 回答 1

1

我创建了一个小测试项目,并使用了您问题中的代码行。它完美地工作。我使用 Chrome 的Dev HTTP Client插件来设置标头。

request.headers请记住,在将所有标头添加到hashmap之前,它们都将转换为小写。所以如果你放在"loggedUser"里面request.headers.get(),它永远不会起作用。

于 2013-01-16T20:26:54.687 回答