javamtia
javamtia copied to clipboard
P247 实践:正确编写Servlet类
清单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)调用解析出来的日期可能是一个客户端根本没有提交过的错误日期呢?
SimpleDateFormat不是线程安全的,在多个线程之间共享同一个SimpleDateFormat(而有没有使用其他的同步措施),会出问题(就你提到的问题)。