javamtia icon indicating copy to clipboard operation
javamtia copied to clipboard

P247 实践:正确编写Servlet类

Open JuncusEffusus opened this issue 5 years ago • 1 comments

清单6-5

/**
 * 该类是一个错误的Servlet类(非线程安全)
 *
 * @author Viscent Huang
 */
public class UnsafeServlet extends HttpServlet {
    private static final long serialVersionUID = -2772996404655982182L;
    private final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
        String strExpiryDate = req.getParameter("expirtyDate");
        try {
            sdf.parse(strExpiryDate);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 省略其他代码
    }
}

这里的sdf是final,并不会被修改。strExpiryDate是局部变量,也没有问题。 为什么说sdf.parse(strExpiryDate)调用解析出来的日期可能是一个客户端根本没有提交过的错误日期呢?

JuncusEffusus avatar Apr 14 '20 02:04 JuncusEffusus

SimpleDateFormat不是线程安全的,在多个线程之间共享同一个SimpleDateFormat(而有没有使用其他的同步措施),会出问题(就你提到的问题)。

Viscent avatar Apr 17 '20 03:04 Viscent