java-web基礎(chǔ)面試題

Javaweb基礎(chǔ)

常見(jiàn)Http狀態(tài)碼

200 成功返回狀態(tài)

301 永久重定向,被請(qǐng)求的資源永久移動(dòng)到新位置

302 臨時(shí)重定向,被請(qǐng)求的資源臨時(shí)移動(dòng)到新的位置,項(xiàng)目中使用了oauth2,對(duì)目標(biāo)資源訪問(wèn)無(wú)權(quán)限時(shí)就會(huì)見(jiàn)到,它是會(huì)重定向到授權(quán)地址

401 無(wú)權(quán)限訪問(wèn)

403 禁止訪問(wèn),服務(wù)器已經(jīng)接收到請(qǐng)求,但拒絕執(zhí)行

404 找不到該資源

500 服務(wù)器內(nèi)部錯(cuò)誤 zuul找不到服務(wù)名就會(huì)見(jiàn)到

503 服務(wù)器內(nèi)部錯(cuò)誤 服務(wù)器維護(hù)或者過(guò)載

504 網(wǎng)關(guān)超時(shí)

Servlet的生命周期

Servlet 生命周期可被定義為從創(chuàng)建直到毀滅的整個(gè)過(guò)程。以下是 Servlet 遵循的過(guò)程:

  • Servlet 初始化后調(diào)用 init () 方法。
  • Servlet 調(diào)用 service() 方法來(lái)處理客戶端的請(qǐng)求。
  • Servlet 銷毀前調(diào)用 destroy() 方法。
  • 最后,Servlet 是由 JVM 的垃圾回收器進(jìn)行垃圾回收的。

什么是過(guò)濾器?怎么創(chuàng)建一個(gè)過(guò)濾器

過(guò)濾器:在請(qǐng)求發(fā)送之后,處理之前對(duì)請(qǐng)求的一次攔截,可以更改請(qǐng)求狀態(tài)或者參數(shù)值等。

創(chuàng)建過(guò)濾器:實(shí)現(xiàn)filter接口,重寫doFilter方法,最后在web.xml中配置過(guò)濾器

講一下Session的工作原理

服務(wù)端的session id會(huì)自動(dòng)寫入客戶端的cookie中,每次請(qǐng)求客戶端回自動(dòng)把cookie帶入后臺(tái),后臺(tái)自動(dòng)根據(jù)cookie中的sessionid就能找到session

Session和cookie有什么區(qū)別

session和cookie都是為了彌補(bǔ)http協(xié)議的無(wú)狀態(tài)特性,解決會(huì)話問(wèn)題

session是以ConcurrentHashMap結(jié)構(gòu)存儲(chǔ)在服務(wù)器端,同時(shí)生成一個(gè)sessionid返回客戶端并存放到cookie中

cookie是將數(shù)據(jù)存儲(chǔ)在客戶瀏覽器端

session占用服務(wù)器的性能,但安全性較高,使用cookie減輕服務(wù)器的壓力,但有被用戶篡改風(fēng)險(xiǎn)因此安全性較低

說(shuō)說(shuō)preparedStatement和Statement的區(qū)別

statement的sql語(yǔ)句使用字符串拼接,很容易出錯(cuò),而preparedStatement使用?作為占位符,不容易出錯(cuò)易于維護(hù)

statement不對(duì)sql語(yǔ)句作處理,直接交給數(shù)據(jù)庫(kù),而preparedStatement支持預(yù)編譯,事先將編譯好的sql語(yǔ)句放到數(shù)據(jù)庫(kù)端,相當(dāng)于緩存,因此效率更高

statement有sql注入風(fēng)險(xiǎn),preparedStatement沒(méi)有sql注入風(fēng)險(xiǎn)

請(qǐng)求轉(zhuǎn)發(fā)和重定向的區(qū)別

轉(zhuǎn)發(fā)是一次請(qǐng)求,可以共享同一組request和response,重定向是多次請(qǐng)求,不能共享同一組request和response

轉(zhuǎn)發(fā)地址欄不會(huì)發(fā)生變化,重定向地址欄會(huì)發(fā)生變化

轉(zhuǎn)發(fā)不能到外部應(yīng)用,重定向可以到尾部應(yīng)用

如果我們需要數(shù)據(jù)共享,使用轉(zhuǎn)發(fā),如果需要訪問(wèn)內(nèi)部資源(WEB-INF),使用轉(zhuǎn)發(fā),如果需要跨域到外部資源,必須使用重定向

get和post請(qǐng)求的區(qū)別

最直觀的區(qū)別,get把參數(shù)包含在url中,post是把參數(shù)放到request body中

post相對(duì)于get更安全,post發(fā)送的數(shù)據(jù)更大,get有url的長(zhǎng)度限制

post更發(fā)送更多的數(shù)據(jù)類型,get只能發(fā)送ASCII字符

在restful中,get一般用戶查詢搜索數(shù)據(jù),post一般用戶添加或者修改數(shù)據(jù)

JSP的原理

jsp的本質(zhì)就是servlet,每個(gè)JSP文件都回被編譯成一個(gè)Serverlet去執(zhí)行,在該Serverlet會(huì)對(duì)JSP中的動(dòng)態(tài)內(nèi)容進(jìn)行替換,靜態(tài)部分是標(biāo)準(zhǔn)的html,動(dòng)態(tài)部分是java程序

SpringMVC部分

SpringMVC怎么樣設(shè)定重定向和轉(zhuǎn)發(fā)的

重定向是指將用戶從當(dāng)前請(qǐng)求重新定向到一個(gè)視圖頁(yè)面,或者是一個(gè)handler處理請(qǐng)求,以前的request域中信息全部失效,同時(shí)地址欄會(huì)發(fā)生變化,它是客戶端行為

轉(zhuǎn)發(fā)是指將用戶從當(dāng)前請(qǐng)求轉(zhuǎn)發(fā)給另一個(gè)視圖頁(yè)面或者h(yuǎn)andler處理請(qǐng)求,以前的request域可以共享,地址欄不會(huì)發(fā)生變化,它是服務(wù)器行為

springmvc默認(rèn)是使用轉(zhuǎn)發(fā)方式跳轉(zhuǎn)的,且會(huì)默認(rèn)經(jīng)過(guò)視圖解析器,我們也可以通過(guò)指定,轉(zhuǎn)發(fā)時(shí)在返回值前面加"forward:",重定向時(shí)在返回值前面加"redirect:",且此時(shí)就不會(huì)再經(jīng)過(guò)視圖解析器了

SpringMVC如何對(duì)時(shí)間格式的參數(shù)進(jìn)行格式化

第一種需求,后臺(tái)接收前臺(tái)頁(yè)面返回的string類型時(shí)間,要轉(zhuǎn)換成的Date類型數(shù)據(jù),可以使用@DateTimeFormat注解來(lái)接收參數(shù)

第二種需求,后臺(tái)將Date類型數(shù)據(jù)返回給前臺(tái)頁(yè)面,默認(rèn)是返回時(shí)間戳,如果想要優(yōu)雅的格式,可以在模型的Date字段或get方法上使用@JsonFormat注解

SpringMVC常用的注解有哪些

@Controller:用來(lái)標(biāo)識(shí)一個(gè)類是控制器類

@RequestMapping:用來(lái)映射請(qǐng)求路徑和參數(shù)

@ResponseBody:將返回值放到responsebody中,通常返回json或者xml格式數(shù)據(jù)

@RequestBody:將前臺(tái)請(qǐng)求參數(shù)轉(zhuǎn)換成對(duì)象

@PathVariable:接收路徑參數(shù),通常用在restful接口中

@RestController:@Controller和@ResponseBody的組合注解

@ControllerAdvice:運(yùn)用aop的思想,對(duì)全局做一些處理,比如結(jié)合@ExceptionHandler做全局異常捕獲

如何定義SpringMVC的攔截器

SpringMVC 的攔截器主要用于攔截用戶的請(qǐng)求并做相應(yīng)的處理,通常應(yīng)用在權(quán)限驗(yàn)證、判斷登錄等功能上

第1步,定義攔截器:可以實(shí)現(xiàn) HandlerInterceptor 接口來(lái)自定義攔截器,接口定義了三個(gè)方法,preHandler方法是在請(qǐng)求到達(dá)處理器之前執(zhí)行,postHandler方法是在請(qǐng)求經(jīng)過(guò)處理器之后、解析試圖之前執(zhí)行,afterCompletion方法是在視圖渲染之后、返回客戶端之前執(zhí)行

第2步,配置攔截器:在springmvc的配置文件xml中,配置所有攔截路徑,以及需要放行的路徑

HandlerInterceptor和HandlerInterceptorAdapter的區(qū)別

HandlerInterceptor是接口,我們可以實(shí)現(xiàn)該接口來(lái)定義攔截器,HandlerInterceptorAdapter是抽象類,它實(shí)現(xiàn)了HandlerInterceptor接口的子接口AsyncHandlerInterceptor,我們可以繼承該類來(lái)定義攔截器,它簡(jiǎn)化攔截器的實(shí)現(xiàn),默認(rèn)preHandler返回true

SpringMVC的執(zhí)行原理

1.Http請(qǐng)求:客戶端請(qǐng)求提交到DispatcherServlet-前端控制器

2.尋找處理器:由DispatcherServlet調(diào)用HandlerMapping-處理器映射器,根據(jù)url找到對(duì)應(yīng)的的Handler

3.調(diào)用處理器:DispatcherServlet指定HandlerAdapter-處理器適配器去調(diào)用Handler

4.調(diào)用業(yè)務(wù)處理和返回結(jié)果:Handler調(diào)用業(yè)務(wù)邏輯處理完成后,返回ModelAndView

5.處理視圖映射并返回模型: DispatcherServlet查詢一個(gè)或多個(gè)ViewResoler-視圖解析器,找到ModelAndView指定的視圖

6.Http響應(yīng):將結(jié)果顯示到客戶端

SpringMVC的Controller是單例還是多例,有沒(méi)有并發(fā)安全問(wèn)題,如何解決

在spring中,bean默認(rèn)都是單例的,controller也是交給spring容器管理的一個(gè)bean,因此它也是單例的。

單例的好處是減少了創(chuàng)建對(duì)象和垃圾回收的時(shí)間,節(jié)省了內(nèi)存資源,但同時(shí)單例會(huì)造成線程不安全的問(wèn)題,因?yàn)楫?dāng)所有請(qǐng)求訪問(wèn)同一個(gè)controller實(shí)例,controller中的成員變量是所有線程公用的,某個(gè)線程如果修改了這個(gè)變量,別的請(qǐng)求再來(lái)拿這個(gè)變量就編程修改后的值了

要解決這個(gè)問(wèn)題,最直接有效的方式就是不要在controller中定義成員變量,如果你非要定義成員變量,兩種方式

第一種,可以給controller上加注解@Scope("prototype"),將controller設(shè)置為多例模式,每次請(qǐng)求都重新實(shí)例化一個(gè)controller

第二種,使用ThreadLocal變量,讓每一個(gè)線程都有自己獨(dú)立的變量

RequestMapping 和 GetMapping有什么區(qū)別

@Getmapping是一個(gè)組合注解,即是@RequestMapping(method = RequestMethod.GET)的縮寫,意思是只接收get請(qǐng)求的方法

@Requestmapping如果沒(méi)有指定請(qǐng)求方式,可以接收get,put等各種類型的請(qǐng)求

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

相關(guān)閱讀更多精彩內(nèi)容

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