Java Web

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 。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容