你真的会写线程安全的servlet吗?
很多人认为servlet随便怎样写可以的,反正是线程安全的,没有什么关系的.那我们来看看下面的这一个例子吧.
首先要看一下小段的servlet代码,如下:
public class Test extends HttpServlet {
String name;
protected void doPost (HttpServletRequest req,
HttpServletResponse res) {
name = req.getParameter("name");
...
out.println(name + ", thanks for visiting!");
}
}
我相信不少人的代码在经意或不经意间都这样写过,然后自己一个跑一下程序,可以啦,然后就不再理会啦,上面的程序是有问题的,假如有两个用户同时用到这一段代码的程序的功能,就有可能会出现如下这种情况:
引用
Thread 1: assign "A" to name
Thread 2: assign "B" to name
Thread 1: print "B, thanks for visiting!"
Thread 2: print "B, thanks for visiting!"
怎样改写呢?其实也比较简单的,比较出名的找bug的工具Fortify推荐如下一种方式如下:
public class Test extends HttpServlet {
protected void doPost (HttpServletRequest req, HttpServletResponse res) {
RequestHandler handler = new RequestHandler();
handler.handle(req, res);
}
}
public class RequestHandler {
String name;
public void handle(HttpServletRequest req, HttpServletResponse res) {
name = req.getParameter("name");
...
out.println(name + ", thanks for visiting!");
}
}
请记得这一句话:
引用
Do not use Servlet member fields for anything but constants. (i.e. make all member fields static final).
刚才今天我的一个同事也写了类似上面的有bug的那一个servlet程序,我也改造过来了;
不过是用了另一种方式实现的,用的是ThreadLocal这一个关键类,伪代码如下:
public class Test extends HttpServlet {
private static final ThreadLocal parameterLocal = new ThreadLocal();
private static final ThreadLocal filesLocal = new ThreadLocal();
protected Map getFiles() {
Map files = (HashMap)filesLocal.get();
if(files==null){
files = new HashMap();
filesLocal.set(files);
}
return files;
}
protected Map getParameters() {
Map parameters = (HashMap)parameterLocal.get();
if(parameters==null){
parameters = new HashMap();
parameterLocal.set(parameters);
}
return parameters;
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
.....//可以通过getParameters()返回Map对象
log.info(getParameters().get("possess"));
Iterator iterator = getFiles().values().iterator(); //可以通过getFiles()返回Map对象
FileItem item = (FileItem) iterator.next();
.....
}
}
分享到:
相关推荐
Servlet详解 Servlet详解 Servlet详解
servlet apiservlet apiservlet apiservlet api
刚刚接触java时做的日志管理系统,做的很简单,适合初学着 servlet servlet servlet servlet servlet日志管理系统 servlet servlet servlet servlet servlet日志管理系统 servlet servlet servlet servlet servlet...
servlet基础与servlet容器模型
SERVLET
用注解的方式定义一个Servlet,就不用在web.xml中配置了。Servlet的访问URL是Servlet的必选属性,可以选择使用urlPatterns或者value定义。 像上面的AnnotationServlet可以描述成@WebServlet(name="Annotation...
Files contained in javax.servlet.jar: META-INF/MANIFEST.MF javax/servlet/http/LocalStrings.properties javax.servlet.http.HttpSessionBindingListener.class javax.servlet....
servlet入门很好用的servlet入门
我们老师教学演示的servlet例子 从简单到难文件夹有八个demo供初学者学习 servlet01 servlet02 servlet03 servlet04 servlet05 servlet06 servlet07 servlet08 servlet是在服务器上运行的小程序。这个词是在Java ...
servlet源码 servlet-api-src javax.servlet.Servlet源码
当客户机发送请求至服务器时,服务器可以将请求信息发送给 Servlet,并让 Servlet 建立起服务器返回给客户机的响应。 当启动 Web 服务器或客户机第一次请求服务时,可以自动装入 Servlet。装入后, Servlet 继续运行...
servlet.jar.zip用于servlet程序的开发
servlet线程安全问题servlet线程安全问题
servlet 的API与servlet SRC
我在学习servlet做的笔记 我在学习servlet做的笔记我在学习servlet做的笔记 我在学习servlet做的笔记我在学习servlet做的笔记
最新版的中文servletAPI。包括常用的servlet命令,pdf中文版的servlet。
servlet+vue后端代码,实现前端登录功能,根据用户名和密码登录,返回对应的响应给前端
javax.servlet的jar包,解决找不到javax.servlet.*等问题的!欢迎下载!!
javax.servlet JAR包,解决找不到 import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; jar包问题
servlet-src 源码 Servlet 源文件