请求中出现 NoSuchElementException

NoSuchElementException in request

第一次调用getHeaders()后,指针停留在Enumeration en的末尾。第二次调用 getHeaders() 时,检查 while(en.hasMoreElements()) 时,没有元素,因此返回空向量。

public Enumeration<String> getHeaders(String Pname) {

        Vector<String> s = new Vector<String>();
        Enumeration<String> en = getHttpServletRequest().getHeaders(Pname);
        while (en.hasMoreElements()) {
            String data= (String) en.nextElement();
            String erase= remove(data);
           s.add(erase);
        }   

        return s.elements();    
}

异常:

   java.util.NoSuchElementException: Vector Enumeration at
   java.util.Vector.nextElement(Vector.java:305)

如果您的 getHeaders() 调用 returns 没有命中,则 nextElement() 将抛出 NoSuchElementException,因为它是一个包含 0 个元素的结果,而您已经到了最后。

这可能意味着没有"referer" header集。

如果请求没有 referer,您的代码 request.getHeaders("referer").nextElement() 将失败。 referer header 不是必需的,实际上是 not supposed to be used in some circumstances.

您可以改用此代码:

<% Enumeration<String> en = getHttpServletRequest().getHeaders("referer");
   if (en.hasMoreElements()) {
%>
<%= en.nextElement(); %>
<% } %>

另一种解决方案是将您的 getHeaders() 方法更改为始终 return 枚举中的至少一个元素:

public Enumeration<String> getHeaders(String name) {

    Vector<String> v = new Vector<String>();
    Enumeration<String> en = getHttpServletRequest().getHeaders(name);
    if (!en.hasMoreElements()) {
        v.add("");
    } else while (en.hasMoreElements()) {
        String value = (String) en.nextElement();
        String clean = removeXSS(value);
        v.add(clean);
    }   

    return v.elements();    
}

在调用 nextElement() 之前,您应该进行检查:

<%if (request.getHeaders("referer").hasMoreElements()) { %>
<%=request.getHeaders("referer").nextElement()%>
<%}%>