<del id="d4fwx"><form id="d4fwx"></form></del>
      <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

            <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
          • 如何解決SpringMVC接口漏洞百出

            這篇文章主要介紹“如何解決Spring MVC接口漏洞百出”,在日常操作中,相信很多人在如何解決Spring MVC接口漏洞百出問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”如何解決Spring MVC接口漏洞百出”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

            創(chuàng)新互聯(lián)是一家專注于網(wǎng)站制作、網(wǎng)站建設(shè)與策劃設(shè)計(jì),海城網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)10余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:海城等地區(qū)。海城做網(wǎng)站價(jià)格咨詢:18980820575

            1. 前言

            在開(kāi)始前請(qǐng)務(wù)必確認(rèn)添加了Spring Boot Test相關(guān)的組件,在最新的版本中應(yīng)該包含以下依賴:

            <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-test</artifactId>     <scope>test</scope>     <exclusions>         <exclusion>             <groupId>org.junit.vintage</groupId>             <artifactId>junit-vintage-engine</artifactId>         </exclusion>     </exclusions> </dependency>

            2. 單獨(dú)測(cè)試控制層

            如果我們只需要對(duì)控制層接口(Controller)進(jìn)行測(cè)試,且該接口不依賴@Service、@Component等注解聲明的 Spring Bean  時(shí),可以借助@WebMvcTest來(lái)啟用只針對(duì) Web 控制層的測(cè)試,例如

            @WebMvcTest class CustomSpringInjectApplicationTests {     @Autowired     MockMvc mockMvc;      @SneakyThrows     @Test     void contextLoads() {         mockMvc.perform(MockMvcRequestBuilders.get("/foo/map"))                 .andExpect(ResultMatcher.matchAll(status().isOk(),                         content().contentType(MediaType.APPLICATION_JSON),                         jsonPath("$.test", Is.is("hello"))))                 .andDo(MockMvcResultHandlers.print());     }  }

            這種方式要快的多,它只加載了應(yīng)用程序的一小部分。但是如果你涉及到服務(wù)層這種方式是不湊效的,我們就需要整體測(cè)試了方了。

            3. 整體測(cè)試

            大多數(shù) Spring Boot 下的接口測(cè)試是整體而又全面的測(cè)試,涉及到控制層、服務(wù)層、持久層等方方面面,所以需要加載比較完整的 Spring Boot  上下文。這時(shí)我們可以這樣做,聲明一個(gè)抽象的測(cè)試基類:

            package cn.felord.custom;  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.web.servlet.MockMvc;   /**  * 測(cè)試基類,  * @author felord.cn  */ @SpringBootTest @AutoConfigureMockMvc abstract class CustomSpringInjectApplicationTests {     /**      * The Mock mvc.      */     @Autowired     MockMvc mockMvc;     // 其它公共依賴和處理方法 }

            只有當(dāng)@AutoConfigureMockMvc存在時(shí)MockMvc才會(huì)被注入 Spring IoC。

            然后針對(duì)具體的控制層進(jìn)行如下測(cè)試代碼的編寫(xiě):

            package cn.felord.custom;  import lombok.SneakyThrows; import org.hamcrest.core.Is; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import org.springframework.test.web.servlet.result.MockMvcResultHandlers;  import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;  /**  * 測(cè)試FooController.  *  * @author felord.cn  */ public class FooTests extends CustomSpringInjectApplicationTests {     /**      * /foo/map接口測(cè)試.      */     @SneakyThrows     @Test     void contextLoads() {         mockMvc.perform(MockMvcRequestBuilders.get("/foo/map"))                 .andExpect(ResultMatcher.matchAll(status().isOk(),                         content().contentType(MediaType.APPLICATION_JSON),                         jsonPath("$.test", Is.is("bar"))))                 .andDo(MockMvcResultHandlers.print());     } }

            4. MockMvc 測(cè)試

            集成測(cè)試時(shí),希望能夠通過(guò)輸入 URL 對(duì) Controller 進(jìn)行測(cè)試,如果通過(guò)啟動(dòng)服務(wù)器,建立 http client  進(jìn)行測(cè)試,這樣會(huì)使得測(cè)試變得很麻煩,比如,啟動(dòng)速度慢,測(cè)試驗(yàn)證不方便,依賴網(wǎng)絡(luò)環(huán)境等,為了可以對(duì) Controller  進(jìn)行測(cè)試,所以引入了MockMvc。

            MockMvc實(shí)現(xiàn)了對(duì) Http 請(qǐng)求的模擬,能夠直接使用網(wǎng)絡(luò)的形式,轉(zhuǎn)換到 Controller  的調(diào)用,這樣可以使得測(cè)試速度快、不依賴網(wǎng)絡(luò)環(huán)境,而且提供了一套驗(yàn)證的工具,這樣可以使得請(qǐng)求的驗(yàn)證統(tǒng)一而且很方便。接下來(lái)我們來(lái)一步步構(gòu)造一個(gè)測(cè)試的模擬請(qǐng)求,假設(shè)我們存在一個(gè)下面這樣的接口:

            @RestController @RequestMapping("/foo") public class FooController {     @Autowired     private MyBean myBean;      @GetMapping("/user")     public Map<String, String> bar(@RequestHeader("Api-Version") String apiVersion, User user) {         Map<String, String> map = new HashMap<>();         map.put("test", myBean.bar());         map.put("version", apiVersion);         map.put("username", user.getName());         //todo your business         return map;     } }

            參數(shù)設(shè)定為name=felord.cn&age=18,那么對(duì)應(yīng)的 HTTP 報(bào)文是這樣的:

            GET /foo/user?name=felord.cn&age=18 HTTP/1.1 Host: localhost:8888 Api-Version: v1

            可以預(yù)見(jiàn)的返回值為:

            {     "test": "bar",     "version": "v1",     "username": "felord.cn" }

            事實(shí)上對(duì)接口的測(cè)試可以分為以下幾步。

            構(gòu)建請(qǐng)求

            構(gòu)建請(qǐng)求由MockMvcRequestBuilders負(fù)責(zé),他提供了請(qǐng)求方法(Method),請(qǐng)求頭(Header),請(qǐng)求體(Body),參數(shù)(Parameters),會(huì)話(Session)等所有請(qǐng)求的屬性構(gòu)建。/foo/user接口的請(qǐng)求可以轉(zhuǎn)換為:

            MockMvcRequestBuilders.get("/foo/user")                 .param("name", "felord.cn")                 .param("age", "18")                 .header("Api-Version", "v1")

            執(zhí)行 Mock 請(qǐng)求

            然后由MockMvc執(zhí)行 Mock 請(qǐng)求:

            mockMvc.perform(MockMvcRequestBuilders.get("/foo/user")                 .param("name", "felord.cn")                 .param("age", "18")                 .header("Api-Version", "v1"))

            對(duì)結(jié)果進(jìn)行處理

            請(qǐng)求結(jié)果被封裝到ResultActions對(duì)象中,它封裝了多種讓我們對(duì) Mock 請(qǐng)求結(jié)果進(jìn)行處理的方法。

            對(duì)結(jié)果進(jìn)行預(yù)期期望

            ResultActions#andExpect(ResultMatcher  matcher)方法負(fù)責(zé)對(duì)響應(yīng)的結(jié)果的進(jìn)行預(yù)期期望,看看是否符合測(cè)試的期望值。參數(shù)ResultMatcher負(fù)責(zé)從響應(yīng)對(duì)象中提取我們需要期望的部位進(jìn)行預(yù)期比對(duì)。

            假如我們期望接口/foo/user返回的是JSON,并且 HTTP 狀態(tài)為200,同時(shí)響應(yīng)體包含了version=v1的值,我們應(yīng)該這么聲明:

            ResultMatcher.matchAll(MockMvcResultMatchers.status().isOk(),                MockMvcResultMatchers.content().contentType(MediaType.APPLICATION_JSON),                MockMvcResultMatchers.jsonPath("$.version", Is.is("v1")));

            JsonPath是一個(gè)強(qiáng)大的 JSON 解析類庫(kù),請(qǐng)通過(guò)其項(xiàng)目倉(cāng)庫(kù)https://github.com/json-path/JsonPath了解。

            對(duì)響應(yīng)進(jìn)行處理

            ResultActions#andDo(ResultHandler handler)方法負(fù)責(zé)對(duì)整個(gè)請(qǐng)求/響應(yīng)進(jìn)行打印或者 log  輸出、流輸出,由MockMvcResultHandlers工具類提供這些方法。我們可以通過(guò)以上三種途徑來(lái)查看請(qǐng)求響應(yīng)的細(xì)節(jié)。

            例如/foo/user接口:

            MockHttpServletRequest:       HTTP Method = GET       Request URI = /foo/user        Parameters = {name=[felord.cn], age=[18]}           Headers = [Api-Version:"v1"]              Body = null     Session Attrs = {}  Handler:              Type = cn.felord.xbean.config.FooController            Method = cn.felord.xbean.config.FooController#urlEncode(String, Params)  Async:     Async started = false      Async result = null  Resolved Exception:              Type = null  ModelAndView:         View name = null              View = null             Model = null  FlashMap:        Attributes = null  MockHttpServletResponse:            Status = 200     Error message = null           Headers = [Content-Type:"application/json"]      Content type = application/json              Body = {"test":"bar","version":"v1","username":"felord.cn"}     Forwarded URL = null    Redirected URL = null           Cookies = []

            獲取返回結(jié)果

            如果你希望進(jìn)一步處理響應(yīng)的結(jié)果,也可以通過(guò)ResultActions#andReturn()拿到MvcResult類型的結(jié)果進(jìn)行進(jìn)一步的處理。

            完整的測(cè)試過(guò)程

            通常andExpect是我們必然會(huì)選擇的,而andDo和andReturn在某些場(chǎng)景下會(huì)有用,它們兩個(gè)是可選的。我們把上面的連在一起。

            @Autowired MockMvc mockMvc;  @SneakyThrows @Test void contextLoads() {       mockMvc.perform(MockMvcRequestBuilders.get("/foo/user")             .param("name", "felord.cn")             .param("age", "18")             .header("Api-Version", "v1"))             .andExpect(ResultMatcher.matchAll(status().isOk(),                     content().contentType(MediaType.APPLICATION_JSON),                     jsonPath("$.version", Is.is("v1"))))             .andDo(MockMvcResultHandlers.print());  }

            這種流式的接口單元測(cè)試從語(yǔ)義上看也是比較好理解的,你可以使用各種斷言、正例、反例測(cè)試你的接口,最終讓你的接口更加健壯。

            到此,關(guān)于“如何解決Spring MVC接口漏洞百出”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

            新聞標(biāo)題:如何解決SpringMVC接口漏洞百出
            URL分享:http://www.jbt999.com/article8/pccoip.html

            成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版、全網(wǎng)營(yíng)銷推廣、做網(wǎng)站、小程序開(kāi)發(fā)、網(wǎng)站策劃、網(wǎng)站制作

            廣告

            聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:[email protected]。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

            h5響應(yīng)式網(wǎng)站建設(shè)

              <del id="d4fwx"><form id="d4fwx"></form></del>
              <del id="d4fwx"><form id="d4fwx"></form></del><del id="d4fwx"><form id="d4fwx"></form></del>

                    <code id="d4fwx"><abbr id="d4fwx"></abbr></code>
                  • 三级片五月天 | 偷拍无码一区二区 | 大陆AV高清无码在线播放 | 夜夜躁狠狠躁日日躁 | 超碰人人自拍 |