日韩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)站內容還不錯,歡迎將生活随笔推薦給好友。

    天天操夜夜摸 | 国产免费二区 | 九九日韩| 激情久久伊人 | 久久香蕉一区 | 国产69久久久欧美一级 | 亚洲美女在线一区 | 黄色一级在线视频 | 欧洲一区二区在线观看 | 蜜臀av一区 | 精品91视频 | h动漫中文字幕 | 992tv成人免费看片 | 国产中文欧美日韩在线 | 日韩a欧美 | 天天色中文 | 久久精品国产一区二区三 | 午夜电影一区 | 成人免费在线观看av | 午夜国产福利在线 | 国产精品自产拍在线观看蜜 | www.天天草| www国产一区 | 国产精品久久久久久久久久99 | 在线观看久久 | 欧美日韩p片 | 国产免费视频一区二区裸体 | 免费能看的av | 久久香蕉电影 | 丁香在线视频 | 激情电影在线观看 | 二区三区毛片 | 亚洲综合视频在线观看 | 精品中文字幕在线观看 | 国产乱码精品一区二区三区介绍 | 欧美一区免费观看 | 精品欧美一区二区在线观看 | 天堂av在线 | 日韩色综合网 | 黄色a一级视频 | 色综合久久网 | 91精品资源 | 日韩精品短视频 | 97人人模人人爽人人喊中文字 | 精品欧美一区二区在线观看 | 国产成人一区二区三区影院在线 | 免费日韩三级 | 伊人网av | 久久久久国产成人免费精品免费 | 国产真实精品久久二三区 | 欧美日韩一区二区三区在线观看视频 | 日本久久久久久久久久 | 成人国产精品一区二区 | 欧美一进一出抽搐大尺度视频 | 99精品久久久 | 国产成人精品999在线观看 | 337p日本欧洲亚洲大胆裸体艺术 | 亚洲成人av免费 | 欧美一级日韩三级 | 91在线精品秘密一区二区 | 国产 中文 日韩 欧美 | 91久色蝌蚪 | 91精品国产91热久久久做人人 | 在线不卡中文字幕播放 | 色噜噜在线观看视频 | 91中文字幕在线 | 午夜电影 电影 | 国产婷婷久久 | 免费av片在线 | 美女视频黄色免费 | 视频在线精品 | 久久香蕉国产精品麻豆粉嫩av | 五月天国产 | 日本系列中文字幕 | 三级免费黄色 | 欧美精品久久人人躁人人爽 | 97精品国产91久久久久久 | 久久99国产精品免费网站 | 97福利在线观看 | 一本一道久久a久久精品蜜桃 | 亚洲精品视频在线观看网站 | 在线免费观看黄色 | 五月天激情综合网 | 亚洲最新合集 | 黄色网址中文字幕 | 欧美 日韩 性 | 91九色国产在线 | 久久久一本精品99久久精品 | 久久精品屋| 天天草综合网 | 欧美日韩在线观看视频 | 国产99久久久国产精品免费二区 | 精品欧美一区二区精品久久 | 久久首页| 成人影视免费看 | 欧美激情va永久在线播放 | 天天干天天操天天 | 色综合久久88色综合天天 | 国产99久久久精品 | 国产精品黄 | 久久99网| 精品久久一区二区三区 | 激情婷婷 | 久久成人欧美 | 夜夜操天天 | aaa日本高清在线播放免费观看 | 久9在线 | 久久ww| 成人a视频片观看免费 | jizz999| 国产精品久久嫩一区二区免费 | 麻豆av一区二区三区在线观看 | 成人免费 在线播放 | 丁香花五月 | 日韩视频中文字幕 | 国产成人在线免费观看 | 麻豆国产精品va在线观看不卡 | 日韩高清一二区 | 99精品网站| 色狠狠操 | 亚州日韩中文字幕 | 国产精品欧美久久久久天天影视 | 九九视频精品免费 | 97超在线视频 | 欧美精品一区在线 | 又污又黄的网站 | 91丨九色丨高潮丰满 | 日韩性网站 | 少妇视频在线播放 | 国产精品久久久777 成人手机在线视频 | 久久久精品国产一区二区电影四季 | 欧美精品被 | 国产香蕉视频在线播放 | 亚洲免费一级 | 99精品一级欧美片免费播放 | 日韩网站免费观看 | 午夜av免费看 | 久久人视频| 成人黄色视| 夜夜狠狠 | 91一区啪爱嗯打偷拍欧美 | 国产精品99久久久久 | 久久久久一区二区三区四区 | 99视频免费 | 国产午夜激情视频 | 久久久99精品免费观看app | 欧美一级免费黄色片 | 亚洲人成精品久久久久 | 免费日韩一区二区三区 | 国产美女主播精品一区二区三区 | 久久精品99久久久久久 | 国产伦理久久精品久久久久_ | 国产综合片 | 成年人视频在线免费观看 | 国产精品一二三 | 国产一级淫片免费看 | 美女国产 | 91黄视频在线观看 | 国产色综合 | 国产精品福利午夜在线观看 | 四虎4hu永久免费 | 九九视频这里只有精品 | 黄污网站在线观看 | 九九视频在线播放 | 中文字幕首页 | 久久永久视频 | av大片免费 | 中文字幕亚洲国产 | 日韩三级视频在线看 | 久久久久欠精品国产毛片国产毛生 | 婷婷国产一区二区三区 | www色com | 欧美精品第一 | 在线va视频 | 天天综合天天综合 | 91日韩免费 | 国产精品色在线 | 国产精品夜夜夜一区二区三区尤 | 日韩免费一级a毛片在线播放一级 | 久草视频观看 | 一级片免费观看 | 激情五月婷婷综合网 | 狠狠88综合久久久久综合网 | 91资源在线观看 | 国产美女精品久久久 | 97精品视频在线播放 | 黄色毛片在线 | 久久久久久久综合色一本 | 婷婷色亚洲 | 免费在线观看日韩欧美 | 在线日本看片免费人成视久网 | 91精品久久久久久综合五月天 | 色婷婷视频在线 | 亚洲一区不卡视频 | 亚洲一区二区三区91 | 国产精品一区二区白浆 | 国产成人精品综合 | 欧美性黄网官网 | 久久国产a| 国产美女精品久久久 | 黄色资源网站 | 国产精品久免费的黄网站 | 亚洲视频在线播放 | 亚洲免费av在线 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲天天做 | av黄网站| 九七人人干 | 国产黄在线免费观看 | 在线天堂8√ | 手机av在线网站 | 欧洲一区二区三区精品 | 91精品国产一区二区在线观看 | 日韩av视屏 | 国产黄大片在线观看 | 亚洲激情电影在线 | 欧美日韩视频在线 | 亚洲国产三级在线观看 | 亚洲日本色 | 一区二区成人国产精品 | 国产99久久久久久免费看 | 精品国产乱码久久久久久1区二区 | 黄色网www | 韩国三级av在线 | 亚洲最新av在线网站 | 狠狠色丁香婷婷综合橹88 | 五月天免费网站 | 91视频免费网址 | av一区二区三区在线播放 | 天天色综合1 | 国产精品黄 | 日韩字幕在线观看 | 91中文视频 | 五月开心婷婷网 | a在线观看国产 | 天天综合久久综合 | 91av短视频| 日日夜夜婷婷 | 99热在线免费观看 | 久久亚洲影院 | 中文欧美字幕免费 | 久久久精品网站 | 黄色片亚洲 | 日韩免费电影一区二区 | 97在线公开视频 | 91精品啪在线观看国产线免费 | 日本色小说视频 | 激情欧美一区二区免费视频 | 久久草在线精品 | 九九日韩| 色吧久久 | 国产aa免费视频 | 天无日天天操天天干 | 中文字幕二区三区 | 玖玖在线免费视频 | 91av综合 | 天天搞天天干天天色 | 免费日韩电影 | 国产麻豆精品久久 | 国内一级片在线观看 | 国产精品成人aaaaa网站 | 97色狠狠| 又爽又黄又无遮挡网站动态图 | 日日天天av| 国产理论一区二区三区 | 超碰国产在线播放 | 久久久久福利视频 | 美女在线免费视频 | 人人爽人人爽人人片av | 色婷婷久久久 | av网站播放 | 91精品国产自产在线观看 | 中文字幕在线看人 | 日韩欧美网址 | 欧美日韩在线第一页 | 蜜桃视频在线观看一区 | 不卡日韩av| 高清不卡毛片 | 96在线| 黄色亚洲片 | 99热这里有 | 女人18毛片a级毛片一区二区 | 日韩视频免费看 | 韩国精品在线 | 国产精品入口麻豆 | 久久久久久久久久影院 | 欧美在线资源 | 欧美性猛片, | 国产精品成人久久 | 日韩欧美在线综合网 | 麻豆播放 | 91久久人澡人人添人人爽欧美 | 黄色91在线观看 | 国产精彩视频一区 | av三级在线播放 | 日韩欧美在线综合网 | 成人作爱视频 | 激情影院在线观看 | 成年人在线免费看视频 | 黄a网| 久久女同性恋中文字幕 | 久久高清国产视频 | 亚洲视频99 | 日日夜精品 | 伊人久久影视 | 国产日韩欧美在线观看 | 日韩国产欧美在线播放 | 国产成人久 | 成人亚洲欧美 | 一区二区三区中文字幕在线 | 91漂亮少妇露脸在线播放 | 嫩嫩影院理论片 | 日韩激情在线视频 | 美女黄频 | 国产一线二线三线在线观看 | 在线观看视频国产一区 | 亚洲天堂首页 | 亚洲精品福利视频 | 日韩欧在线 | 日韩在线观看高清 | 久久人人精品 | 最新国产精品久久精品 | 99久久精品免费一区 | 四虎在线观看视频 | 久久精品艹 | 久久成| 超碰在线1 | 国产婷婷视频在线 | 国产在线观 | 国产91综合一区在线观看 | 99久久综合狠狠综合久久 | 最近最新中文字幕视频 | 亚洲 欧美 国产 va在线影院 | 91精品国产乱码 | 久草网视频| 欧美怡红院视频 | 亚洲免费永久精品国产 | 天天操天天干天天插 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 欧洲精品视频一区 | 最新国产一区二区三区 | 亚洲黄网站 | 四虎成人免费影院 | 日韩91精品 | 日韩电影中文,亚洲精品乱码 | 午夜少妇一区二区三区 | 狠狠操欧美 | 97色国产 | 中文字幕 欧美性 | 欧美日韩后 | 色在线网站 | 国产精品高清一区二区三区 | 国产一级片播放 | 中文不卡视频 | 99综合电影在线视频 | 久久国产经典视频 | 久久伊人八月婷婷综合激情 | 一二三区高清 | 免费黄色在线网站 | 色中文字幕在线观看 | 婷婷电影在线观看 | 精品视频123区在线观看 | 婷婷五综合 | 亚洲精品久久久久中文字幕二区 | 天堂av网址 | 亚洲美女久久 | 成人久久18免费网站图片 | 欧美另类老妇 | av电影亚洲 | 国产自产在线视频 | 国产黄色免费电影 | 91香蕉视频在线下载 | 四虎国产精品永久在线国在线 | 91精品1区 | 91在线播放国产 | 亚洲综合视频在线 | 黄色的网站免费看 | 四虎影视8848aamm | 丁香五月亚洲综合在线 | 久久精品一二三区 | 国产精品99久久免费黑人 | 美女免费黄视频网站 | 超碰免费av | 免费在线观看av的网站 | 免费观看一区二区三区视频 | 久久精品视频在线播放 | 美女中文字幕 | 中文字幕的| 九九精品久久 | 韩国三级在线一区 | 欧美伦理电影一区二区 | 9色在线视频 | 精品一区av | 丁香五月缴情综合网 | 亚洲国产日韩在线 | 欧美日韩免费看 | 97成人精品 | 国产男女爽爽爽免费视频 | 久久精品毛片基地 | 香蕉视频在线免费 | 黄色成人av网址 | 日日爽天天操 | 婷婷在线精品视频 | 久久精品国产亚洲精品 | 国产一级电影免费观看 | 国产一区二区三区视频在线 | 精品国产一区二区三区免费 | 97超碰人人看 | 在线看日韩av | 我要看黄色一级片 | 一区二区视频在线播放 | 一本一道久久a久久精品蜜桃 | www日日夜夜| 天天躁日日躁狠狠躁 | 午夜久久网 | 日韩av影片在线观看 | 99精品视频在线观看 | 亚洲一区精品二人人爽久久 | 日韩高清网站 | 久久99精品一区二区三区三区 | 一区二区三区四区久久 | 久久免费视频国产 | 亚洲精品一区二区在线观看 | av电影免费| 欧美日韩亚洲第一页 | 视频高清| 91精品网站在线观看 | 超碰人人在线 | 婷婷视频在线 | 亚洲一区日韩精品 | 欧美精品久久久久久久久免 | 亚洲精品美女在线观看播放 | 色综合久久综合 | 欧美视频二区 | 一级黄色网址 | 最新日韩视频在线观看 | 国产视频在线观看一区二区 | 国产精品原创在线 | 亚洲综合干 | 黄色免费高清视频 | 天天操天天操天天操 | 日本一区二区三区视频在线播放 | 在线岛国av | 日韩中文字幕在线不卡 | 激情自拍av | 视频一区二区精品 | 一区二区三区高清在线 | 国产午夜精品福利视频 | 精品久久久网 | 奇人奇案qvod | 毛片视频电影 | 国产美女精品人人做人人爽 | 97在线看 | 在线观看一级视频 | 国产又粗又猛又色又黄视频 | 国产精品久久在线观看 | 就要色综合| 六月久久婷婷 | 日本精品一二区 | 1024手机在线看 | 国产精品第 | 亚洲国产欧美在线人成大黄瓜 | 国产成人av网 | 五月天婷婷视频 | 一级欧美黄 | 韩国精品一区二区三区六区色诱 | 久草在线资源观看 | 黄色毛片电影 | 狠狠狠操| 日日爱影视 | 国产精品一区二区在线免费观看 | 外国av网| 国产精品一区二区在线 | 亚洲黄色免费观看 | 日韩精品免费一区二区三区 | a视频在线看 | 久草在线视频国产 | 国产精品女人网站 | 成人在线观看你懂的 | 九九精品毛片 | 欧美日韩三区二区 | 91亚洲视频在线观看 | 国产精品96久久久久久吹潮 | 天天爱天天操天天射 | 综合激情av| 亚洲首页 | 精品字幕在线 | 色婷婷av一区二 | 成人av资源| av888.com| 日本久久久亚洲精品 | 色综合天天视频在线观看 | 日韩午夜电影网 | 亚洲伊人av | 成人a毛片 | 婷婷六月丁 | 国产精品美 | 亚洲桃花综合 | 激情av一区二区 | 黄色片视频免费 | 九九热免费精品视频 | 99情趣网视频 | 国产视频久久久久 | 黄色电影网站在线观看 | 久久综合久久久 | 九九影视理伦片 | 久久久久久久久久久免费av | 日韩av成人 | 日韩三级视频在线看 | 午夜久久 | 午夜国产一区 | 999国内精品永久免费视频 | 99视频精品全部免费 在线 | 久草免费在线观看视频 | 狠狠狠色丁香综合久久天下网 | 天天做天天爱夜夜爽 | 热久在线 | 香蕉97视频观看在线观看 | 亚洲精品在线观看视频 | 激情综合色图 | 国产一区二区在线播放 | 精品国产_亚洲人成在线 | 视频在线观看亚洲 | 成人精品99 | 九九在线视频 | 成人av电影免费观看 | 丁香婷婷激情国产高清秒播 | 97视频在线观看视频免费视频 | 九九精品久久 | 亚洲欧美日韩中文在线 | 亚洲精品黄| 亚洲国产成人在线观看 | av电影一区二区 | 中文免费在线观看 | 亚洲精品视频免费 | 欧美日本中文字幕 | 99久久久久久久久 | 欧美日本在线观看视频 | 亚洲一区二区三区在线看 | 日批在线看 | 97国产大学生情侣酒店的特点 | 在线观看电影av | 国产在线传媒 | 国产xxxx做受性欧美88 | 久草精品视频 | 丰满少妇对白在线偷拍 | 91九色精品女同系列 | aav在线| 九九国产精品视频 | 欧美另类sm图片 | 欧洲激情综合 | 日韩在线视频免费播放 | 国产精品毛片久久久久久 | 99视屏| 操操操人人人 | 日韩综合第一页 | 亚洲一级片免费观看 | 9999毛片| 狠狠干成人综合网 | 男女日麻批 | 韩国视频一区二区三区 | 国产精品久久久久久久久久三级 | 一区二区视频在线观看免费 | 亚洲艳情| 久草精品视频在线看网站免费 | 波多野结衣电影久久 | 激情网五月婷婷 | 人人爽人人爽人人爽学生一级 | 亚洲欧美视频 | 麻花天美星空视频 | 亚色视频在线观看 | 久久99久久精品国产 | 91亚洲欧美激情 | 亚洲高清视频在线观看 | 天天综合久久综合 | 色福利网站 | 亚洲一二三在线 | 国产精品亚洲a | 国产丝袜 | 日本黄色免费在线 | 日韩免费av在线 | 婷婷色在线视频 | 久久久久久久久久久久影院 | 97在线观视频免费观看 | 国精产品999国精产品岳 | 在线播放视频一区 | 97超碰在线资源 | 精品国产乱码久久久久久久 | 亚洲婷婷综合色高清在线 | 日韩av专区| 久草在线观看视频免费 | 国产又粗又猛又黄视频 | 精品国产视频在线 | 亚洲精品在线电影 | 免费观看高清 | 2000xxx影视 | 国产手机免费视频 | 特级西西www44高清大胆图片 | 久久久久久久久久免费 | 在线电影 一区 | 亚洲mv大片欧洲mv大片免费 | 在线观看91久久久久久 | 国产成人av免费在线观看 | 免费精品国产va自在自线 | 久久久久一区 | 国产私拍在线 | 国产中文字幕精品 | 日本三级不卡视频 | 亚洲精品乱码久久久久久 | av网站免费线看精品 | 色偷偷888欧美精品久久久 | 97视频中文字幕 | 久久免费国产电影 | 欧美成人在线免费观看 | 国产99久久久国产精品免费二区 | 成人在线观看免费视频 | 在线观看蜜桃视频 | 黄色小说视频网站 | 成人毛片在线观看 | 免费福利在线观看 | 久久综合中文色婷婷 | 4438全国亚洲精品在线观看视频 | 综合久久综合久久 | 国产一区二区三区午夜 | 激情综合啪 | 国产色区 | 日韩在线色视频 | 手机av片 | 日韩精品一区不卡 | av软件在线观看 | 精品国产电影一区 | 婷婷丁香五 | 视频在线观看99 | 人人爱人人舔 | 丝袜美腿亚洲 | 国产永久免费观看 | 麻豆视频在线免费观看 | 婷婷成人综合 | 日韩极品在线 | 国产一区二区三区网站 | 久久在线视频精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 日批视频在线 | 国产精品一区二区三区久久久 | 2023亚洲精品国偷拍自产在线 | 天天躁日日躁狠狠 | 欧美一区二区免费在线观看 | www.午夜| 成人av地址 | 日韩在线视频网站 | 人成在线免费视频 | 亚洲精品合集 | 在线国产黄色 | 丁香亚洲 | 亚洲综合色站 | 亚洲综合网 | 成人毛片久久 | 91精品国产欧美一区二区 | 亚洲一级电影视频 | 操操操干干干 | 欧美日韩视频在线观看一区二区 | 综合色站导航 | 黄色软件在线看 | 国产精品久久久网站 | 中文字幕在线播放日韩 | 亚洲国产视频网站 | 国产精品亚洲综合久久 | adn—256中文在线观看 | 日本最新中文字幕 | 久久视频网址 | 视频在线国产 | 精品国产一区二区久久 | 伊人日日干 | 婷婷精品国产一区二区三区日韩 | 亚洲精品男人天堂 | 日本电影久久 | 久热久草在线 | 中文字幕在线视频一区 | 久久久久久久久久久久亚洲 | 在线观看免费国产小视频 | 国产精品久久一卡二卡 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 99热国产在线观看 | 99久久精品国产欧美主题曲 | 成年人视频在线 | 911国产 | 亚洲va欧美va人人爽春色影视 | 国产盗摄精品一区二区 | 久草在线最新免费 | 国产一区二区视频在线播放 | 亚洲小视频在线观看 | 特级aaa毛片 | 看污网站| 91精品成人 | 在线观看中文字幕2021 | 免费黄av | 91色一区二区三区 | 国产黄av | 久久天堂亚洲 | 西西大胆免费视频 | 中文字幕亚洲综合久久五月天色无吗'' | 激情五月婷婷综合网 | 日本久久久久久 | 成人在线播放视频 | 免费看国产视频 | av三区在线 | 91爱爱电影 | 国产视频一区二区在线 | 亚洲少妇影院 | 特黄一级毛片 | 综合国产在线观看 | 毛片99 | 久久这里只有精品视频首页 | 久久美女免费视频 | 狠狠躁夜夜av | 国产一区欧美二区 | 91麻豆.com | 一级电影免费在线观看 | 超碰97免费在线 | 精品国产乱码一区二 | 欧美在线视频一区二区 | 日日夜夜干 | 日韩精品免费一区二区三区 | 1000部国产精品成人观看 | 久久www免费视频 | 国产精品一区二区精品视频免费看 | 久久久精品免费观看 | 人人看黄色 | 亚洲久在线 | 日韩高清精品免费观看 | 成人中文字幕av | 狠狠色伊人亚洲综合成人 | 午夜久久美女 | 成人免费在线看片 | 久久久综合电影 | 久久五月情影视 | 91在线免费播放 | 国内久久看| 国产高清免费视频 | 色综合久久88色综合天天6 | 日韩在线观看网站 | 97人人模人人爽人人喊网 | 亚州精品在线视频 | 久草视频99 | 日本黄色大片儿 | 日本中文字幕观看 | av福利网址导航 | 久久免费国产视频 | 五月婷婷六月丁香在线观看 | www.五月天婷婷 | av线上免费观看 | 99久久精品国产一区二区三区 | 日本一区二区免费在线观看 | 亚洲精品在线观看不卡 | 亚洲做受高潮欧美裸体 | 亚洲精品久久久久中文字幕m男 | 制服丝袜欧美 | 国产一级二级视频 | 九九爱免费视频在线观看 | 久久婷婷五月综合色丁香 | 国产精品99精品 | 亚洲成人精品在线 | 黄色一区三区 | 久久字幕精品一区 | 狠狠狠狠狠狠狠干 | 中文字幕在线免费观看视频 | 国产99久久久久 | 婷婷综合导航 | 免费观看av网站 | 日本动漫做毛片一区二区 | 乱男乱女www7788 | 国产精品福利在线观看 | 久久高清 | 亚洲国产美女久久久久 | 欧美性黄网官网 | 天天干天天草 | 人人视频网站 | 欧洲亚洲国产视频 | 国产精品久久久久一区二区 | 久久狠狠一本精品综合网 | 在线观看欧美成人 | 亚洲视频中文 | 97精品国产97久久久久久久久久久久 | 久久字幕 | 五月婷婷.com| 成年人视频在线观看免费 | 伊人宗合网 | 久久久久久久18 | 欧美成人在线免费 | 亚洲国产福利视频 | 国产精品成人久久久 | 成人午夜网 | 国产精品成人一区二区三区 | 亚洲精品乱码久久久一二三 | 香蕉成人在线视频 | av网站在线观看免费 | 欧美日韩三区二区 | 六月色播| 午夜少妇| 综合网在线视频 | 2019天天干夜夜操 | 激情偷乱人伦小说视频在线观看 | 国产精品99免费看 | 狠狠干.com | 99久久久国产精品免费99 | 一区二区在线电影 | 欧美日韩伦理在线 | 波多野结衣电影一区 | 免费看黄色91 | 日本三级在线观看中文字 | 热99久久精品 | 91色网址 | 日韩免费视频网站 | 中文字幕资源站 | 亚洲视频免费 | 天天色天天操综合 | 超碰公开在线 | 久久av在线播放 | 精品99在线观看 | 色综合天天狠狠 | 国产免费三级在线观看 | 黄色最新网址 | 国产r级在线观看 | 黄色小说18 | 国产打女人屁股调教97 | 久久精品久久精品 | 91成品视频| 中文字幕免费观看视频 | 视频一区在线免费观看 | 国产精品资源在线观看 | 成人黄色在线电影 | 四虎8848免费高清在线观看 | 福利视频网站 | 最近2019中文免费高清视频观看www99 | 亚洲国产成人av网 | 久久久综合色 | 国产综合激情 | 国产91学生| 亚洲1级片 | 国产亚洲婷婷免费 | 高潮久久久久久久久 | 日韩性色 | 亚洲性视频 | 日本中文一区二区 | 奇米影视在线99精品 | 亚洲欧美视频一区二区三区 | 亚洲精品男人的天堂 | 插综合网 | 久久午夜精品影院一区 | 欧美性色综合 | 中文字幕传媒 | 欧美少妇xx | 中文字幕一区2区3区 | 午夜体验区 | 国产精品porn| 91正在播放 | 亚洲在线视频播放 | 91香蕉视频在线下载 | bbb搡bbb爽爽爽 | 中文字幕在线观看第三页 | 香蕉手机在线 | 国产一区在线视频观看 | 国产亲近乱来精品 | 国产乱码精品一区二区三区介绍 | 免费视频黄色 | 日本在线成人 | 婷婷丁香在线 | 天天搞天天干天天色 | 色婷婷综合久久久 | 2019中文| 密桃av在线 | 伊人导航| 婷婷综合亚洲 | 久久久国产精品一区二区三区 | 国产精品久久久久久久久久久久久久 | 日韩视频一区二区三区 | 天天操天天干天天操天天干 | 97在线视频免费 | 久久国产精品99久久人人澡 | h久久| 伊人中文网| 免费污片 | 狠狠干 狠狠操 | 国产91免费在线观看 | 伊人婷婷在线 | 欧洲一区二区在线观看 | 久草在线91 | 国产91aaa | 好看的国产精品视频 | www.99久久.com | 婷婷av色综合 | 天天摸天天舔天天操 | 亚洲精品久久久久久国 | 日本久久久影视 | 久久夜av | 日韩精品免费专区 | 在线国产中文 | 亚洲91视频| 色婷婷影视 | www.99av| 亚洲精品综合久久 | 欧美 国产 视频 | 91在线视频一区 | 激情电影影院 | 久久av伊人 | 色婷婷97 | 激情网第四色 | 日韩美女久久 | 91片网| 香蕉视频在线播放 | 欧美日韩在线第一页 | 久久久久久黄色 | 久久久久在线视频 | 99热亚洲精品 | 久久人人爽爽 | 成人网在线免费视频 | 99热这里精品 | 在线视频 精品 | 日本高清dvd| 亚洲免费av一区二区 | 国产一区不卡在线 | 国产精品1024| 精品少妇一区二区三区在线 | 久久999久久 | 欧美日韩国产在线精品 | 成人免费视频a | 色综合久久88色综合天天免费 | 久久国产精品久久久久 | 亚洲精品国偷拍自产在线观看蜜桃 | 制服丝袜天堂 | 在线视频 成人 | 天天在线视频色 | 国产精品久久久久免费观看 | 久久爱导航 | 免费在线成人 | 久久精选 | 四虎在线影视 | 国产中文字幕网 | 麻豆视频在线观看 | 日本在线中文在线 | 极品久久久久久久 | 中文字幕在线观看第三页 | 在线电影av | 91aaa在线观看| 免费毛片一区二区三区久久久 | 一区二区日韩av | 国产成人亚洲在线观看 | 天天操天天草 | 国产精品成人久久久 | 在线电影av| 夜夜躁日日躁狠狠久久av | 国产九九九精品视频 | 日韩一区二区三区不卡 | 亚洲电影第一页av | 日韩免费观看av | 国产字幕av | 久草视频免费在线观看 | 狠狠色网 | 一区二区日韩av | 精品视频97| 欧美日韩精品国产 | 久久久久国产精品午夜一区 | av一级一片 | 国产一区二区久久精品 | 视频在线观看亚洲 | 一级成人免费视频 | 精品96久久久久久中文字幕无 | 亚洲第一中文网 | 黄色免费网 | 久久成人亚洲欧美电影 | 六月天色婷婷 | 国产无套视频 | 日日夜夜av | 韩国在线视频一区 | 久久久久久久久毛片精品 | 国内视频在线观看 | 超碰在线观看97 | 国产精品久久久久久久久费观看 | 国产精品视频专区 | 狠狠操狠狠干天天操 | 91精品一区二区在线观看 | 久久久国产精品人人片99精片欧美一 | 亚洲精品视频免费观看 | 91av视频在线免费观看 | 91精品一区在线观看 | 国产精品一区一区三区 | 久操伊人 | 欧美成亚洲 | 精品96久久久久久中文字幕无 | 91精品久久久久久久99蜜桃 | 免费网站污| 97精品欧美91久久久久久 | 亚洲精品综合欧美二区变态 | 狠狠色噜噜狠狠狠合久 | 97精品国产 | 国产精品永久 | 国产黄大片在线观看 | 成年人免费看片 |