欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何解決SpringMVC接口漏洞百出

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

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

1. 前言

在開始前請務必確認添加了Spring Boot Test相關的組件,在最新的版本中應該包含以下依賴:

<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. 單獨測試控制層

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

@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());     }  }

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

3. 整體測試

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

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;   /**  * 測試基類,  * @author felord.cn  */ @SpringBootTest @AutoConfigureMockMvc abstract class CustomSpringInjectApplicationTests {     /**      * The Mock mvc.      */     @Autowired     MockMvc mockMvc;     // 其它公共依賴和處理方法 }

只有當@AutoConfigureMockMvc存在時MockMvc才會被注入 Spring IoC。

然后針對具體的控制層進行如下測試代碼的編寫:

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.*;  /**  * 測試FooController.  *  * @author felord.cn  */ public class FooTests extends CustomSpringInjectApplicationTests {     /**      * /foo/map接口測試.      */     @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 測試

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

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

@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ù)設定為name=felord.cn&age=18,那么對應的 HTTP 報文是這樣的:

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

可以預見的返回值為:

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

事實上對接口的測試可以分為以下幾步。

構建請求

構建請求由MockMvcRequestBuilders負責,他提供了請求方法(Method),請求頭(Header),請求體(Body),參數(shù)(Parameters),會話(Session)等所有請求的屬性構建。/foo/user接口的請求可以轉換為:

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

執(zhí)行 Mock 請求

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

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

對結果進行處理

請求結果被封裝到ResultActions對象中,它封裝了多種讓我們對 Mock 請求結果進行處理的方法。

對結果進行預期期望

ResultActions#andExpect(ResultMatcher  matcher)方法負責對響應的結果的進行預期期望,看看是否符合測試的期望值。參數(shù)ResultMatcher負責從響應對象中提取我們需要期望的部位進行預期比對。

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

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

JsonPath是一個強大的 JSON 解析類庫,請通過其項目倉庫https://github.com/json-path/JsonPath了解。

對響應進行處理

ResultActions#andDo(ResultHandler handler)方法負責對整個請求/響應進行打印或者 log  輸出、流輸出,由MockMvcResultHandlers工具類提供這些方法。我們可以通過以上三種途徑來查看請求響應的細節(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 = []

獲取返回結果

如果你希望進一步處理響應的結果,也可以通過ResultActions#andReturn()拿到MvcResult類型的結果進行進一步的處理。

完整的測試過程

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

@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());  }

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

到此,關于“如何解決Spring MVC接口漏洞百出”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注創(chuàng)新互聯(lián)網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

新聞標題:如何解決SpringMVC接口漏洞百出
URL分享:http://aaarwkj.com/article8/pccoip.html

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

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網站建設
久久精品国产亚洲av麻| 日韩在线视频观看一区二区三区| 可以看的黄色亚洲网站| 亚洲天堂av福利在线观看| 久久精品国产亚洲av不卡| 91麻豆亚洲国产成人久久精品| 亚洲欧美成人自偷自拍一区| 亚洲国产精品一区一区 | 日本人妻免费在线观看| 日本熟女视频中文字幕| 欧美高清在线观看一区二区| 日本免费中文字幕在线| 日韩欧美亚洲综合另类| 欧美高清视频看片在线观看| 97人妻精品一区二区三区六| 97日韩在线免费视频网站| 国产精品亚洲欧美在线| 久久精品一区二区日韩| 国产成人综合亚洲不卡| 欧美亚洲国产日韩另类| 国产成人av在线观看| 成人国产精品三上悠亚久久| 亚洲精品国产熟女久久| 午夜欧美日韩精品久久久| 亚洲欧美日韩制服另类| 亚洲综合色视频免费在线播放| 日本黄网色三级三级三级| 亚洲成人福利免费网站| 久久精品久久黄色片看看| 久久久久久国产精彩视频| 蜜臀av在线精品国自产拍| 国产又黄又爽不卡的视频| 欧美日韩亚洲综合国产人| 国产精品水嫩水嫩粉嫩| 国产av不卡精品影片| 日韩高清亚洲一区二区| 国产精品免费观看在线国产| 91大神黑丝美女洗澡| 91伊人久热精品午夜福利| 国产91高清视频在线观看| 一区二区三区四区毛片|