1. jsp 和 servlet 有什么區(qū)別?
jsp經(jīng)編譯后就變成了Servlet.(JSP的本質(zhì)就是Servlet,JVM只能識別java的類,不能識別JSP的代碼,Web容器將JSP的代碼編譯成JVM能夠識別的java類)
jsp更擅長表現(xiàn)于頁面顯示,servlet更擅長于邏輯控制。
Servlet中沒有內(nèi)置對象,Jsp中的內(nèi)置對象都是必須通過HttpServletRequest對象,HttpServletResponse對象以及HttpServlet對象得到。
Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內(nèi)容,Jsp中的Java腳本如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service方法用于生成對客戶端的響應。
2. jsp 有哪些內(nèi)置對象?作用分別是什么?
JSP有9個內(nèi)置對象:
request:封裝客戶端的請求,其中包含來自GET或POST請求的參數(shù);
response:封裝服務器對客戶端的響應;
pageContext:通過該對象可以獲取其他對象;
session:封裝用戶會話的對象;
application:封裝服務器運行環(huán)境的對象;
out:輸出服務器響應的輸出流對象;
config:Web應用的配置對象;
page:JSP頁面本身(相當于Java程序中的this);
exception:封裝頁面拋出異常的對象。
3. 說一下 jsp 的 4 種作用域?
JSP中的四種作用域包括page、request、session和application
page:代表與一個頁面相關(guān)的對象和屬性。離開當前JSP頁面(無論是redirect還是forward),則pageContext中的所有屬性值就會丟失。
request:請求作用域是同一個請求之內(nèi),在頁面跳轉(zhuǎn)時,如果通過forward方式跳轉(zhuǎn),則forward目標頁面仍然可以拿到request中的屬性值。如果通過redirect方式進行頁面跳轉(zhuǎn),由于redirect相當于重新發(fā)出的請求,此種場景下,request中的屬性值會丟失。
session:會話作用域是在一個會話的生命周期內(nèi),會話失效,則session中的數(shù)據(jù)也隨之丟失。
application:應用作用域是最大的,只要服務器不停止,則application對象就一直存在,并且為所有會話所共享。
4. session 和 cookie 有什么區(qū)別?
cookie保存在客戶端,session保存在服務器端,
cookie目的可以跟蹤會話,也可以保存用戶喜好或者保存用戶名密碼
session用來跟蹤會話
5. 說一下 session 的工作原理?
其實session是一個存在服務器上的類似于一個散列表格的文件。里面存有我們需要的信息,在我們需要用的時候可以從里面取出來。類似于一個大號的map吧,里面的鍵存儲的是用戶的sessionid,用戶向服務器發(fā)送請求的時候會帶上這個sessionid。這時就可以從中取出對應的值了。
6. 如果客戶端禁止 cookie 能實現(xiàn) session 還能用嗎?
Cookie與 Session,一般認為是兩個獨立的東西,Session采用的是在服務器端保持狀態(tài)的方案,而Cookie采用的是在客戶端保持狀態(tài)的方案。但為什么禁用Cookie就不能得到Session呢?因為Session是用Session ID來確定當前對話所對應的服務器Session,而Session ID是通過Cookie來傳遞的,禁用Cookie相當于失去了Session ID,也就得不到Session了。
7. 如何避免 sql 注入?
PreparedStatement(簡單又有效的方法)
使用正則表達式過濾傳入的參數(shù)
字符串過濾
JSP中調(diào)用該函數(shù)檢查是否包函非法字符
JSP頁面判斷代碼
8. mybatis是如何防止sql 注入的?(自己加的)
<select id="getBlogById" resultType="Blog" parameterType=”int”>
select id,title,author,content
from blog where id=#{id}
</select>
如果我們想防止sql注入,理所當然地要在輸入?yún)?shù)上下功夫。上面代碼中高亮部分即輸入?yún)?shù)在sql中拼接的部分,傳入?yún)?shù)后,打印出執(zhí)行的sql語句,會看到sql是這樣的:
select id,title,author,content from blog where id = ?
不管輸入什么參數(shù),打印出的sql都是這樣的。這是因為mybatis啟用了預編譯功能,在sql執(zhí)行前,會先將上面的sql發(fā)送給數(shù)據(jù)庫進行編譯,執(zhí)行時,直接使用編譯好的sql,替換占位符“?”就可以了。因為sql注入只能對編譯過程起作用,所以這樣的方式就很好地避免了sql注入的問題。
9. forward 和 redirect 的區(qū)別?
forward是轉(zhuǎn)發(fā),redirect是重定向。兩者的區(qū)別如下:
從數(shù)據(jù)共享來說:
? ? ? ? ? ? forward是一個請求的延續(xù),可以共享request的數(shù)據(jù);
? ? ? ? ? ? ? ? redirect開啟一個新的請求,不可以共享request的數(shù)據(jù)。
? ? ? ? 從效率來說:
? ? ? ? ? ? Forward效率較高;
? ? ? ? ? ? Redirect效率較低。
? ? ? ? 從運用地方來說:
? ? ? ? ? ? forward:一般用于用戶登陸的時候,根據(jù)角色轉(zhuǎn)發(fā)到相應的模塊;
? ? ? ? ? ? redirect:一般用于用戶注銷登陸時,返回主頁面和跳轉(zhuǎn)到其他的網(wǎng)站等。
? ? ? ? 從地址欄來說:
? ? ? ? ? ? Forward:是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內(nèi)容讀取過來,然后把這些內(nèi)容再發(fā)給瀏覽器,瀏覽器根本不知道服務器發(fā)送的內(nèi)容從哪兒來,所以他的地址欄還是原來的地址;
? ? ? ? ? ? Redirect:是服務端根據(jù)邏輯,發(fā)送一個狀態(tài)碼,告訴瀏覽器重新去請求那個地址。所以地址欄顯示的是新的URL 。