日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

框架controller找不到_SpingBoot框架知识详解

發(fā)布時間:2023/11/30 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 框架controller找不到_SpingBoot框架知识详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Spring boot框架

1、什么是Spring Boot?

? Spring Boot是Spring開源組織下的子項目,是Spring組件一站式解決方案,主要是簡化了使用Spring的難度,簡省了繁重的配置,提供了各種啟動器,開發(fā)者能快速上手。

Spring Boot官方文檔:https://spring.io/projects/spring-boot/

2、Spring Boot的優(yōu)點與特點

優(yōu)點:

  • 獨立運行
  • Spring Boot內嵌了各種servlet容器,Tomcat、Jetty等,不再需要打成war包部署到容器中,Spring Boot只要打成一個可執(zhí)行的jar包就能獨立運行,所有的依賴包都在一個jar包內
  • 簡化配置
  • spring-boot-starter-web啟動器自動依賴其他組件,簡少了maven的配置。
  • 自動配置
  • Spring Boot能根據(jù)當前類路徑下的類、jar包來自動配置bean,如添加一個spring-boot-starter-web啟動器就能擁有web的功能,無需其他配置
  • 無代碼生成和XML配置
  • Spring Boot配置過程中無代碼生成,也無需XML配置文件就能完成所有配置工作,這一切都是借助于條件注解完成的,這也是Spring4.x的核心功能之一。
  • 應用監(jiān)控
  • Spring Boot提供一系列端點可以監(jiān)控服務及應用,做健康檢測。
  • 上手容易

特點:

  • 為 Spring 開發(fā)提供一個更快、更廣泛的入門體驗。
  • 開箱即用,遠離繁瑣的配置。
  • 提供了一系列大型項目通用的非業(yè)務性功能,例如:內嵌服務器、安全管理、運行數(shù)據(jù)監(jiān)控、運行狀況檢查和外部化配置等。
  • 絕對沒有代碼生成,也不需要XML配置。

3、Spring Boot的配置文件以及之間的區(qū)別

.properties 和 .yml,它們的區(qū)別主要是書寫格式不同。

1).properties

app.user.name = javastack

2).yml

app:user:name: javastack

注:.yml 格式不支持 @PropertySource 注解導入配置。

4、Spring Boot的常用注解

@SpringBootApplication:

申明讓spring boot自動給程序進行必要的配置,這個配置等同于:@Configuration @EnableAutoConfiguration 和 @ComponentScan 三個配置。

@ResponseBody:

表示該方法的返回結果直接寫入HTTP response body中,一般在異步獲取數(shù)據(jù)時使用,用于構建RESTful的api。在使用@RequestMapping后,返回值通常解析為跳轉路徑,加上@esponsebody后返回結果不會被解析為跳轉路徑,而是直接寫入HTTP response body中。比如異步獲取json數(shù)據(jù),加上@Responsebody后,會直接返回json數(shù)據(jù)。該注解一般會配合@RequestMapping一起使用。

@Controller:

用于定義控制器類,在spring項目中由控制器負責將用戶發(fā)來的URL請求轉發(fā)到對應的服務接口(service層),一般這個注解在類中,通常方法需要配合注解@RequestMapping。

@RestController:

用于標注控制層組件(如struts中的action),@ResponseBody和@Controller的合集。

@RequestMapping:

提供路由信息,負責URL到Controller中的具體函數(shù)的映射。

@EnableAutoConfiguration:

SpringBoot自動配置(auto-configuration):嘗試根據(jù)你添加的jar依賴自動配置你的Spring應用。例如,如果你的classpath下存在HSQLDB,并且你沒有手動配置任何數(shù)據(jù)庫連接beans,那么我們將自動配置一個內存型(in-memory)數(shù)據(jù)庫”。你可以將@EnableAutoConfiguration或者@SpringBootApplication :添加到一個@Configuration類上來選擇自動配置。如果發(fā)現(xiàn)應用了你不想要的特定自動配置類,你可以使用@EnableAutoConfiguration注解的排除屬性來禁用它們。

@ComponentScan:

表示將該類自動發(fā)現(xiàn)掃描組件。個人理解相當于,如果掃描到有@Component、@Controller、@Service等這些注解的類,并注冊為Bean,可以自動收集所有的Spring組件,包括@Configuration類。我們經(jīng)常使用@ComponentScan注解搜索beans,并結合@Autowired注解導入。可以自動收集所有的Spring組件,包括@Configuration類。我們經(jīng)常使用@ComponentScan注解搜索beans,并結合@Autowired注解導入。如果沒有配置的話,Spring Boot會掃描啟動類所在包下以及子包下的使用了@Service,@Repository等注解的類。

@Configuration:

相當于傳統(tǒng)的xml配置文件,如果有些第三方庫需要用到xml文件,建議仍然通過@Configuration類作為項目的配置主類——可以使用@ImportResource注解加載xml配置文件。

@Import:用來導入其他配置類。

@ImportResource:用來加載xml配置文件。

@Service:一般用于修飾service層的組件

@Repository:使用@Repository注解可以確保DAO或者repositories提供異常轉譯,這個注解修飾的DAO或者repositories類會被ComponetScan發(fā)現(xiàn)并配置,同時也不需要為它們提供XML配置項。

@Value:注入Spring boot application.properties配置的屬性的值。示例代碼:

@Inject:等價于默認的@Autowired,只是沒有required屬性;

@Component:泛指組件,當組件不好歸類的時候,我們可以使用這個注解進行標注。

@Bean:相當于XML中的,放在方法的上面,而不是類,意思是產生一個bean,并交給spring管理。

@AutoWired:

自動導入依賴的bean。byType方式。把配置好的Bean拿來用,完成屬性、方法的組裝,它可以對類成員變量、方法及構造函數(shù)進行標注,完成自動裝配的工作。當加上(required=false)時,就算找不到bean也不報錯。

@Qualifier:

當有多個同一類型的Bean時,可以用@Qualifier(“name”)來指定。與@Autowired配合使用。@Qualifier限定描述符除了能根據(jù)名字進行注入,但能進行更細粒度的控制如何選擇候選者,具體使用方式如下:

@Resource(name=”name”,type=”type”):沒有括號內內容的話,默認byName。與@Autowired干類似的事。

5、spring boot開啟的兩種方式

? ① 繼承spring-boot-starter-parent項目

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version>xml</parent>

? ② 導入spring-boot-dependencies項目依賴

<dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.6.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencyManagement>

Spring Boot依賴注意點

1、屬性覆蓋只對繼承有效

? Spring Boot依賴包里面的組件的版本都是和當前Spring Boot綁定的,如果要修改里面組件的版本,只需要添加如下屬性覆蓋即可,但這種方式只對繼承有效,導入的方式無效。

<properties><slf4j.version>1.7.25<slf4j.version></properties>

如果導入的方式要實現(xiàn)版本的升級,達到上面的效果,這樣也可以做到,把要升級的組件依賴放到Spring Boot之前。

<dependencyManagement><dependencies><!-- Override Spring Data release train provided by Spring Boot --><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-releasetrain</artifactId><version>Fowler-SR2</version><scope>import</scope><type>pom</type></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>1.5.6.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement>

需要注意,要修改Spring Boot的依賴組件版本可能會造成不兼容的問題。

2、資源文件過濾問題

使用繼承Spring Boot時,如果要使用Maven resource filter過濾資源文件時,資源文件里面的占位符為了使${}和Spring Boot區(qū)別開來,此時要用@...@包起來,不然無效。另外,@...@占位符在yaml文件編輯器中編譯報錯,所以使用繼承方式有諸多問題,坑要慢慢趟。

6、Spring Boot的幾種運行方式

  • 打包用命令或者放到容器中運行
  • 用 Maven/ Gradle 插件運行
  • 直接執(zhí)行 main 方法運行

7、Spring Boot實現(xiàn)熱部署

第一種引用devtools依賴

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>

第二種自定義配置熱部署

# 熱部署開關,false即不啟用熱部署spring.devtools.restart.enabled: true# 指定熱部署的目錄#spring.devtools.restart.additional-paths: src/main/java# 指定目錄不更新spring.devtools.restart.exclude: test/**

第三種Intellij Idea修改

? 1、勾上自動編譯或者手動重新編譯

? File > Settings > Compiler-Build Project automatically

? 2、注冊

? ctrl + shift + alt + / > Registry > 勾選Compiler autoMake allow when app running

注意事項:

1、生產環(huán)境devtools將被禁用,如java -jar方式或者自定義的類加載器等都會識別為生產環(huán)境。

2、打包應用默認不會包含devtools,除非你禁用SpringBoot Maven插件的 excludeDevtools屬性。

3、Thymeleaf無需配置 spring.thymeleaf.cache:false,devtools默認會自動設置,參考完整屬性。

4、devtools會在windows資源管理器占用java進程,在開發(fā)工具里面殺不掉,只能手動kill掉,不然重啟會選成端口重復綁定報錯。

更多詳細用法,參考發(fā)官方文檔:https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html

8、保護Spring Boot的應用方法

  • 在生產中使用HTTPS
  • 使用Snyk檢查你的依賴關系
  • 升級到最新版本
  • 啟動CSRF保護
  • 使用內容安全策略防止XSS攻擊
  • 使用OpenID Connect進行身份驗證
  • 管理密碼使用面密碼哈希
  • 安全地存儲秘密
  • 使用OWASP的ZAP測試應用程序
  • 安全團隊進行代碼審查
  • 9、Spring Boot配置加載順序(2.0)

    1、properties文件;

    2、YAML文件;

    3、系統(tǒng)環(huán)境變量;

    4、命令行參數(shù);

    等等……

    配置屬性加載的順序如下:

    1、開發(fā)者工具 `Devtools` 全局配置參數(shù);2、單元測試上的 `@TestPropertySource` 注解指定的參數(shù);3、單元測試上的 `@SpringBootTest` 注解指定的參數(shù);4、命令行指定的參數(shù),如 `java -jar springboot.jar --name="Java技術棧"`;5、命令行中的 `SPRING_APPLICATION_JSONJSON` 指定參數(shù), 如 `java -Dspring.application.json='{"name":"Java技術棧"}' -jar springboot.jar`6、`ServletConfig` 初始化參數(shù);7、`ServletContext` 初始化參數(shù);8、JNDI參數(shù)(如 `java:comp/env/spring.application.json`);9、Java系統(tǒng)參數(shù)(來源:`System.getProperties()`);10、操作系統(tǒng)環(huán)境變量參數(shù);11、`RandomValuePropertySource` 隨機數(shù),僅匹配:`ramdom.*`;12、JAR包外面的配置文件參數(shù)(`application-{profile}.properties(YAML)`)13、JAR包里面的配置文件參數(shù)(`application-{profile}.properties(YAML)`)14、JAR包外面的配置文件參數(shù)(`application.properties(YAML)`)15、JAR包里面的配置文件參數(shù)(`application.properties(YAML)`)16、`@Configuration`配置文件上 `@PropertySource` 注解加載的參數(shù);17、默認參數(shù)(通過 `SpringApplication.setDefaultProperties` 指定);

    10、Spring Boot日志集成

    Spring Boot日志框架

    Spring Boot支持Java Util Logging,Log4j2,Lockback作為日志框架,如果你使用starters啟動器,Spring Boot將使用Logback作為默認日志框架。無論使用哪種日志框架,Spring Boot都支持配置將日志輸出到控制臺或者文件中。

    spring-boot-starter啟動器包含spring-boot-starter-logging啟動器并集成了slf4j日志抽象及Logback日志框架。

    11、Spring Boot讀取配置的幾種方式

    讀取application文件

    在application.yml或者properties文件中添加:

    info.address=USA

    info.company=Spring

    info.degree=high

    @Value注解讀物方式

    import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;@Componentpublic class InfoConfig1 {@Value("${info.address}")private String address;@Value("${info.company}")private String company;@Value("${info.degree}")private String degree;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getDegree() {return degree;}public void setDegree(String degree) {this.degree = degree;}}

    @ConfigurationProperties注解讀取方式

    @Component@ConfigurationProperties(prefix = "info")public class InfoConfig2 {private String address;private String company;private String degree;public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getCompany() {return company;}public void setCompany(String company) {this.company = company;}public String getDegree() {return degree;}public void setDegree(String degree) {this.degree = degree;}}

    讀取指定文件

    資源目錄下建立config/db-config.properties:

    db.username=root

    db.password=123456

    @PropertySource+@Value注解讀取方式

    @Component@PropertySource(value = { "config/db-config.properties" })public class DBConfig1 {@Value("${db.username}")private String username;@Value("${db.password}")private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

    注意:@PropertySource不支持yml文件讀取。

    @PropertySource+@ConfigurationProperties注解讀取方式

    @Component@ConfigurationProperties(prefix = "db")@PropertySource(value = { "config/db-config.properties" })public class DBConfig2 {private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}}

    Environment讀取方式

    以上所有加載出來的配置都可以通過Environment注入獲取到。

    @Autowiredprivate Environment env;// 獲取參數(shù)String getProperty(String key);

    總結:從以上示例來看,Spring Boot可以通過@PropertySource,@Value,@Environment,@ConfigurationProperties來綁定變量。

    12、Spring Boot自動配置原理

    ① SpringBoot啟動的時候加載主配置類,開啟了自動配置功能@EnableAutoConfiguration。

    ② @EnableAutoConfiguration的作用是利用AutoConfigurationImportSelector給容器中導入一些組件。

    ③ 可以查看public String[] selectImports(AnnotationMetadata annotationMetadata)方法的內容。

    ④ 通過protected List getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes)獲取候選的配置,這個是掃描所有jar包類路徑下"META-INF/spring.factories";

    ⑤ 然后把掃描到的這些文件包裝成Properties對象。

    ⑥ 從properties中獲取到EnableAutoConfiguration.class類名對應的值,然后把他們添加在容器中。

    ⑦ 整個過程就是將類路徑下"META-INF/spring.factories"里面配置的所有EnableAutoConfiguration的值加入到 容器中。

    ⑧ 每一個這樣XXAutoConfiguration類都是容器中的一個組件都加入到容器中,用他們來做自動配置。

    每一個自動配置類進行自動配置功能,以HttpEncodingAutoConfiguration為例解釋自動配置原理

    ⑨根據(jù)當前不同的條件判斷,決定這個配置是否生效。

    13、Spring Boot中的starter

    ? 首先,這個 Starter 并非什么新的技術點,基本上還是基于 Spring 已有功能來實現(xiàn)的。首先它提供了一個自動化配置類,一般命名為 XXXAutoConfiguration ,在這個配置類中通過條件注解來決定一個配置是否生效(條件注解就是 Spring 中原本就有的),然后它還會提供一系列的默認配置,也允許開發(fā)者根據(jù)實際情況自定義相關配置,然后通過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正因為如此,很多第三方框架,我們只需要引入依賴就可以直接使用了。 當然,開發(fā)者也可以自定義 Starter,自定義 Starter 可以參考:徒手擼一個 Spring Boot 中的 Starter ,解密自動化配置黑魔法!

    14、Spring Boot跨域問題

    ? 跨域可以在前端通過 JSONP 來解決,但是 JSONP 只可以發(fā)送 GET 請求,無法發(fā)送其他類型的請求,在 RESTful 風格的應用中,就顯得非常雞肋,因此我們推薦在后端通過 (CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案并非 Spring Boot 特有的,在傳統(tǒng)的 SSM 框架中,就可以通過 CORS 來解決跨域問題,只不過之前我們是在 XML 文件中配置 CORS ,現(xiàn)在則是通過 @CrossOrigin 注解來解決跨域問題。關于 CORS ,小伙伴們可以參考:Spring Boot 中通過 CORS 解決跨域問題

    15、Spring Boot定時任務

    ? 使用spring boot創(chuàng)建定時任務主要有以下三種創(chuàng)建方式:

    ? 一、基于注解@Scheduled

    ? 默認為單線程,開啟多個任務時,任務的執(zhí)行時機會受上一個任務執(zhí)行時 間的影響。

    ? ① 創(chuàng)建定時器

    @Configuration //1.主要用于標記配置類,兼?zhèn)銫omponent的效果。 @EnableScheduling // 2.開啟定時任務 public class SaticScheduleTask {//3.添加定時任務@Scheduled(cron = "0/5 * * * * ?")//或直接指定時間間隔,例如:5秒//@Scheduled(fixedRate=5000)private void configureTasks() {System.err.println("執(zhí)行靜態(tài)定時任務時間: " + LocalDateTime.now());} }

    ②啟動測試

    ? 顯然,使用@Scheduled 注解很方便,但缺點是當我們調整了執(zhí)行周期的時候,需要重啟應用才能生效,這多少有些不方便。為了達到實時生效的效果,可以使用接口來完成定時任務。

    ? 二、基于接口(SchedulingConfigurer)

    ? 1、導入依賴包:

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.0.4.RELEASE</version></parent><dependencies><dependency><!--添加Web依賴 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><!--添加MySql依賴 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><!--添加Mybatis依賴 配置mybatis的一些初始化的東西--><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><dependency><!-- 添加mybatis依賴 --><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version><scope>compile</scope></dependency></dependencies>

    ? 2、添加數(shù)據(jù)庫記錄

    開啟本地數(shù)據(jù)庫mysql,隨便打開查詢窗口,然后執(zhí)行腳本內容,代碼如下:

    DROP DATABASE IF EXISTS `socks`; CREATE DATABASE `socks`; USE `SOCKS`; DROP TABLE IF EXISTS `cron`; CREATE TABLE `cron` (`cron_id` varchar(30) NOT NULL PRIMARY KEY,`cron` varchar(30) NOT NULL ); INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

    然后在項目中的application.yml添加數(shù)據(jù)源:

    spring:datasource:url: jdbc:mysql://localhost:3306/socksusername: rootpassword: 123456

    3、創(chuàng)建定時器

    ? 數(shù)據(jù)庫準備好數(shù)據(jù)之后,我們編寫定時任務,注意這里添加的是TriggerTask,目的是循環(huán)讀取我們在數(shù)據(jù)庫設置好的執(zhí)行周期,以及執(zhí)行相關定時任務的內容。

    具體代碼如下:

    @Configuration //1.主要用于標記配置類,兼?zhèn)銫omponent的效果。 @EnableScheduling // 2.開啟定時任務 public class DynamicScheduleTask implements SchedulingConfigurer {@Mapperpublic interface CronMapper {@Select("select cron from cron limit 1")public String getCron();}@Autowired //注入mapper@SuppressWarnings("all")CronMapper cronMapper;/*** 執(zhí)行定時任務.*/@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(//1.添加任務內容(Runnable)() -> System.out.println("執(zhí)行動態(tài)定時任務: " + LocalDateTime.now().toLocalTime()),//2.設置執(zhí)行周期(Trigger)triggerContext -> {//2.1 從數(shù)據(jù)庫獲取執(zhí)行周期String cron = cronMapper.getCron();//2.2 合法性校驗.if (StringUtils.isEmpty(cron)) {// Omitted Code ..}//2.3 返回執(zhí)行周期(Date)return new CronTrigger(cron).nextExecutionTime(triggerContext);});}}

    4、啟動測試

    啟動應用后,查看控制臺,打印時間是我們預期的每10秒一次:

    然后打開Navicat ,將執(zhí)行周期修改為每6秒執(zhí)行一次,如圖:

    查看控制臺,發(fā)現(xiàn)執(zhí)行周期已經(jīng)改變,并且不需要我們重啟應用,十分方便。如圖:

    注意: 如果在數(shù)據(jù)庫修改時格式出現(xiàn)錯誤,則定時任務會停止,即使重新修改正確;此時只能重新啟動項目才能恢復。

    三、基于注解設定多線程定時任務

    1、創(chuàng)建多線程定時任務

    //@Component注解用于對那些比較中立的類進行注釋; //相對與在持久層、業(yè)務層和控制層分別采用 @Repository、@Service 和 @Controller 對分層中的類進行注釋 @Component @EnableScheduling // 1.開啟定時任務 @EnableAsync // 2.開啟多線程 public class MultithreadScheduleTask {@Async@Scheduled(fixedDelay = 1000) //間隔1秒public void first() throws InterruptedException {System.out.println("第一個定時任務開始 : " + LocalDateTime.now().toLocalTime() + "rn線程 : " + Thread.currentThread().getName());System.out.println();Thread.sleep(1000 * 10);}@Async@Scheduled(fixedDelay = 2000)public void second() {System.out.println("第二個定時任務開始 : " + LocalDateTime.now().toLocalTime() + "rn線程 : " + Thread.currentThread().getName());System.out.println();}}

    2、啟動測試查看控制臺

    從控制臺可以看出,第一個定時任務和第二個定時任務互不影響;

    并且,由于開啟了多線程,第一個任務的執(zhí)行時間也不受其本身執(zhí)行時間的限制,所以需要注意可能會出現(xiàn)重復操作導致數(shù)據(jù)異常

    16、Spring Boot 全局異常處理

    1、基于@ControllerAdvice注解的Controller層

    創(chuàng)建 MyControllerAdvice,并添加 @ControllerAdvice注解。

    package com.shsxt.demo.controller;import org.springframework.ui.Model; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.Map;/*** controller 增強器* @author sam* @since 2017/7/17*/ @ControllerAdvice public class MyControllerAdvice {/*** 應用到所有@RequestMapping注解方法,在其執(zhí)行之前初始化數(shù)據(jù)綁定器* @param binder*/@InitBinderpublic void initBinder(WebDataBinder binder) {}/*** 把值綁定到Model中,使全局@RequestMapping可以獲取到該值* @param model*/@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("author", "Magical Sam");}/*** 全局異常捕捉處理* @param ex* @return*/@ResponseBody@ExceptionHandler(value = Exception.class)public Map errorHandler(Exception ex) {Map map = new HashMap();map.put("code", 100);map.put("msg", ex.getMessage());return map;}}

    啟動應用后,被 @ExceptionHandler、@InitBinder、@ModelAttribute 注解的方法,都會作用在 被 @RequestMapping 注解的方法上。

    @ModelAttribute:在Model上設置的值,對于所有被 @RequestMapping 注解的方法中,都可以通過 ModelMap 獲取,如下:

    @RequestMapping("/home") public String home(ModelMap modelMap) {System.out.println(modelMap.get("author")); }//或者 通過@ModelAttribute獲取@RequestMapping("/home") public String home(@ModelAttribute("author") String author) {System.out.println(author); }

    @ExceptionHandler 攔截了異常,我們可以通過該注解實現(xiàn)自定義異常處理。其中,@ExceptionHandler 配置的 value 指定需要攔截的異常類型,上面攔截了 Exception.class 這種異常。

    2、基于Springboot自身的全局異常統(tǒng)一處理,主要是實現(xiàn)ErrorController接口或者繼承AbstractErrorController抽象類或者繼承BasicErrorController類

    Controller層代碼:

    @Controller @RequestMapping(value = "error") @EnableConfigurationProperties({ServerProperties.class}) public class ExceptionController implements ErrorController {private ErrorAttributes errorAttributes;@Autowiredprivate ServerProperties serverProperties;/*** 初始化ExceptionController* @param errorAttributes*/@Autowiredpublic ExceptionController(ErrorAttributes errorAttributes) {Assert.notNull(errorAttributes, "ErrorAttributes must not be null");this.errorAttributes = errorAttributes;}/*** 定義404的ModelAndView* @param request* @param response* @return*/@RequestMapping(produces = "text/html",value = "404")public ModelAndView errorHtml404(HttpServletRequest request,HttpServletResponse response) {response.setStatus(getStatus(request).value());Map<String, Object> model = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));return new ModelAndView("error/404", model);}/*** 定義404的JSON數(shù)據(jù)* @param request* @return*/@RequestMapping(value = "404")@ResponseBodypublic ResponseEntity<Map<String, Object>> error404(HttpServletRequest request) {Map<String, Object> body = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));HttpStatus status = getStatus(request);return new ResponseEntity<Map<String, Object>>(body, status);}/*** 定義500的ModelAndView* @param request* @param response* @return*/@RequestMapping(produces = "text/html",value = "500")public ModelAndView errorHtml500(HttpServletRequest request,HttpServletResponse response) {response.setStatus(getStatus(request).value());Map<String, Object> model = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));return new ModelAndView("error/500", model);}/*** 定義500的錯誤JSON信息* @param request* @return*/@RequestMapping(value = "500")@ResponseBodypublic ResponseEntity<Map<String, Object>> error500(HttpServletRequest request) {Map<String, Object> body = getErrorAttributes(request,isIncludeStackTrace(request, MediaType.TEXT_HTML));HttpStatus status = getStatus(request);return new ResponseEntity<Map<String, Object>>(body, status);}/*** Determine if the stacktrace attribute should be included.* @param request the source request* @param produces the media type produced (or {@code MediaType.ALL})* @return if the stacktrace attribute should be included*/protected boolean isIncludeStackTrace(HttpServletRequest request,MediaType produces) {ErrorProperties.IncludeStacktrace include = this.serverProperties.getError().getIncludeStacktrace();if (include == ErrorProperties.IncludeStacktrace.ALWAYS) {return true;}if (include == ErrorProperties.IncludeStacktrace.ON_TRACE_PARAM) {return getTraceParameter(request);}return false;}/*** 獲取錯誤的信息* @param request* @param includeStackTrace* @return*/private Map<String, Object> getErrorAttributes(HttpServletRequest request,boolean includeStackTrace) {RequestAttributes requestAttributes = new ServletRequestAttributes(request);return this.errorAttributes.getErrorAttributes(requestAttributes,includeStackTrace);}/*** 是否包含trace* @param request* @return*/private boolean getTraceParameter(HttpServletRequest request) {String parameter = request.getParameter("trace");if (parameter == null) {return false;}return !"false".equals(parameter.toLowerCase());}/*** 獲取錯誤編碼* @param request* @return*/private HttpStatus getStatus(HttpServletRequest request) {Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");if (statusCode == null) {return HttpStatus.INTERNAL_SERVER_ERROR;}try {return HttpStatus.valueOf(statusCode);}catch (Exception ex) {return HttpStatus.INTERNAL_SERVER_ERROR;}}/*** 實現(xiàn)錯誤路徑,暫時無用* @see ExceptionMvcAutoConfiguration#containerCustomizer()* @return*/@Overridepublic String getErrorPath() {return "";}}

    3、基于AOP也可以實現(xiàn)異常的全局處理

    在執(zhí)行切點中配置的路徑中的方法有異常時,可以被捕獲到

    建議使用該方式:選用AOP方式主要是因為AOP不只可以做全局異常統(tǒng)一處理還可以統(tǒng)一打印接口請求入?yún)⒑头祷亟Y果日志,打印接口訪問性能日志,處理sql注入攻擊以及處理入?yún)⑻厥庾址葐栴}

    import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.google.common.base.Stopwatch; import com.google.common.collect.Lists; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component;import javax.annotation.Resource; import java.util.concurrent.TimeUnit;/*** @Author: smy* @Description: 調用接口打印性能日志以及接口報錯之后記錄錯誤日志* @Date: 2018/9/20* @Time: 15:16*/ @Component @Aspect public class InterfaceRequestErrrorAndPerformanceLog {public static final Logger logger = LoggerFactory.getLogger(InterfaceRequestErrrorAndPerformanceLog.class);@Value("${dc.log.bad.value:3000}")private int performanceBadValue;@Resourceprivate RabbitMQService rabbitMQService;@Resourceprivate InterfaceErrorService interfaceErrorService;@Pointcut("execution(* test.test.test.test.test.controller.*.*.*(..))")public void pointCut(){}@Around("pointCut()")public APIResponse handleControllerMethod(ProceedingJoinPoint pjp) throws Throwable{Stopwatch stopwatch = Stopwatch.createStarted();APIResponse apiResponse;try {logger.info("執(zhí)行Controller開始: " + pjp.getSignature() + " 參數(shù):" + Lists.newArrayList(pjp.getArgs()).toString());//處理入?yún)⑻厥庾址蛃ql注入攻擊checkRequestParam(pjp);//執(zhí)行訪問接口操作apiResponse = (APIResponse) pjp.proceed(pjp.getArgs());try{logger.info("執(zhí)行Controller結束: " + pjp.getSignature() + ", 返回值:" + JSONObject.toJSONString(apiResponse));//此處將日志打印放入try-catch是因為項目中有些對象實體bean過于復雜,導致序列化為json的時候報錯,但是此處報錯并不影響主要功能使用,只是返回結果日志沒有打印,所以catch中也不做拋出異常處理}catch (Exception ex){logger.error(pjp.getSignature()+" 接口記錄返回結果失敗!,原因為:{}",ex.getMessage());}Long consumeTime = stopwatch.stop().elapsed(TimeUnit.MILLISECONDS);logger.info("耗時:" + consumeTime + "(毫秒).");//當接口請求時間大于3秒時,標記為異常調用時間,并記錄入庫if(consumeTime > performanceBadValue){DcPerformanceEntity dcPerformanceEntity = new DcPerformanceEntity();dcPerformanceEntity.setInterfaceName(pjp.getSignature().toString());dcPerformanceEntity.setRequestParam(Lists.newArrayList(pjp.getArgs()).toString());dcPerformanceEntity.setConsumeTime(consumeTime + "毫秒");RabbitMQMessageTarget mqTarget = RabbitMQMessageTarget.createFanoutTarget(ProjectConstants.DC_KEY_EXCHANGE_PERFORMANCE, new String[] { ProjectConstants.DC_KEY_QUEUE_PERFORMANCE});rabbitMQService.send(mqTarget, JSON.toJSONString(dcPerformanceEntity));}} catch (Exception throwable) {apiResponse = handlerException(pjp, throwable);}return apiResponse;}/*** @Author: smy* @Description: 處理接口調用異常* @Date: 15:13 2018/10/25*/private APIResponse handlerException(ProceedingJoinPoint pjp, Throwable e) {APIResponse apiResponse;if(e.getClass().isAssignableFrom(ProjectException.class) ){//ProjectException為自定義異常類,項目中Controller層會把所有的異常都catch掉,并手工封裝成ProjectException拋出來,這樣做的目的是ProjectException會記錄拋出異常接口的路徑,名稱以及請求參數(shù)等等,有助于錯誤排查ProjectException projectException = (ProjectException)e;logger.error("捕獲到ProjectException異常:",JSONObject.toJSONString(projectException.getDcErrorEntity()));RabbitMQMessageTarget mqTarget = RabbitMQMessageTarget.createFanoutTarget(ProjectConstants.DC_KEY_EXCHANGE_INTERFACE_ERROR, new String[] { ProjectConstants.DC_KEY_QUEUE_INTERFACE_ERROR});rabbitMQService.send(mqTarget, JSON.toJSONString(dataCenterException.getDcErrorEntity()));apiResponse = new APIResponse(APIResponse.FAIL,null,projectException.getDcErrorEntity().getErrorMessage());} else if (e instanceof RuntimeException) {logger.error("RuntimeException{方法:" + pjp.getSignature() + ", 參數(shù):" + pjp.getArgs() + ",異常:" + e.getMessage() + "}", e);apiResponse = new APIResponse(APIResponse.FAIL,null,e.getMessage());} else {logger.error("異常{方法:" + pjp.getSignature() + ", 參數(shù):" + pjp.getArgs() + ",異常:" + e.getMessage() + "}", e);apiResponse = new APIResponse(APIResponse.FAIL,null,e.getMessage());}return apiResponse;}/*** @Author: gmy* @Description: 處理入?yún)⑻厥庾址蛃ql注入攻擊* @Date: 15:37 2018/10/25*/private void checkRequestParam(ProceedingJoinPoint pjp){String str = String.valueOf(pjp.getArgs());if (!IllegalStrFilterUtil.sqlStrFilter(str)) {logger.info("訪問接口:" + pjp.getSignature() + ",輸入?yún)?shù)存在SQL注入風險!參數(shù)為:" + Lists.newArrayList(pjp.getArgs()).toString());DcErrorEntity dcErrorEntity = interfaceErrorService.processDcErrorEntity(pjp.getSignature() + "",Lists.newArrayList(pjp.getArgs()).toString(),"輸入?yún)?shù)存在SQL注入風險!");throw new DataCenterException(dcErrorEntity);}if (!IllegalStrFilterUtil.isIllegalStr(str)) {logger.info("訪問接口:" + pjp.getSignature() + ",輸入?yún)?shù)含有非法字符!,參數(shù)為:" + Lists.newArrayList(pjp.getArgs()).toString());DcErrorEntity dcErrorEntity = interfaceErrorService.processDcErrorEntity(pjp.getSignature() + "",Lists.newArrayList(pjp.getArgs()).toString(),"輸入?yún)?shù)含有非法字符!");throw new DataCenterException(dcErrorEntity);}}}

    IllegalStrFilterUtil代碼:

    import org.slf4j.LoggerFactory;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** @Author: gmy* @Description: 特殊字符檢測工具(防止傳入非法字符和sql注入攻擊)* @Date: 2018/10/25* @Time: 15:08*/ public class IllegalStrFilterUtil {private static final org.slf4j.Logger Logger = LoggerFactory.getLogger(IllegalStrFilterUtil.class);private static final String REGX = "!|!|@|◎|#|#|($)|¥|%|%|(^)|……|(&)|※|(*)|×|(()|(|())|)|_|——|(+)|+|(|)|§ ";/*** 對常見的sql注入攻擊進行攔截** @param sInput* @return* true 表示參數(shù)不存在SQL注入風險* false 表示參數(shù)存在SQL注入風險*/public static Boolean sqlStrFilter(String sInput) {if (sInput == null || sInput.trim().length() == 0) {return false;}sInput = sInput.toUpperCase();if (sInput.indexOf("DELETE") >= 0 || sInput.indexOf("ASCII") >= 0 || sInput.indexOf("UPDATE") >= 0 || sInput.indexOf("SELECT") >= 0|| sInput.indexOf("'") >= 0 || sInput.indexOf("SUBSTR(") >= 0 || sInput.indexOf("COUNT(") >= 0 || sInput.indexOf(" OR ") >= 0|| sInput.indexOf(" AND ") >= 0 || sInput.indexOf("DROP") >= 0 || sInput.indexOf("EXECUTE") >= 0 || sInput.indexOf("EXEC") >= 0|| sInput.indexOf("TRUNCATE") >= 0 || sInput.indexOf("INTO") >= 0 || sInput.indexOf("DECLARE") >= 0 || sInput.indexOf("MASTER") >= 0) {Logger.error("該參數(shù)怎么SQL注入風險:sInput=" + sInput);return false;}Logger.info("通過sql檢測");return true;}/*** 對非法字符進行檢測** @param sInput* @return* true 表示參數(shù)不包含非法字符* false 表示參數(shù)包含非法字符*/public static Boolean isIllegalStr(String sInput) {if (sInput == null || sInput.trim().length() == 0) {return false;}sInput = sInput.trim();Pattern compile = Pattern.compile(REGX, Pattern.CASE_INSENSITIVE);Matcher matcher = compile.matcher(sInput);Logger.info("通過字符串檢測");return matcher.find();} }

    17、spring-boot-starter-parent 的作用

  • 定義了 Java 編譯版本為 1.8 。
  • 使用 UTF-8 格式編碼。
  • 繼承自 spring-boot-dependencies,這個里邊定義了依賴的版本,也正是因為繼承了這個依賴,所以我們在寫依賴時才不需要寫版本號。
  • 執(zhí)行打包操作的配置。
  • 自動化的資源過濾。
  • 自動化的插件配置。
  • 針對 application.properties 和 application.yml 的資源過濾,包括通過 profile 定義的不同環(huán)境的配置文件,例如 application-dev.properties 和 application-dev.yml。
  • 總結

    以上是生活随笔為你收集整理的框架controller找不到_SpingBoot框架知识详解的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

    在线国产一区二区三区 | 色多多在线观看 | 日韩电影在线观看一区二区三区 | 在线观看免费国产小视频 | 欧洲精品二区 | 最近中文字幕免费av | 五月天婷婷免费视频 | 欧美精品久久99 | 91桃色在线观看视频 | 成人毛片在线视频 | 国产免费观看视频 | 麻豆视频www | 久久精品免费看 | 欧美日韩中文在线观看 | 免费国产在线精品 | 国产手机av | 婷婷色在线观看 | 青草视频在线播放 | 日韩精品一区电影 | 久久99在线视频 | 精品久久中文 | 一区av在线播放 | 免费国产亚洲视频 | 四虎4hu永久免费 | 国产精品一区二区精品视频免费看 | 中文字幕一区二区三区乱码不卡 | 欧美性极品xxxx娇小 | 国产精品久久久久久久久久尿 | 免费在线一区二区 | av免费电影在线观看 | 国产免费久久av | 国产69久久久欧美一级 | 久久久久99精品国产片 | 亚洲精品久久久蜜桃直播 | 在线观看免费福利 | 美女久久99 | 亚洲激情综合 | 狠狠的干 | 亚洲专区免费观看 | 国产专区精品视频 | 成人久久久久久久久久 | www.久久久.com | 日日插日日干 | 在线天堂8√ | 成人久久18免费网站图片 | 精品福利在线观看 | 91视频午夜| 日日干激情五月 | 精品久久久久久亚洲综合网站 | 亚洲精品视频免费在线观看 | 日韩一区在线播放 | 亚洲国产日韩一区 | 天天亚洲 | 国产97在线看 | 黄色小说视频网站 | 亚洲爱爱视频 | 91精品对白一区国产伦 | 69av免费视频| 婷婷激情5月天 | 五月丁香| 久久精品免费播放 | 天天夜夜亚洲 | av一本久道久久波多野结衣 | 欧美激情精品久久久久久免费印度 | 一区二区三区免费在线观看视频 | 久久精品久久久久 | 日韩中文在线视频 | 久久久亚洲影院 | 免费在线观看av | 日韩在线高清免费视频 | 深爱激情开心 | 在线观看91网站 | 色香蕉网 | 日韩精品中文字幕在线不卡尤物 | 久久永久视频 | 国产精品视频免费在线观看 | 日韩精品在线免费播放 | 国产伦精品一区二区三区高清 | 久久久久久国产精品 | 日韩在线观看三区 | 国产一区久久久 | 国产小视频精品 | 国产日韩中文字幕在线 | 日本精品久久久久久 | 免费看在线看www777 | 日韩在线三区 | 久久99国产精品免费网站 | 欧美黑人性猛交 | 久久久久久高潮国产精品视 | 肉色欧美久久久久久久免费看 | 国产黄a三级三级三级三级三级 | 免费看国产精品 | 国产亚洲精品bv在线观看 | 一区二区伦理 | 香蕉视频4aa | 91 在线视频 | 91日韩国产| 久久曰视频| 中文字幕乱偷在线 | 中文字幕专区高清在线观看 | 亚洲人成网站精品片在线观看 | 一级黄色大片 | 日韩av高清在线观看 | 婷婷精品国产一区二区三区日韩 | 久操免费视频 | 婷婷在线精品视频 | 91中文字幕在线 | 国产亚洲精品久久久网站好莱 | 日韩一区二区三免费高清在线观看 | 99热这里只有精品久久 | 国产精品一区二区三区观看 | 国产亚洲人| 香蕉97视频观看在线观看 | 在线你懂| 四虎成人免费影院 | 亚洲国产视频在线 | 字幕网资源站中文字幕 | 日韩av电影网站在线观看 | 国产精品成人自产拍在线观看 | 成人看片 | 精品久久久久久一区二区里番 | 91在线亚洲 | 欧洲色吧| 成人欧美亚洲 | 精品国产一区二区三区久久久久久 | 丁香av在线 | 精品国产a | 欧美日韩免费看 | 9999免费视频 | 在线观看日韩一区 | avsex| 三级在线播放视频 | 久久在线影院 | 国产亚洲精品成人av久久影院 | 国产香蕉视频在线观看 | 日韩综合视频在线观看 | 成年人黄色免费视频 | 99久久精品久久久久久动态片 | 免费黄色一区 | 射久久久| 中文字幕制服丝袜av久久 | 99精品一级欧美片免费播放 | 日本天天操 | 成年人在线免费看视频 | 日日综合 | 在线观看黄网站 | 久久久久9999亚洲精品 | 天天色天天综合 | 国产.精品.日韩.另类.中文.在线.播放 | www.五月天| 综合精品在线 | 婷婷五综合 | 99久久精品免费看国产四区 | 免费黄色av.| 黄色毛片在线 | 成人中心免费视频 | 99久久久国产精品免费99 | 日本中文字幕在线播放 | 国产大陆亚洲精品国产 | 高清av在线 | 久久99热国产 | 免费看的黄色网 | 欧美一区二区三区激情视频 | 免费看在线看www777 | 久草免费在线观看 | 懂色av一区二区三区蜜臀 | 久久久久国产一区二区 | 91成人免费视频 | a精品视频 | 久久er99热精品一区二区三区 | 又色又爽又黄高潮的免费视频 | www日日夜夜 | 日韩在线国产精品 | 最新高清无码专区 | 69久久久久久久 | 99久久国产免费,99久久国产免费大片 | 久久国产美女 | 久久夜色精品国产欧美乱 | 天天做日日做天天爽视频免费 | 在线观看一级片 | 日日干夜夜干 | 精品国产一区二区三区久久久久久 | 91在线免费播放视频 | 日韩三级视频 | 丝袜+亚洲+另类+欧美+变态 | 国产精品久久一区二区三区不卡 | 国产伦精品一区二区三区免费 | 日韩 精品 一区 国产 麻豆 | 中文字幕高清在线 | 五月开心婷婷网 | 午夜精品久久久久久久99水蜜桃 | 国产精品一区二区av日韩在线 | 天天色天天射天天操 | 五月天六月婷婷 | 一区二区三区电影 | 国产99久久久精品 | 在线免费av播放 | 性色在线视频 | 国产专区第一页 | 91精品免费在线观看 | 免费av成人在线 | 久久a视频| 日韩精品久久一区二区 | 日韩av免费一区二区 | 久久综合九色综合欧美狠狠 | 成人黄视频| 国产精品99久久久久久久久 | 久久精品99国产精品日本 | 在线观看中文字幕dvd播放 | 欧美国产不卡 | 在线91视频 | 久久精品久久99精品久久 | 国产精品夜夜夜一区二区三区尤 | 能在线看的av | 欧美 高跟鞋交 xxxxhd | 精品国产精品一区二区夜夜嗨 | 国产精彩在线视频 | 四虎国产免费 | 久久亚洲美女 | 亚洲精品乱码久久久久久 | 国产精品涩涩屋www在线观看 | 午夜123 | 香蕉在线观看 | 一区二区三区精品久久久 | av免费看在线 | 国产日韩在线看 | 麻豆影视在线观看 | 亚洲国产欧美一区二区三区丁香婷 | 久久免费国产 | 亚洲视频观看 | 激情久久久 | 国产又粗又猛又色又黄网站 | 国产高清视频色在线www | 成人一级电影在线观看 | 国产91精品在线播放 | 九9热这里真品2 | a视频免费看 | 久久综合免费 | 国产精品99蜜臀久久不卡二区 | 欧美精品成人在线 | 亚洲一区二区麻豆 | jizz18欧美18| 国产美女无遮挡永久免费 | 91视频久久久久久 | 日韩视频免费 | 免费看在线看www777 | 黄色午夜网站 | 国产欧美日韩精品一区二区免费 | 精品a级片 | 天天干夜夜想 | 久久视频99 | 狠狠色丁香婷婷综合橹88 | 亚洲精品中文在线 | 高清精品视频 | 一本—道久久a久久精品蜜桃 | 一区二区中文字幕在线播放 | 在线你懂的视频 | 中文字幕在线视频网站 | 91精选 | 天天躁日日躁狠狠躁av中文 | 麻花豆传媒mv在线观看网站 | 国产精品久久久777 成人手机在线视频 | 中文字幕超清在线免费 | 国产亚洲va综合人人澡精品 | 亚洲午夜久久久久久久久久久 | 国产精品高潮呻吟久久av无 | 国产精品wwwwww| 色天天久久 | 欧美三人交 | 免费视频久久久久久久 | 国产黄色资源 | 在线香蕉视频 | 九九九九九九精品任你躁 | 国产又粗又猛又爽又黄的视频先 | 黄色免费视频在线观看 | 亚洲欧洲一区二区在线观看 | 久久久麻豆精品一区二区 | 搡bbbb搡bbb视频| 日b视频在线观看网址 | 国产亚洲精品福利 | 亚洲女欲精品久久久久久久18 | 久久婷婷丁香 | 国产精品大片免费观看 | 欧美精品一区二区在线播放 | 国产精品久久久区三区天天噜 | 国产91精品一区二区麻豆亚洲 | 亚洲精品成人 | 国产伦理一区 | 久久狠狠亚洲综合 | 精品国产伦一区二区三区观看方式 | 特黄免费av | 免费看的视频 | 国产999在线观看 | 亚洲国产精品资源 | 日韩色在线观看 | 韩国精品一区二区三区六区色诱 | 国产在线国偷精品产拍免费yy | 97超碰总站 | 欧美日韩精品免费观看 | 日韩精品中文字幕在线 | 亚洲国产免费网站 | 精品国产免费一区二区三区五区 | 五月花激情 | 免费黄色av | 国产精品毛片一区视频播不卡 | 久久图| 国产精品va最新国产精品视频 | 99久久久| 成人免费视频视频在线观看 免费 | 99日韩精品 | 天天综合网在线观看 | 国产精品成人自产拍在线观看 | 久久全国免费视频 | 中文字幕你懂的 | 美女黄色网在线播放 | 国产精品久久久久久99 | 国产在线无 | 久久精品国产免费看久久精品 | 丁香激情网 | 91精品日韩| a在线免费 | 久久精品视频中文字幕 | 91视频网址入口 | 福利电影久久 | 久久tv| 一区二区三区在线不卡 | 免费手机黄色网址 | 香蕉在线视频观看 | 国产小视频在线免费观看 | 国产福利不卡视频 | 天堂av在线7 | www.黄色在线| 在线 你懂 | 国产精品久久久久国产精品日日 | 99麻豆视频 | 久久综合九色综合久久久精品综合 | 精品99免费视频 | 青青河边草观看完整版高清 | 激情五月五月婷婷 | 日韩小视频网站 | 久久久久亚洲天堂 | 狠狠色丁香婷婷综合最新地址 | 婷婷久久精品 | 精品免费视频 | 999视频在线播放 | 97在线超碰 | 亚洲综合在线发布 | 亚洲成av人片在线观看 | 精品主播网红福利资源观看 | 91爱看片| 国产a级精品| 亚洲视频中文 | 久久久18 | 国产成人综合在线观看 | 婷婷色在线播放 | 色九九在线 | 日韩大片免费在线观看 | 国内丰满少妇猛烈精品播放 | 在线 视频 一区二区 | 日韩在线观看视频网站 | 成人久久影院 | 日韩成人在线一区二区 | 国产高清永久免费 | 国产精品久久久久久久久毛片 | 日韩av手机在线观看 | 日韩精品久久久久久 | 国产精品免费观看久久 | 国产剧情一区二区在线观看 | 亚洲视频精选 | 黄在线免费观看 | 国产精品一区在线 | 日韩久久一区 | 国产日韩欧美精品在线观看 | 欧美在线观看视频一区二区三区 | 欧美福利视频一区 | 丁香激情视频 | www.com.黄 | 国产精品一区二区三区四区在线观看 | 亚洲一区视频免费观看 | 国产91影院| 中文字幕免费高清在线 | 亚洲国产欧美在线人成大黄瓜 | 国产精品久久久久高潮 | 精品国产一区二区三区久久久蜜臀 | 在线亚洲天堂网 | 国语黄色片 | 久久躁日日躁aaaaxxxx | 久久精品一区二区三区视频 | 91香蕉视频色版 | 久一久久 | 最新av网站在线观看 | 亚洲综合成人婷婷小说 | 操操操日日| www.婷婷色 | 国产区精品 | 国产视频久 | 男女拍拍免费视频 | 国产123区在线观看 国产精品麻豆91 | 欧美成人猛片 | 久久婷婷一区二区三区 | av免费在线观 | 国产一区二区在线播放 | 国产手机在线视频 | 狠狠综合网| 午夜精品视频免费在线观看 | 精品一二 | 亚洲精品在线一区二区三区 | 在线观看国产福利片 | 国产精品欧美在线 | 91久久久久久久一区二区 | 日韩专区中文字幕 | 天天干亚洲 | 日韩综合第一页 | 国产亚洲精品中文字幕 | 中文字幕在线观看1 | 国产精品免费在线播放 | 午夜精品电影 | 亚洲伦理一区 | 97成人免费视频 | 亚洲专区免费观看 | 99久久久久久 | 国产成人精品一区在线 | 午夜男人影院 | 奇米网777| 99视频免费观看 | 国内精品久久久久久久久久 | 亚洲五月六月 | 欧美日韩在线观看一区二区三区 | 99精品在线视频播放 | 久久伊人操| 毛片随便看 | 久草国产精品 | 正在播放 国产精品 | 中文字幕亚洲精品日韩 | 色噜噜日韩精品一区二区三区视频 | 97电影网站 | 亚洲动漫在线观看 | a天堂免费| 日韩在线观看视频网站 | 久久人人添人人爽添人人88v | 日韩免费一二三区 | 成人免费亚洲 | 国产亚洲情侣一区二区无 | 欧美色888 | 在线精品视频免费播放 | 正在播放亚洲精品 | 日本久久久久久 | 九色91在线 | 中文字幕在线免费观看 | 日韩免费在线看 | 国产亚洲免费观看 | 91成人在线观看高潮 | 在线成人免费 | 黄色官网在线观看 | 99精品视频在线观看播放 | 国产精品资源在线观看 | 视频在线观看入口黄最新永久免费国产 | 国产精品第7页 | 91桃色免费视频 | 久久精品电影 | 国产亚洲日本 | 欧美日本一二三 | 欧美精品一区二区三区一线天视频 | 精品国产成人在线影院 | 99精品久久只有精品 | 欧美精品色 | 中日韩欧美精彩视频 | 黄色一集片 | 91精品国产乱码在线观看 | 激情视频免费在线观看 | 日韩欧美在线一区 | 欧美另类69 | 日韩精品中文字幕久久臀 | 九九热在线精品视频 | 久久精品麻豆 | 亚洲自拍偷拍色图 | 在线观看免费黄色 | 99精品乱码国产在线观看 | 国产免费亚洲高清 | 操高跟美女 | 久草在线免费看视频 | 免费福利在线观看 | 国产福利91精品 | 91人人网| 日本黄色免费网站 | 欧美a√在线 | 精品国产精品久久 | 国产精品1区2区 | 91亚洲在线 | 高清不卡毛片 | 欧美激情精品久久久久 | 国产天天综合 | 国产精品久久久久9999 | 久久久久久久久久久久99 | 四虎最新入口 | 极品嫩模被强到高潮呻吟91 | 九九在线精品视频 | 黄色大全在线观看 | 久久久91精品国产一区二区三区 | 97超级碰碰碰视频在线观看 | 久久久天天操 | 国产一级一级国产 | 中文在线免费看视频 | 亚洲日日夜夜 | 成人av资源网 | 国产精品99久久久久久人免费 | 国产一级一片免费播放放 | 亚洲精品视频免费看 | 91香蕉国产在线观看软件 | 亚洲视频久久久久 | 91 在线视频| 久久精品综合 | www.五月天婷婷.com | 欧美激情精品久久久久久免费 | 亚洲国产高清在线观看视频 | 天天干夜夜干 | 日韩一二区在线观看 | 成人av资源在线 | 天天操天天操天天操天天操天天操 | 中文字幕之中文字幕 | 日韩一区二区久久 | 97成人资源 | 日韩色综合 | 91精品国产乱码 | 欧美日韩高清一区二区 国产亚洲免费看 | 欧美激情第八页 | 一区在线观看视频 | 国产精品久久久久久久电影 | 四虎免费av| 81精品国产乱码久久久久久 | 国产.精品.日韩.另类.中文.在线.播放 | 天天撸夜夜操 | 欧美精品乱码99久久影院 | 不卡的av中文字幕 | 99久e精品热线免费 99国产精品久久久久久久久久 | 亚洲国产午夜视频 | 久草免费在线视频 | 在线精品在线 | 久久久久综合精品福利啪啪 | 在线国产视频一区 | 日本黄色免费在线 | 91在线看网站 | 色片网站在线观看 | 97视频免费| 国产高清精品在线观看 | 久久www免费人成看片高清 | 99精品国产成人一区二区 | 久久国产露脸精品国产 | 精品久久91 | 国产精品国产三级在线专区 | 精品视频免费在线 | 色是在线视频 | 五月天激情婷婷 | 永久免费精品视频网站 | 成人精品福利 | 日精品在线观看 | 亚洲区精品 | 精品久久久久国产免费第一页 | 日本韩国精品一区二区在线观看 | 91 在线视频播放 | 日韩视频中文字幕在线观看 | 精品在线观看一区二区 | 色香蕉网 | 午夜精品一区二区三区四区 | 国产一区国产精品 | 精品黄色在线 | 日本在线观看一区二区三区 | a电影在线观看 | 天天爱综合 | 久久理伦片 | www久草| 精品亚洲成人 | 精品国产一区二区在线 | 久久夜色精品国产欧美一区麻豆 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 操久 | 天天操天天色综合 | 精品国产成人在线影院 | av福利第一导航 | 98精品国产自产在线观看 | 91视频 - 114av| 欧美性色综合 | 国产精品伦一区二区三区视频 | 国产不卡免费视频 | 免费视频一二三 | 99久久久久国产精品免费 | 97在线免费视频 | 欧美日韩中文在线观看 | 麻豆免费看片 | 久久精品国产亚洲精品2020 | 亚洲精品网站 | 最近中文字幕完整视频高清1 | 国产精品久久中文字幕 | 久草视频在线播放 | 五月婷婷激情六月 | 国产精品欧美久久久久无广告 | 欧美污污视频 | 91成人精品一区在线播放 | 日韩高清免费在线 | 国产精品综合av一区二区国产馆 | 综合久久五月天 | 日韩一区二区三区高清免费看看 | 亚洲综合爱 | 亚州欧美视频 | 国产一区二区高清 | 亚洲涩涩色 | 色视频在线观看免费 | 一区二区在线影院 | 又黄又刺激视频 | 小草av在线播放 | 麻豆综合网| 五月婷婷综合在线 | 美女网站视频一区 | 成人永久免费 | 日韩在线第一区 | 亚洲一区视频免费观看 | 成人久久久电影 | 97色狠狠 | 国产精品18久久久久久不卡孕妇 | 日操操| 国产一二区免费视频 | 日日夜夜精品网站 | 国产免费一区二区三区网站免费 | 国产高清在线永久 | 日本xxxx.com| 天天色婷婷| 99精品视频在线播放观看 | 黄色毛片一级片 | 久久久.com | 欧美在线视频一区二区三区 | 一区二区激情视频 | 精品视频中文字幕 | 国产黄色成人av | 国产精品理论片在线播放 | 69国产盗摄一区二区三区五区 | 91麻豆国产福利在线观看 | 日韩高清网站 | 欧美日韩国产页 | 欧美福利视频 | 欧美激情精品久久久久久免费印度 | 在线影视 一区 二区 三区 | 最新日韩视频在线观看 | 久久久综合色 | 久久一区二区三区超碰国产精品 | 日韩欧美高清不卡 | 91网站观看 | 午夜精品久久一牛影视 | 亚洲婷久久| 国产精品视频免费看 | 天天干天天干天天射 | 亚洲黄色一级电影 | 中文在线免费视频 | 日本最新中文字幕 | 国产91精品一区二区绿帽 | 日韩大片在线看 | 色视频成人在线观看免 | 亚洲成年人免费网站 | 日韩激情小视频 | 国产精品不卡一区 | 97视频入口免费观看 | 国产破处精品 | 伊人五月天.com | 黄色电影小说 | 日韩欧美在线视频一区二区 | 狠狠色丁香久久婷婷综 | 国产专区视频在线 | 欧美日韩在线免费观看 | 热九九精品 | 一区 二区电影免费在线观看 | av中文资源在线 | 免费视频久久久久 | 免费观看av网站 | 成人av一区二区兰花在线播放 | 中文字幕在线观看免费高清电影 | 日韩久久精品 | 黄色免费观看视频 | 国产一区二区高清不卡 | 99爱在线观看 | www五月| 国产午夜精品理论片在线 | 国产亚洲精品电影 | 日韩电影中文字幕 | 91精品久久久久久综合乱菊 | 超碰97在线资源站 | 国产精品美女久久久久久 | 狠狠干天天 | aav在线| 日韩激情久久 | 免费高清无人区完整版 | 精品国产欧美一区二区三区不卡 | 天天插天天射 | 久久综合九色综合97婷婷女人 | 国产91精品一区二区麻豆网站 | 人人爽人人爽人人片av免 | 91视频大全 | 亚洲精品国精品久久99热一 | 午夜免费久久看 | 久久久噜噜噜久久久 | 欧美性色综合网站 | 国产精品久久久久久久久免费 | 日韩视频免费观看高清完整版在线 | 在线电影日韩 | 91网站观看 | 国产精品人成电影在线观看 | 在线观看电影av | 欧美精选一区二区三区 | 国产在线观看污片 | 天天干国产 | 精品福利在线 | 成人在线视频论坛 | 91 中文字幕 | 美女久久久久久久 | 久亚洲精品 | 500部大龄熟乱视频 欧美日本三级 | 国产成人香蕉 | 久久视频这里只有精品 | 午夜视频亚洲 | 国产玖玖精品视频 | 中文字幕日韩无 | 亚洲欧美在线视频免费 | 中文字幕在线观看免费高清完整版 | 人人藻人人澡人人爽 | 精品久久精品久久 | 成人国产网站 | 免费看的黄色的网站 | 51久久夜色精品国产麻豆 | 免费av视屏| 国内精品久久久久影院日本资源 | 久射网| 日韩欧美大片免费观看 | 亚洲久在线 | 亚洲成av人影片在线观看 | 国产精品美女久久久久久久久 | 国产乱对白刺激视频不卡 | 精品一区二区三区电影 | 欧美一区二区视频97 | 一区二区观看 | 久久久精品网 | 国产精品久久久久影院日本 | 91香蕉国产在线观看软件 | 免费福利在线视频 | 久草视频一区 | 免费高清男女打扑克视频 | 国产黄影院色大全免费 | 免费观看www小视频的软件 | 中文字幕在线影院 | 色天天综合久久久久综合片 | 色婷婷精品大在线视频 | 激情在线网址 | 国产婷婷久久 | 日操操| 精品视频999 | 亚洲综合丁香 | 91精品视频一区二区三区 | 国内精品视频在线 | 亚洲精品国产精品乱码不99热 | 亚洲精品美女在线观看 | 亚洲国产99| 亚洲精品免费视频 | 97人人看 | 国产高清在线免费视频 | 国产婷婷在线观看 | 精品国产免费久久 | 碰超在线 | 精品在线免费观看 | 国外成人在线视频网站 | 热久久精品在线 | 国产免费一区二区三区最新 | 一级大片在线观看 | 久久爱影视i| 日韩亚洲在线 | 中文字幕 国产视频 | 美女视频永久黄网站免费观看国产 | 极品久久久久久久 | 九九热av | 91精品国产福利在线观看 | 亚洲精品白浆高清久久久久久 | 国产又黄又爽无遮挡 | 韩国精品福利一区二区三区 | 精品欧美日韩 | 四虎影院在线观看av | 国产亚洲欧美日韩高清 | aaa亚洲精品一二三区 | 在线观看视频一区二区三区 | 国产成人三级三级三级97 | 日韩欧美在线观看 | 成人91在线 | 欧美精品国产综合久久 | 色网站免费在线看 | 日韩av一区二区三区在线观看 | 午夜av色| 日韩大片免费观看 | 成人免费共享视频 | 中文字幕一区二区在线播放 | 黄色一级大片在线免费看产 | 人人天天夜夜 | 国产精品麻豆视频 | av免费看网站| 日韩成人免费观看 | 成人午夜电影在线 | 久久视频在线观看免费 | 国产精品成久久久久 | 中文字幕a∨在线乱码免费看 | 久久色亚洲 | 色婷婷狠狠五月综合天色拍 | 在线成人免费av | 少妇自拍av| 久久精品日韩 | 天天玩天天干 | 91九色蝌蚪 | 欧美最猛性xxxxx亚洲精品 | 亚洲国产视频直播 | 在线观看亚洲成人 | 在线观看视频亚洲 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 91热爆在线观看 | 99在线观看免费视频精品观看 | 国产在线色视频 | 成人小视频在线 | 一级大片在线观看 | 久久久久亚洲天堂 | 亚洲va欧美 | 久草在线免费看视频 | 最近中文字幕mv免费高清在线 | 色婷婷午夜| 久久久精品网站 | 美女网站在线看 | 成人av一区二区三区 | 欧美精品一区二区免费 | 欧美精品亚洲精品日韩精品 | 成人av网站在线播放 | 亚洲免费公开视频 | 国产在线视频一区 | 日韩激情视频在线观看 | 久久永久免费 | 久久久免费| 亚洲国产最新 | 黄色中文字幕 | 一区二区三区国产精品 | 香蕉视频免费在线播放 | 欧美一区二区在线免费观看 | 三级黄色免费 | 九色精品免费永久在线 | 天天亚洲| 欧美日韩一区二区三区视频 | www.夜夜操.com| 色在线网站 | 亚洲成人软件 | 日韩欧美在线不卡 | 三级黄色网络 | 久久久久免费观看 | 色插综合| 国产精品女人久久久久久 | 五月天久久狠狠 | 玖玖精品在线 | 久久这里只有精品1 | 一级片视频在线 | 亚洲国产美女精品久久久久∴ | 成人免费在线播放 | 91资源在线视频 | 亚洲一级影院 | 91视视频在线直接观看在线看网页在线看 | 国产1区2区3区精品美女 | 国产成人一区二区三区在线观看 | 成人试看120秒 | 国产玖玖精品视频 | 狠狠网亚洲精品 | 亚洲精选在线观看 | 久久精品国产美女 | 亚洲 欧美日韩 国产 中文 | 欧美激情视频在线免费观看 | 亚洲电影图片小说 | 正在播放日韩 | 夜夜干天天操 | 国产精品麻豆一区二区三区 | 黄色免费高清视频 | 国产麻豆精品传媒av国产下载 | 日本久久电影网 | 五月婷在线播放 | 日韩av偷拍 | 美女视频网站久久 | 久久午夜鲁丝片 | 久久人人爽人人爽人人片av免费 | 91精品影视 | 中文字幕亚洲欧美日韩 | 欧美精品免费视频 | 91精品一区二区三区蜜臀 | 特级毛片在线免费观看 | 久久视频免费在线观看 | 91系列在线观看 | 亚洲欧美日韩在线看 | 国产成人一区二区三区久久精品 | 日韩激情视频在线 | 国产精品久久久久影院日本 | 91视频链接 | 日韩免费播放 | 91在线看黄 | 国产福利免费看 | 男女免费av | 国产一区二区在线播放视频 | 在线视频 亚洲 | 久久五月情影视 | 日韩午夜高清 | 亚洲亚洲精品在线观看 | 中文字幕一区二区三区在线视频 | 亚洲综合色婷婷 | 成 人 黄 色 视频播放1 | 麻豆国产精品va在线观看不卡 | 国产色影院 | 美国av片在线观看 | 久久久久免费精品 | 最新成人在线 | 欧美午夜一区二区福利视频 | 中文字幕中文字幕中文字幕 | 免费精品国产 | 国产又粗又猛又爽又黄的视频先 | 看v片 | 国内免费的中文字幕 | 国产精品一区欧美 | 天天操天天曰 | 91免费高清| 国产欧美精品在线观看 | 黄色av免费| 91精品婷婷国产综合久久蝌蚪 | 男女啪啪网站 | 国产精品你懂的在线观看 | 久久国语 | 一级一片免费看 | 一区 二区 精品 | 伊人国产视频 | 欧美经典久久 | 久久这里只有精品首页 | 在线亚洲观看 | 亚洲一区动漫 | 国产精品久久亚洲 | 国产日韩精品在线观看 | 狠狠躁日日躁狂躁夜夜躁av | 日韩一区二区三区高清免费看看 | 久久天天拍 | 成年人电影免费看 | 玖玖玖在线观看 | 中文字幕免费国产精品 | 懂色av一区二区在线播放 | 国产精品视频免费观看 | 婷婷在线视频观看 | 亚洲午夜精品电影 | 91丨九色丨高潮丰满 | 免费又黄又爽的视频 | 99爱精品视频| 丁香六月中文字幕 | 亚洲资源网 | 波多野结衣电影一区二区三区 | 欧美一级黄大片 | 成人va视频 | 国产中文字幕91 | 亚洲欧洲一区二区在线观看 | 伊人热| av免费在线看网站 | 国产小视频在线免费观看 | 久久久久久综合网天天 | 日韩系列 | 91毛片在线观看 | 国产成人黄色在线 | 天天色影院 | 亚洲免费av电影 | 久久久久久蜜av免费网站 | 波多野结衣在线中文字幕 | 在线观看日本韩国电影 | 99 色 | 中文字幕乱码在线播放 | 欧美大片在线看免费观看 | 国产精品久久影院 | 亚洲清纯国产 | 色综合久久天天 | 日本三级不卡视频 | 91亚洲精品久久久久图片蜜桃 | 久久综合成人 | 国产精品毛片久久蜜 | 久久久久国产精品视频 | 久久99精品久久久久久三级 | 激情婷婷av| 超碰在线免费福利 | 久久精彩免费视频 | 91av看片 | 久久在草| 午夜骚影 | 精品国产1区2区 | 播五月婷婷 | 九九热视频在线免费观看 | 国产成人精品一区二区在线观看 | 亚洲国产最新 | 91精品在线播放 | 欧美日韩一区二区视频在线观看 | 成人国产电影在线观看 | 国产精品福利无圣光在线一区 | 最近的中文字幕大全免费版 | 在线视频免费观看 | 国产精品爽爽久久久久久蜜臀 |