1

在本地一切正常,但是在部署时,当我从 servletConcurrentModificationException使用时会被抛出。session.setAttribute()在使用 HTML 表单添加实体后,我使用它从数据存储区返回一个值。

我该怎么办?

这是损坏的 servlet:

public class AdminServlet extends HttpServlet {
    public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Boolean logged = false;
        HttpSession session = req.getSession(true);
        Enumeration<String> names = session.getAttributeNames();

        while(names.hasMoreElements()) {
            String name = (String) names.nextElement();

            if(name.equals("logged")) {
                logged = (Boolean) session.getAttribute("logged");
            }
        }

        if(logged) {
            String p1 = req.getParameter("name");
            String p2 = req.getParameter("value");

            if(p1 != "" && p2 != "") {
                Entity e= new Entity("MyEntity");
                e.setProperty("name", p1);
                e.setProperty("value", p2);

                DatastoreService datastore = DatastoreServiceFactory.getDatastoreService();
                Transaction txn = datastore.beginTransaction();

                Key k = datastore.put(e);

                txn.commit();

                if(txn.isActive())
                    txn.rollback();

                session.setAttribute("returnedKey", KeyFactory.keyToString(k)); // CRASHES HERE
            }
        }

        resp.sendRedirect("adminpage.jsp");
    }
}

谢谢!

4

1 回答 1

1

您在会话上也打开了一个枚举。

枚举名称 = session.getAttributeNames();

更改会话中的属性会影响名称,这就是您看到错误的原因。

尝试编写代码以使名称不被使用(无效或超出范围):

把它放在一个方法中很容易

public boolean logLogged(HttpSession session){

    Enumeration<String> names = session.getAttributeNames();

    boolean loggedTmp=false;

    while(names.hasMoreElements()){

        String name = (String) names.nextElement();

        if(name.equals("logged")){
            loggedTmp = (Boolean) session.getAttribute("logged");
        }
    }

    return loggedTmp;

}
于 2012-07-22T21:36:32.650 回答