您好,登錄后才能下訂單哦!
小編給大家分享一下Servlet和JSP潛在的隱患有哪些,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
1.Servlet的生命周期
Servlet的生命周期是由Web容器負責的,當客戶端***次請求Servlet時,容器負責初始化Servlet,也就是實例化這個Servlet類。以后這個實例就負責客戶端的請求,一般不會再實例化其他Servlet類,也就是有多個線程在使用這個實例。Servlet之所以比CGI效率高就是因為Servlet是多線程的。如果該Servlet被聲明為單線程模型的話,容器就會維護一個實例池,那么將存在多個實例。
2.Servlet和JSP的線程安全
Servlet規范已經聲明Servlet不是線程安全的,所以在開發Servlet的時候要注要這個問題。這里以一個現實的模型來說明問題,先定義一個Servlet類,再定義一個SmulateMultiThread類和WebContainer類。
importjavax.servlet.http.HttpServlet;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importjava.io.IOException;
//該類模擬多線程Servlet的情況
publicclassSmulateMultiThreadimplementsRunnable{
publicSmulateMultiThread(){
}
publicstaticvoidmain(String[]args){
//處理100個請求
for(inti=0;i<100;i++)
{
newThread(newSmulateMultiThread())。start();
}
}
publicvoidrun(){
HttpServletRequestrequest=null;
HttpServletResponseresponse=null;
try{
WebContainer.getServlet()。doGet(request,response);
}catch(IOExceptionex){
}
catch(ServletExceptionex){
}
}
}
//這是一個Servlet類
classUnsafeServletextendsHttpServlet{
privateStringunsafe;
publicvoidinit()throwsServletException{
}
//ProcesstheHTTPGetrequest
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{unsafe=Thread.currentThread()。getName();
System.out.println(unsafe);
}
}
//這個是容器類
classWebContainer{
privatestaticUnsafeServletus=newUnsafeServlet();
publicstaticUnsafeServletgetServlet(){
returnus;
}
}
輸出了100不同的線程名稱,如果有100個請求同時被這個Servlet處理的話,那么unsafe就可能有100種去值,***客戶端將得到錯誤的值。比如客戶1請求的線程名為thread-1,但是返回給他的可能是thread-20.表現在現實中就是,我登陸的用戶名是user1,登陸后變成了user2.那么怎樣才能是Servlet安全呢,凡是多個線程可以共享的就不要使用(實例變量+類變量),就這么簡單。也可以使用synchronized同步方法,但是這樣效率不高,還可以使用單線程模型,這樣的話效率就更低了,100個請求同時來的時候就要實例化100個實例。
方法中的臨時變量是不會影響線程安全的,因為他們是在棧上分配空間,而且每個線程都有自己私有的棧空間。
3.JSP中線程安全
JSP的本質是Servlet,所有只要明白了Servlet的安全問題,Servlet和JSP的安全問題應該很容易理解。使用<%!%>聲明的變量是Servlet的實例變量,不是線程安全的,其他都是線程安全的。
<%!StringunsafeVar;%>//不是線程安全的 <%StringsafeVar;%>//線程安全的
以上是“Servlet和JSP潛在的隱患有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。