spring Boot 參考文檔閱讀摘錄/spring mvc(二)

      網(wǎng)友投稿 1169 2022-05-29

      28.開(kāi)發(fā)Web應(yīng)用程序

      Spring boot非常適合Web應(yīng)用程序開(kāi)發(fā)。您可以使用嵌入式Tomcat,Jetty,Undertow或Netty創(chuàng)建自包含的HTTP服務(wù)器。大多數(shù)Web應(yīng)用程序使用該spring-boot-starter-web模塊快速啟動(dòng)和運(yùn)行。您還可以選擇使用該spring-boot-starter-webflux模塊構(gòu)建響應(yīng)式Web應(yīng)用程序 。

      如果您還沒(méi)有開(kāi)發(fā)Spring Boot Web應(yīng)用程序,可以按照“Hello World!”進(jìn)行操作。“ 入門(mén)”部分中的示例 。

      28.1“Spring Web MVC框架”

      在spring Web MVC框架(通常簡(jiǎn)稱(chēng)為“spring MVC”)是一個(gè)豐富的“模型視圖控制器” Web框架。Spring MVC允許您創(chuàng)建特殊@Controller或@RestControllerbean來(lái)處理傳入的HTTP請(qǐng)求。控制器中的方法通過(guò)使用@RequestMapping注釋映射到HTTP 。

      以下代碼顯示了@RestController為JSON數(shù)據(jù)提供服務(wù)的典型代碼:

      @RestController? @RequestMapping(value?=“/?users”) ?public??class?MyRestController?{ @RequestMapping(value?=“/?{user}”,method?=?RequestMethod.GET) ?public?User?getUser(?@PathVariable?Long?user){ ?//?... } @RequestMapping(value?=“/?{user}?/?customers”,method?=?RequestMethod.GET)? List??getUserCustomers(?@PathVariable?Long?user){ ?//?... } @RequestMapping(value?=“/?{user}”,method?=?RequestMethod.DELETE) ?public?User?deleteUser(?@PathVariable?Long?user){ ?//?... } }

      Spring MVC是核心Spring Framework的一部分,詳細(xì)信息可在參考文檔中找到。也有涵蓋Spring MVC中提供一些指南spring.io/guides。

      28.1.1 Spring MVC自動(dòng)配置

      Spring Boot為Spring MVC提供自動(dòng)配置,適用于大多數(shù)應(yīng)用程序。

      自動(dòng)配置在Spring的默認(rèn)值之上添加了以下功能:

      包含ContentNegotiatingViewResolver和BeanNameViewResolver豆類(lèi)。

      支持提供靜態(tài)資源,包括對(duì)WebJars的支持( 本文檔稍后介紹))。

      自動(dòng)注冊(cè)Converter,GenericConverter和Formatter豆類(lèi)。

      支持HttpMessageConverters( 本文檔后面部分)。

      自動(dòng)注冊(cè)MessageCodesResolver( 本文檔后面部分)。

      靜態(tài)index.html支持。

      自定義Favicon支持(本文檔后面部分介紹)。

      自動(dòng)使用ConfigurableWebBindingInitializerbean( 本文檔稍后介紹)。

      如果您想保留Spring Boot MVC功能并且想要添加其他 MVC配置(-,格式化程序,視圖控制器和其他功能),您可以添加自己@Configuration的類(lèi)型 WebMvcConfigurer但不需要 @EnableWebMvc。如果您希望提供,或的 自定義實(shí)例RequestMappingHandlerMapping,則可以聲明 實(shí)例以提供此類(lèi)組件。RequestMappingHandlerAdapterExceptionHandlerExceptionResolverWebMvcRegistrationsAdapter

      如果您想完全控制Spring MVC,可以添加自己的@Configuration 注釋@EnableWebMvc。

      28.1.2 HttpMessageConverters

      Spring MVC使用該HttpMessageConverter接口轉(zhuǎn)換HTTP請(qǐng)求和響應(yīng)。明智的默認(rèn)值包含在開(kāi)箱即用中。例如,對(duì)象可以自動(dòng)轉(zhuǎn)換為JSON(通過(guò)使用Jackson庫(kù))或XML(如果可用,則使用Jackson XML擴(kuò)展,或者如果Jackson XML擴(kuò)展不可用,則使用JAXB)。默認(rèn)情況下,字符串編碼為UTF-8。

      如果需要添加或自定義轉(zhuǎn)換器,可以使用Spring Boot的 HttpMessageConverters類(lèi),如下面的清單所示:

      import?org.springframework.boot.autoconfigure.web.HttpMessageConverters; import?org.springframework.context.annotation.*; import?org.springframework.http.converter.*; @Configuration public?class?MyConfiguration?{ @Bean public?HttpMessageConverters?customConverters()?{ HttpMessageConverter?additional?=?... HttpMessageConverter?another?=?... return?new?HttpMessageConverters(additional,?another); } }

      HttpMessageConverter上下文中存在的任何bean都將添加到轉(zhuǎn)換器列表中。您也可以以相同的方式覆蓋默認(rèn)轉(zhuǎn)換器。

      28.1.3自定義JSON序列化程序和反序列化程序

      如果您使用Jackson來(lái)序列化和反序列化JSON數(shù)據(jù),您可能希望編寫(xiě)自己的類(lèi)JsonSerializer和JsonDeserializer類(lèi)。自定義序列化程序通常 通過(guò)模塊向Jackson注冊(cè),但Spring Boot提供了另一種@JsonComponent注釋?zhuān)梢愿菀椎刂苯幼?cè)Spring Beans。

      您可以@JsonComponent直接使用注釋JsonSerializer或 JsonDeserializer實(shí)現(xiàn)。您還可以在包含序列化程序/反序列化程序作為內(nèi)部類(lèi)的類(lèi)上使用它,如以下示例所示:

      import?java.io.*; import?com.fasterxml.jackson.core.*; import?com.fasterxml.jackson.databind.*; import?org.springframework.boot.jackson.*; @JsonComponent public?class?Example?{ public?static?class?Serializer?extends?JsonSerializer?{ //?... } public?static?class?Deserializer?extends?JsonDeserializer?{ //?... } }

      其中的所有@JsonComponent豆類(lèi)都會(huì)ApplicationContext自動(dòng)在杰克遜注冊(cè)。因?yàn)锧JsonComponent是元注釋@Component,所以通常的組件掃描規(guī)則適用。

      Spring Boot也提供 JsonObjectSerializer和 JsonObjectDeserializer基礎(chǔ)類(lèi),序列化對(duì)象時(shí)提供標(biāo)準(zhǔn)版本的杰克遜有用的替代。見(jiàn) JsonObjectSerializer 和JsonObjectDeserializer在Javadoc了解詳情。

      28.1.4 MessageCodesResolver

      Spring MVC有一個(gè)生成錯(cuò)誤代碼的策略,用于從綁定錯(cuò)誤中呈現(xiàn)錯(cuò)誤消息:MessageCodesResolver。如果設(shè)置了 spring.mvc.message-codes-resolver.format財(cái)產(chǎn)PREFIX_ERROR_CODE或 POSTFIX_ERROR_CODE春季啟動(dòng)為您創(chuàng)建一個(gè)(見(jiàn)枚舉 DefaultMessageCodesResolver.Format)。

      28.1.5靜態(tài)內(nèi)容

      默認(rèn)情況下,Spring Boot從類(lèi)路徑中的/static( /public或/resources或/META-INF/resources)目錄或者根目錄中提供靜態(tài)內(nèi)容ServletContext。它使用ResourceHttpRequestHandler來(lái)自Spring MVC,以便您可以通過(guò)添加自己WebMvcConfigurer的addResourceHandlers方法來(lái)修改該行為并覆蓋該 方法。

      在獨(dú)立的Web應(yīng)用程序中,容器中的默認(rèn)servlet也會(huì)啟用并充當(dāng)后備,從ServletContextif 的根目錄提供內(nèi)容,決定不處理它。大多數(shù)情況下,這不會(huì)發(fā)生(除非你修改默認(rèn)的MVC配置),因?yàn)镾pring總是可以通過(guò)它來(lái)處理請(qǐng)求 DispatcherServlet。

      默認(rèn)情況下,會(huì)映射資源/**,但您可以使用該spring.mvc.static-path-pattern屬性對(duì)其進(jìn)行調(diào)整 。例如,/resources/**可以按如下方式重新定位所有資源 :

      spring.mvc.static-path-pattern = / resources / **

      您還可以使用該spring.resources.static-locations屬性自定義靜態(tài)資源位置 (將默認(rèn)值替換為目錄位置列表)。根Servlet上下文路徑"/"也會(huì)自動(dòng)添加為位置。

      除了前面提到的“標(biāo)準(zhǔn)”靜態(tài)資源位置之外,還為Webjars內(nèi)容制作了一個(gè)特例。具有路徑的任何資源 /webjars/**都是從jar文件提供的,如果它們以Webjars格式打包的話(huà)。

      Spring Boot 參考文檔閱讀摘錄/spring mvc(二)

      [注]

      src/main/webapp如果您的應(yīng)用程序打包為jar,請(qǐng)不要使用該目錄。雖然這個(gè)目錄是一個(gè)通用的標(biāo)準(zhǔn),它的工作原理只是戰(zhàn)爭(zhēng)的包裝,它是默默大多數(shù)構(gòu)建工具忽略,如果你生成一個(gè)罐子。

      Spring Boot還支持Spring MVC提供的高級(jí)資源處理功能,允許使用緩存破壞靜態(tài)資源或使用與Webjars無(wú)關(guān)的URL。

      要為Webjars使用版本無(wú)關(guān)的URL,請(qǐng)?zhí)砑觲ebjars-locator-core依賴(lài)項(xiàng)。然后聲明你的Webjar。以jQuery為例,添加 "/webjars/jquery/jquery.min.js"結(jié)果 "/webjars/jquery/x.y.z/jquery.min.js"。x.y.zWebjar版本在哪里。

      [注]

      如果你使用JBoss,你需要聲明webjars-locator-jboss-vfs 依賴(lài)而不是webjars-locator-core。否則,所有Webjars都會(huì)解析為 404。

      要使用緩存清除,以下配置會(huì)為所有靜態(tài)資源配置緩存清除解決方案,從而有效地在URL中添加內(nèi)容哈希,例如 :

      spring.resources.chain.strategy.content.enabled = true

      spring.resources.chain.strategy.content.paths = / **

      [注]

      由于ResourceUrlEncodingFilter為T(mén)hymeleaf和FreeMarker自動(dòng)配置了資源鏈接,因此在運(yùn)行時(shí)會(huì)在模板中重寫(xiě)這些鏈接 。您應(yīng)該在使用JSP時(shí)手動(dòng)聲明此過(guò)濾器。其他模板引擎目前不是自動(dòng)支持的,但可以使用自定義模板宏/幫助程序和使用 ResourceUrlProvider。

      使用(例如)JavaScript模塊加載器動(dòng)態(tài)加載資源時(shí),不能重命名文件。這就是為什么其他策略也得到支持并可以合并的原因。“固定”策略在URL中添加靜態(tài)版本字符串而不更改文件名,如以下示例所示:

      spring.resources.chain.strategy.content.enabled = true

      spring.resources.chain.strategy.content.paths = / **

      spring.resources.chain.strategy.fixed.enabled = true

      spring.resources.chain.strategy.fixed .paths = / js / lib /

      spring.resources.chain.strategy.fixed.version = v12

      使用此配置,JavaScript模塊位于"/js/lib/"使用固定版本控制策略("/v12/js/lib/mymodule.js"),而其他資源仍使用內(nèi)容one()。

      有關(guān)ResourceProperties 更多支持選項(xiàng),請(qǐng)參閱

      [注]

      此功能已在專(zhuān)門(mén)的博客文章和Spring Framework的 參考文檔中進(jìn)行了詳細(xì)描述 。

      28.1.6歡迎頁(yè)面

      Spring Boot支持靜態(tài)和模板化歡迎頁(yè)面。它首先index.html在配置的靜態(tài)內(nèi)容位置中查找 文件。如果找不到,則查找index模板。如果找到任何一個(gè),它將自動(dòng)用作應(yīng)用程序的歡迎頁(yè)面。

      28.1.7自定義Favicon

      Spring Boot favicon.ico在配置的靜態(tài)內(nèi)容位置和類(lèi)路徑的根(按此順序)中查找a 。如果存在這樣的文件,它將自動(dòng)用作應(yīng)用程序的favicon。

      28.1.8路徑匹配和內(nèi)容協(xié)商

      Spring MVC可以通過(guò)查看請(qǐng)求路徑并將其與應(yīng)用程序中定義的映射(例如,@GetMapping Controller方法上的注釋?zhuān)┫嗥ヅ洌瑢魅氲腍TTP請(qǐng)求映射到處理程序。

      Spring Boot默認(rèn)選擇禁用后綴模式匹配,這意味著請(qǐng)求"GET /projects/spring-boot.json"不會(huì)與@GetMapping("/projects/spring-boot")映射匹配 。這被認(rèn)為是Spring MVC應(yīng)用程序的 最佳實(shí)踐。對(duì)于沒(méi)有發(fā)送正確“接受”請(qǐng)求標(biāo)頭的HTTP客戶(hù)端,此功能在過(guò)去主要有用; 我們需要確保將正確的內(nèi)容類(lèi)型發(fā)送給客戶(hù)端。如今,內(nèi)容協(xié)商更加可靠。

      還有其他方法可以處理不一致發(fā)送正確“接受”請(qǐng)求標(biāo)頭的HTTP客戶(hù)端。我們可以使用查詢(xún)參數(shù)來(lái)確保將請(qǐng)求"GET /projects/spring-boot?format=json" 映射到@GetMapping("/projects/spring-boot")以下內(nèi)容,而不是使用后綴匹配:

      spring.mvc.contentnegotiation.favor-parameter = true

      #我們可以更改參數(shù)名稱(chēng),默認(rèn)為“format”:

      #spring.mvc.contentnegotiation.parameter-name = myparam

      #我們還可以注冊(cè)其他文件擴(kuò)展名/媒體類(lèi)型:

      spring.mvc.contentnegotiation.media-types.markdown = text / markdown

      如果您了解警告并仍希望您的應(yīng)用程序使用后綴模式匹配,則需要以下配置:

      spring.mvc.contentnegotiation.favor-path-extension = true

      spring.mvc.pathmatch.use-suffix-pattern = true

      或者,不是打開(kāi)所有后綴模式,而是僅支持已注冊(cè)的后綴模式更安全:

      spring.mvc.contentnegotiation.favor-path-extension = true

      spring.mvc.pathmatch.use-registered-suffix-pattern = true

      #您還可以注冊(cè)其他文件擴(kuò)展名/媒體類(lèi)型:

      #spring.mvc.contentnegotiation.media-types.adoc = text / asciidoc

      28.1.9 ConfigurableWebBindingInitializer

      Spring MVC使用a WebBindingInitializer來(lái)初始化WebDataBinder特定請(qǐng)求。如果您自己創(chuàng)建ConfigurableWebBindingInitializer @Bean,Spring Boot會(huì)自動(dòng)配置Spring MVC來(lái)使用它。

      28.1.10模板引擎

      除REST Web服務(wù)外,您還可以使用Spring MVC來(lái)提供動(dòng)態(tài)HTML內(nèi)容。Spring MVC支持各種模板技術(shù),包括Thymeleaf,F(xiàn)reeMarker和JSP。此外,許多其他模板引擎包括他們自己的Spring MVC集成。

      Spring Boot包含對(duì)以下模板引擎的自動(dòng)配置支持:

      FreeMarker

      Groovy

      Thymeleaf

      Mustache

      [注]

      如果可能,應(yīng)該避免使用JSP。將它們與嵌入式servlet容器一起使用時(shí)有幾個(gè) 已知的限制。

      當(dāng)您使用其中一個(gè)模板引擎和默認(rèn)配置時(shí),您的模板將自動(dòng)從中獲取src/main/resources/templates。

      [注]

      根據(jù)您運(yùn)行應(yīng)用程序的方式,IntelliJ IDEA以不同方式對(duì)類(lèi)路徑進(jìn)行排序。從主方法在IDE中運(yùn)行應(yīng)用程序會(huì)產(chǎn)生與使用Maven或Gradle或其打包的jar運(yùn)行應(yīng)用程序時(shí)不同的順序。這可能導(dǎo)致Spring Boot無(wú)法在類(lèi)路徑中找到模板。如果遇到此問(wèn)題,可以在IDE中重新排序類(lèi)路徑,以便首先放置模塊的類(lèi)和資源。或者,您可以配置模板前綴以搜索templates類(lèi)路徑上的每個(gè)目錄,如下所示: classpath*:/templates/。

      28.1.11錯(cuò)誤處理

      默認(rèn)情況下,Spring Boot提供了一個(gè)/error以合理方式處理所有錯(cuò)誤的映射,并將其注冊(cè)為servlet容器中的“全局”錯(cuò)誤頁(yè)面。對(duì)于計(jì)算機(jī)客戶(hù)端,它會(huì)生成一個(gè)JSON響應(yīng),其中包含錯(cuò)誤,HTTP狀態(tài)和異常消息的詳細(xì)信息。對(duì)于瀏覽器客戶(hù)端,有一個(gè)“whitelabel”錯(cuò)誤視圖,以HTML格式呈現(xiàn)相同的數(shù)據(jù)(以自定義它,添加View解析后的數(shù)據(jù)error)。要完全替換默認(rèn)行為,您可以實(shí)現(xiàn) ErrorController并注冊(cè)該類(lèi)型的bean定義,或者添加類(lèi)型的bean ErrorAttributes以使用現(xiàn)有機(jī)制但替換內(nèi)容。

      [注]

      在BasicErrorController可以用作自定義基類(lèi) ErrorController。如果要為新內(nèi)容類(lèi)型添加處理程序(默認(rèn)情況下是text/html專(zhuān)門(mén)處理并為其他所有內(nèi)容提供后備),這將特別有用。為此,請(qǐng)擴(kuò)展BasicErrorController,添加@RequestMapping具有produces屬性的公共方法 ,并創(chuàng)建新類(lèi)型的bean。

      您還可以定義一個(gè)帶注釋的類(lèi),@ControllerAdvice以自定義JSON文檔以返回特定控制器和/或異常類(lèi)型,如以下示例所示:

      @ControllerAdvice(basePackageClasses?=?AcmeController.class) public?class?AcmeControllerAdvice?extends?ResponseEntityExceptionHandler?{ @ExceptionHandler(YourException.class) @ResponseBody ResponseEntity?handleControllerException(HttpServletRequest?request,?Throwable?ex)?{ HttpStatus?status?=?getStatus(request); return?new?ResponseEntity<>(new?CustomErrorType(status.value(),?ex.getMessage()),?status); } private?HttpStatus?getStatus(HttpServletRequest?request)?{ Integer?statusCode?=?(Integer)?request.getAttribute("javax.servlet.error.status_code"); if?(statusCode?==?null)?{ return?HttpStatus.INTERNAL_SERVER_ERROR; } return?HttpStatus.valueOf(statusCode); } }

      在前面的示例中,如果YourException由同一包中定義的控制器拋出,則使用POJO AcmeController的JSON表示CustomErrorType而不是ErrorAttributes表示。

      自定義錯(cuò)誤頁(yè)面

      如果要顯示給定狀態(tài)代碼的自定義HTML錯(cuò)誤頁(yè)面,可以將文件添加到文件/error夾。錯(cuò)誤頁(yè)面可以是靜態(tài)HTML(即,添加到任何靜態(tài)資源文件夾下),也可以使用模板構(gòu)建。文件名應(yīng)該是確切的狀態(tài)代碼或系列掩碼。

      例如,要映射404到靜態(tài)HTML文件,您的文件夾結(jié)構(gòu)如下所示:

      src/

      +- main/

      +- java/

      | ? +

      +- resources/

      +- public/

      +- error/

      | ? +- 404.html

      +-

      要5xx使用FreeMarker模板映射所有錯(cuò)誤,您的文件夾結(jié)構(gòu)如下:

      src/

      +- main/

      +- java/

      | ? +

      +- resources/

      +- templates/

      +- error/

      | ? +- 5xx.ftl

      +-

      對(duì)于更復(fù)雜的映射,您還可以添加實(shí)現(xiàn)該ErrorViewResolver 接口的bean ,如以下示例所示:

      public?class?MyErrorViewResolver?implements?ErrorViewResolver?{ @Override public?ModelAndView?resolveErrorView(HttpServletRequest?request, HttpStatus?status,?Map?model)?{ //?Use?the?request?or?status?to?optionally?return?a?ModelAndView return?... } }

      您還可以使用常規(guī)的Spring MVC功能,例如 @ExceptionHandler方法和 @ControllerAdvice。在 ErrorController隨后拿起任何未處理的異常。

      映射Spring MVC之外的錯(cuò)誤頁(yè)面

      對(duì)于不使用Spring MVC的應(yīng)用程序,可以使用該ErrorPageRegistrar 接口直接注冊(cè)ErrorPages。這種抽象直接與底層嵌入式servlet容器一起工作,即使你沒(méi)有Spring MVC也可以工作 DispatcherServlet。

      @Bean public?ErrorPageRegistrar?errorPageRegistrar(){ return?new?MyErrorPageRegistrar(); } //?... private?static?class?MyErrorPageRegistrar?implements?ErrorPageRegistrar?{ @Override public?void?registerErrorPages(ErrorPageRegistry?registry)?{ registry.addErrorPages(new?ErrorPage(HttpStatus.BAD_REQUEST,?"/400")); } }

      [注]

      如果您注冊(cè)的ErrorPage路徑最終由a處理Filter (與一些非Spring Web框架(如Jersey和Wicket)一樣),那么 Filter必須將其顯式注冊(cè)為ERROR調(diào)度程序,如以下示例所示:

      @Bean public?FilterRegistrationBean?myFilter()?{ FilterRegistrationBean?registration?=?new?FilterRegistrationBean(); registration.setFilter(new?MyFilter()); ... registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); return?registration; }

      請(qǐng)注意,默認(rèn)值FilterRegistrationBean不包括ERROR調(diào)度程序類(lèi)型。

      小心:當(dāng)部署到servlet容器時(shí),Spring Boot使用其錯(cuò)誤頁(yè)面過(guò)濾器將具有錯(cuò)誤狀態(tài)的請(qǐng)求轉(zhuǎn)發(fā)到相應(yīng)的錯(cuò)誤頁(yè)面。如果尚未提交響應(yīng),則只能將請(qǐng)求轉(zhuǎn)發(fā)到正確的錯(cuò)誤頁(yè)面。缺省情況下,WebSphere Application Server 8.0及更高版本在成功完成servlet的服務(wù)方法后提交響應(yīng)。您應(yīng)該通過(guò)設(shè)置com.ibm.ws.webcontainer.invokeFlushAfterService為禁用此行為 false。

      28.1.12spring HATEOAS

      如果您開(kāi)發(fā)使用超媒體的RESTful API,Spring Boot為Spring HATEOAS提供自動(dòng)配置,適用于大多數(shù)應(yīng)用程序。自動(dòng)配置取代了使用@EnableHypermediaSupport和注冊(cè)多個(gè)bean 的需要,以便于構(gòu)建基于超媒體的應(yīng)用程序,包括 LinkDiscoverers(用于客戶(hù)端支持)和ObjectMapper配置為正確地將響應(yīng)編組到所需表示中。的ObjectMapper是通過(guò)設(shè)置各種定制的spring.jackson.*屬性,或者,如果存在的話(huà),通過(guò)一個(gè) Jackson2ObjectMapperBuilder豆。

      您可以使用控制Spring HATEOAS的配置 @EnableHypermediaSupport。請(qǐng)注意,這樣做會(huì)禁用ObjectMapper前面描述的自定義。

      28.1.13 CORS支持

      跨源資源共享 (CORS)是大多數(shù)瀏覽器實(shí)現(xiàn) 的W3C規(guī)范,允許您以靈活的方式指定授權(quán)何種跨域請(qǐng)求,而不是使用一些安全性較低且功能較弱的方法,如IFRAME或JSONP。

      從版本4.2開(kāi)始,Spring MVC 支持CORS。 在Spring Boot應(yīng)用程序中使用帶有 注釋的控制器方法CORS配置@CrossOrigin不需要任何特定配置。 可以通過(guò)使用自定義方法注冊(cè)bean 來(lái)定義全局CORS配置,如以下示例所示:WebMvcConfigureraddCorsMappings(CorsRegistry)

      @Configuration ?public??class?MyConfiguration?{ @Bean ?public?WebMvcConfigurer?corsConfigurer(){ ?return??new?WebMvcConfigurer(){ ?@ ?Override?public??void?addCorsMappings(CorsRegistry?registry){ registry.addMapping(“/?api?/?**”); } }; } }

      MVC Spring Boot Spring

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:張小白的昇騰體驗(yàn)官日記
      下一篇:滲透測(cè)試學(xué)習(xí)指南
      相關(guān)文章
      亚洲乱码中文字幕久久孕妇黑人| 日本亚洲高清乱码中文在线观看| 亚洲精品国产综合久久一线| 亚洲精品免费网站| 亚洲国产视频一区| 亚洲高清视频在线播放| 亚洲色精品vr一区二区三区| 国产精品V亚洲精品V日韩精品 | 亚洲日韩av无码| 国产亚洲蜜芽精品久久| 国产亚洲人成在线播放| 亚洲AV无码成人精品区日韩| 亚洲欧洲国产综合AV无码久久| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 亚洲午夜成人精品电影在线观看| 国产成人亚洲精品电影| 无码天堂va亚洲va在线va| 国产精品久久久久久亚洲小说| 国产综合激情在线亚洲第一页| 国产产在线精品亚洲AAVV| 国产成人久久精品亚洲小说| 久久精品国产亚洲AV电影网| 午夜亚洲福利在线老司机| 亚洲无码日韩精品第一页| 亚洲中文字幕无码久久2017| 国产V亚洲V天堂A无码| 亚洲av激情无码专区在线播放| 久久久亚洲AV波多野结衣| 亚洲欧洲综合在线| 亚洲国产夜色在线观看| 国产亚洲精品成人AA片| 亚洲日本成本人观看| 亚洲AV无码乱码在线观看牲色 | 亚洲第一成年网站大全亚洲| 亚洲国产成人久久三区| 亚洲狠狠婷婷综合久久蜜芽| 国产区图片区小说区亚洲区| 中文字幕不卡亚洲| 亚洲AV无码一区二区三区DV| 亚洲综合在线视频| 亚洲国产美女在线观看|