Spring Cloud Gateway 內(nèi)置的過(guò)濾器工廠

本文基于Spring Cloud Greenwich SR2

[TOC]


內(nèi)置的過(guò)濾器工廠

這里簡(jiǎn)單將Spring Cloud Gateway內(nèi)置的所有過(guò)濾器工廠整理成了一張表格,雖然不是很詳細(xì),但能作為速覽使用。如下:

過(guò)濾器工廠 作用 參數(shù)
AddRequestHeader 為原始請(qǐng)求添加Header Header的名稱(chēng)及值
AddRequestParameter 為原始請(qǐng)求添加請(qǐng)求參數(shù) 參數(shù)名稱(chēng)及值
AddResponseHeader 為原始響應(yīng)添加Header Header的名稱(chēng)及值
DedupeResponseHeader 剔除響應(yīng)頭中重復(fù)的值 需要去重的Header名稱(chēng)及去重策略
Hystrix 為路由引入Hystrix的斷路器保護(hù) HystrixCommand的名稱(chēng)
FallbackHeaders 為fallbackUri的請(qǐng)求頭中添加具體的異常信息 Header的名稱(chēng)
PrefixPath 為原始請(qǐng)求路徑添加前綴 前綴路徑
PreserveHostHeader 為請(qǐng)求添加一個(gè)preserveHostHeader=true的屬性耍休,路由過(guò)濾器會(huì)檢查該屬性以決定是否要發(fā)送原始的Host 無(wú)
RequestRateLimiter 用于對(duì)請(qǐng)求限流杠娱,限流算法為令牌桶 keyResolver澡绩、rateLimiter肺稀、statusCode、denyEmptyKey酌毡、emptyKeyStatus
RedirectTo 將原始請(qǐng)求重定向到指定的URL http狀態(tài)碼及重定向的url
RemoveHopByHopHeadersFilter 為原始請(qǐng)求刪除IETF組織規(guī)定的一系列Header 默認(rèn)就會(huì)啟用,可以通過(guò)配置指定僅刪除哪些Header
RemoveRequestHeader 為原始請(qǐng)求刪除某個(gè)Header Header名稱(chēng)
RemoveResponseHeader 為原始響應(yīng)刪除某個(gè)Header Header名稱(chēng)
RewritePath 重寫(xiě)原始的請(qǐng)求路徑 原始路徑正則表達(dá)式以及重寫(xiě)后路徑的正則表達(dá)式
RewriteResponseHeader 重寫(xiě)原始響應(yīng)中的某個(gè)Header Header名稱(chēng)蕾管,值的正則表達(dá)式枷踏,重寫(xiě)后的值
SaveSession 在轉(zhuǎn)發(fā)請(qǐng)求之前,強(qiáng)制執(zhí)行WebSession::save操作 無(wú)
SecureHeaders 為原始響應(yīng)添加一系列起安全作用的響應(yīng)頭 無(wú)掰曾,支持修改這些安全響應(yīng)頭的值
SetPath 修改原始的請(qǐng)求路徑 修改后的路徑
SetResponseHeader 修改原始響應(yīng)中某個(gè)Header的值 Header名稱(chēng)旭蠕,修改后的值
SetStatus 修改原始響應(yīng)的狀態(tài)碼 HTTP 狀態(tài)碼,可以是數(shù)字旷坦,也可以是字符串
StripPrefix 用于截?cái)嘣颊?qǐng)求的路徑 使用數(shù)字表示要截?cái)嗟穆窂降臄?shù)量
Retry 針對(duì)不同的響應(yīng)進(jìn)行重試 retries掏熬、statuses、methods秒梅、series
RequestSize 設(shè)置允許接收最大請(qǐng)求包的大小旗芬。如果請(qǐng)求包大小超過(guò)設(shè)置的值,則返回 413 Payload Too Large 請(qǐng)求包大小捆蜀,單位為字節(jié)疮丛,默認(rèn)值為5M
ModifyRequestBody 在轉(zhuǎn)發(fā)請(qǐng)求之前修改原始請(qǐng)求體內(nèi)容 修改后的請(qǐng)求體內(nèi)容
ModifyResponseBody 修改原始響應(yīng)體的內(nèi)容 修改后的響應(yīng)體內(nèi)容
Default 為所有路由添加過(guò)濾器 過(guò)濾器工廠名稱(chēng)及值

Tips:每個(gè)過(guò)濾器工廠都對(duì)應(yīng)一個(gè)實(shí)現(xiàn)類(lèi),并且這些類(lèi)的名稱(chēng)必須以GatewayFilterFactory結(jié)尾辆它,這是Spring Cloud Gateway的一個(gè)約定誊薄,例如AddRequestHeader對(duì)應(yīng)的實(shí)現(xiàn)類(lèi)為AddRequestHeaderGatewayFilterFactory。對(duì)源碼感興趣的小伙伴就可以按照這個(gè)規(guī)律拼接出具體的類(lèi)名娩井,以此查找這些內(nèi)置過(guò)濾器工廠的實(shí)現(xiàn)代碼


1暇屋、AddRequestHeader GatewayFilter Factory

為原始請(qǐng)求添加Header,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_header_route
        uri: https://example.org
        filters:
        - AddRequestHeader=X-Request-Foo, Bar

為原始請(qǐng)求添加名為 X-Request-Foo 洞辣,值為 Bar 的請(qǐng)求頭

2咐刨、AddRequestParameter GatewayFilter Factory

為原始請(qǐng)求添加請(qǐng)求參數(shù)及值昙衅,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: add_request_parameter_route
        uri: https://example.org
        filters:
        - AddRequestParameter=foo, bar

為原始請(qǐng)求添加名為foo,值為bar的參數(shù)定鸟,即:foo=bar

3而涉、AddResponseHeader GatewayFilter Factory

為原始響應(yīng)添加Header,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: add_response_header_route
        uri: https://example.org
        filters:
        - AddResponseHeader=X-Response-Foo, Bar

為原始響應(yīng)添加名為 X-Request-Foo 联予,值為 Bar 的響應(yīng)頭

4啼县、DedupeResponseHeader GatewayFilter Factory

DedupeResponseHeader可以根據(jù)配置的Header名稱(chēng)及去重策略剔除響應(yīng)頭中重復(fù)的值,這是Spring Cloud Greenwich SR2提供的新特性沸久,低于這個(gè)版本無(wú)法使用季眷。

我們?cè)贕ateway以及微服務(wù)上都設(shè)置了CORS(解決跨域)Header的話,如果不做任何配置卷胯,那么請(qǐng)求 -> 網(wǎng)關(guān) -> 微服務(wù)子刮,獲得的CORS Header的值,就將會(huì)是這樣的:

Access-Control-Allow-Credentials: true, true
Access-Control-Allow-Origin: https://musk.mars, https://musk.mars

可以看到這兩個(gè)Header的值都重復(fù)了窑睁,若想把這兩個(gè)Header的值去重的話挺峡,就需要使用到DedupeResponseHeader,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: dedupe_response_header_route
        uri: https://example.org
        filters:
        # 若需要去重的Header有多個(gè)担钮,使用空格分隔
        - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin

去重策略:

  • RETAIN_FIRST:默認(rèn)值橱赠,保留第一個(gè)值
  • RETAIN_LAST:保留最后一個(gè)值
  • RETAIN_UNIQUE:保留所有唯一值,以它們第一次出現(xiàn)的順序保留

若想對(duì)該過(guò)濾器工廠有個(gè)比較全面的了解的話箫津,建議閱讀該過(guò)濾器工廠的源碼狭姨,因?yàn)樵创a里有詳細(xì)的注釋及示例,比官方文檔寫(xiě)得還好:org.springframework.cloud.gateway.filter.factory.DedupeResponseHeaderGatewayFilterFactory

5鲤嫡、Hystrix GatewayFilter Factory

為路由引入Hystrix的斷路器保護(hù)送挑,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: hystrix_route
        uri: https://example.org
        filters:
        - Hystrix=myCommandName

Hystrix是Spring Cloud第一代容錯(cuò)組件,不過(guò)已經(jīng)進(jìn)入維護(hù)模式暖眼,未來(lái)Hystrix會(huì)被Spring Cloud移除掉惕耕,取而代之的是Alibaba Sentinel/Resilience4J。所以本文不做詳細(xì)介紹了诫肠,感興趣的話可以參考官方文檔:

6司澎、FallbackHeaders GatewayFilter Factory

同樣是對(duì)Hystrix的支持,上一小節(jié)所介紹的過(guò)濾器工廠支持一個(gè)配置參數(shù):fallbackUri栋豫,該配置用于當(dāng)發(fā)生異常時(shí)將請(qǐng)求轉(zhuǎn)發(fā)到一個(gè)特定的uri上挤安。而FallbackHeaders這個(gè)過(guò)濾工廠可以在轉(zhuǎn)發(fā)請(qǐng)求到該uri時(shí)添加一個(gè)Header,這個(gè)Header的值為具體的異常信息丧鸯。配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: ingredients
        uri: lb://ingredients
        predicates:
        - Path=//ingredients/**
        filters:
        - name: Hystrix
          args:
            name: fetchIngredients
            fallbackUri: forward:/fallback
      - id: ingredients-fallback
        uri: http://localhost:9994
        predicates:
        - Path=/fallback
        filters:
        - name: FallbackHeaders
          args:
            executionExceptionTypeHeaderName: Test-Header

這里也不做詳細(xì)介紹了蛤铜,感興趣可以參考官方文檔:

7、PrefixPath GatewayFilter Factory

為原始的請(qǐng)求路徑添加一個(gè)前綴路徑,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: prefixpath_route
        uri: https://example.org
        filters:
        - PrefixPath=/mypath

該配置使訪問(wèn)${GATEWAY_URL}/hello 會(huì)轉(zhuǎn)發(fā)到https://example.org/mypath/hello

8围肥、PreserveHostHeader GatewayFilter Factory

為請(qǐng)求添加一個(gè)preserveHostHeader=true的屬性剿干,路由過(guò)濾器會(huì)檢查該屬性以決定是否要發(fā)送原始的Host Header。配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: preserve_host_route
        uri: https://example.org
        filters:
        - PreserveHostHeader

如果不設(shè)置穆刻,那么名為 Host 的Header將由Http Client控制

9置尔、RequestRateLimiter GatewayFilter Factory

用于對(duì)請(qǐng)求進(jìn)行限流,限流算法為令牌桶氢伟。配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: requestratelimiter_route
        uri: https://example.org
        filters:
        - name: RequestRateLimiter
          args:
            redis-rate-limiter.replenishRate: 10
            redis-rate-limiter.burstCapacity: 20

這里暫且不做詳細(xì)的介紹榜轿,可以參考官方文檔:

10、RedirectTo GatewayFilter Factory

將原始請(qǐng)求重定向到指定的Url朵锣,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: redirect_route
        uri: https://example.org
        filters:
        - RedirectTo=302, https://acme.org

該配置使訪問(wèn) ${GATEWAY_URL}/hello 會(huì)被重定向到 https://acme.org/hello 谬盐,并且攜帶一個(gè) Location:http://acme.org 的Header,而返回客戶端的HTTP狀態(tài)碼為302

注意事項(xiàng):

  • HTTP狀態(tài)碼應(yīng)為3xx诚些,例如301
  • URL必須是合法的URL设褐,該URL會(huì)作為Location Header的值

11、RemoveHopByHopHeadersFilter GatewayFilter Factory

為原始請(qǐng)求刪除IETF組織規(guī)定的一系列Header泣刹,默認(rèn)刪除的Header如下:

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • TE
  • Trailer
  • Transfer-Encoding
  • Upgrade

可以通過(guò)配置去指定僅刪除哪些Header,配置示例:

spring:
  cloud:
    gateway:
      filter:
        remove-hop-by-hop:
          # 多個(gè)Header使用逗號(hào)(,)分隔
          headers: Connection,Keep-Alive

12犀被、RemoveRequestHeader GatewayFilter Factory

為原始請(qǐng)求刪除某個(gè)Header椅您,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: removerequestheader_route
        uri: https://example.org
        filters:
        - RemoveRequestHeader=X-Request-Foo

刪除原始請(qǐng)求中名為 X-Request-Foo 的請(qǐng)求頭

13、RemoveResponseHeader GatewayFilter Factory

為原始響應(yīng)刪除某個(gè)Header寡键,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: removeresponseheader_route
        uri: https://example.org
        filters:
        - RemoveResponseHeader=X-Response-Foo

刪除原始響應(yīng)中名為 X-Request-Foo 的響應(yīng)頭

14掀泳、RewritePath GatewayFilter Factory

通過(guò)正則表達(dá)式重寫(xiě)原始的請(qǐng)求路徑,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: https://example.org
        predicates:
        - Path=/foo/**
        filters:
        # 參數(shù)1為原始路徑的正則表達(dá)式西轩,參數(shù)2為重寫(xiě)后路徑的正則表達(dá)式
        - RewritePath=/foo/(?<segment>.*), /$\{segment}

該配置使得訪問(wèn) /foo/bar 時(shí)员舵,會(huì)將路徑重寫(xiě)為/bar 再進(jìn)行轉(zhuǎn)發(fā),也就是會(huì)轉(zhuǎn)發(fā)到 https://example.org/bar藕畔。需要注意的是:由于YAML語(yǔ)法马僻,需用$\ 替換 $

15、RewriteResponseHeader GatewayFilter Factory

重寫(xiě)原始響應(yīng)中的某個(gè)Header注服,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: rewriteresponseheader_route
        uri: https://example.org
        filters:
        # 參數(shù)1為Header名稱(chēng)韭邓,參數(shù)2為值的正則表達(dá)式,參數(shù)3為重寫(xiě)后的值
        - RewriteResponseHeader=X-Response-Foo, password=[^&]+, password=***

該配置的意義在于:如果響應(yīng)頭中 X-Response-Foo 的值為/42?user=ford&password=omg!what&flag=true溶弟,那么就會(huì)被按照配置的值重寫(xiě)成/42?user=ford&password=***&flag=true女淑,也就是把其中的password=omg!what重寫(xiě)成了password=***

16、SaveSession GatewayFilter Factory

在轉(zhuǎn)發(fā)請(qǐng)求之前辜御,強(qiáng)制執(zhí)行WebSession::save操作鸭你,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: save_session
        uri: https://example.org
        predicates:
        - Path=/foo/**
        filters:
        - SaveSession

主要用在那種像 Spring Session 延遲數(shù)據(jù)存儲(chǔ)(數(shù)據(jù)不是立刻持久化)的,并希望在請(qǐng)求轉(zhuǎn)發(fā)前確保session狀態(tài)保存情況。如果你將Spring Secutiry于Spring Session集成使用袱巨,并想確保安全信息都傳到下游機(jī)器阁谆,你就需要配置這個(gè)filter。

17瓣窄、SecureHeaders GatewayFilter Factory

SecureHeaders過(guò)濾器工廠主要是參考了這篇博客中的建議笛厦,為原始響應(yīng)添加了一系列起安全作用的響應(yīng)頭。默認(rèn)會(huì)添加如下Headers(包括值):

  • X-Xss-Protection:1; mode=block
  • Strict-Transport-Security:max-age=631138519
  • X-Frame-Options:DENY
  • X-Content-Type-Options:nosniff
  • Referrer-Policy:no-referrer
  • Content-Security-Policy:default-src 'self' https:; font-src 'self' https: data:; img-src 'self' https: data:; object-src 'none'; script-src https:; style-src 'self' https: 'unsafe-inline'
  • X-Download-Options:noopen
  • X-Permitted-Cross-Domain-Policies:none

如果你想修改這些Header的值俺夕,那么就需要使用這些Headers對(duì)應(yīng)的后綴裳凸,如下:

  • xss-protection-header
  • strict-transport-security
  • frame-options
  • content-type-options
  • referrer-policy
  • content-security-policy
  • download-options
  • permitted-cross-domain-policies

配置示例:

spring:
  cloud:
    gateway:
      filter:
        secure-headers:
          # 修改 X-Xss-Protection 的值為 2; mode=unblock
          xss-protection-header: 2; mode=unblock

如果想禁用某些Header,可使用如下配置:

spring:
  cloud:
    gateway:
      filter:
        secure-headers:
          # 多個(gè)使用逗號(hào)(,)分隔
          disable: frame-options,download-options

18劝贸、SetPath GatewayFilter Factory

修改原始的請(qǐng)求路徑姨谷,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: setpath_route
        uri: https://example.org
        predicates:
        - Path=/foo/{segment}
        filters:
        - SetPath=/{segment}

該配置使訪問(wèn) ${GATEWAY_URL}/foo/bar 時(shí)會(huì)轉(zhuǎn)發(fā)到 https://example.org/bar ,也就是原本的/foo/bar被修改為了/bar

19映九、SetResponseHeader GatewayFilter Factory

修改原始響應(yīng)中某個(gè)Header的值梦湘,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: setresponseheader_route
        uri: https://example.org
        filters:
        - SetResponseHeader=X-Response-Foo, Bar

將原始響應(yīng)中 X-Response-Foo 的值修改為 Bar

20、SetStatus GatewayFilter Factory

修改原始響應(yīng)的狀態(tài)碼件甥,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: setstatusstring_route
        uri: https://example.org
        filters:
        # 字符串形式
        - SetStatus=BAD_REQUEST
      - id: setstatusint_route
        uri: https://example.org
        filters:
        # 數(shù)字形式
        - SetStatus=401

SetStatusd的值可以是數(shù)字捌议,也可以是字符串。但一定要是Spring HttpStatus 枚舉類(lèi)中的值引有。上面這兩種配置都可以返回401這個(gè)HTTP狀態(tài)碼瓣颅。

21、StripPrefix GatewayFilter Factory

用于截?cái)嘣颊?qǐng)求的路徑譬正,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: nameRoot
        uri: http://nameservice
        predicates:
        - Path=/name/**
        filters:
        # 數(shù)字表示要截?cái)嗟穆窂降臄?shù)量
        - StripPrefix=2

如上配置宫补,如果請(qǐng)求的路徑為 /name/bar/foo ,那么則會(huì)截?cái)喑?code>/foo后進(jìn)行轉(zhuǎn)發(fā) 曾我,也就是會(huì)截?cái)?個(gè)路徑粉怕。

22、Retry GatewayFilter Factory

針對(duì)不同的響應(yīng)進(jìn)行重試抒巢,例如可以針對(duì)HTTP狀態(tài)碼進(jìn)行重試贫贝,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: retry_test
        uri: http://localhost:8080/flakey
        predicates:
        - Host=*.retry.com
        filters:
        - name: Retry
          args:
            retries: 3
            statuses: BAD_GATEWAY

可配置如下參數(shù):

  • retries:重試次數(shù)
  • statuses:需要重試的狀態(tài)碼,取值在 org.springframework.http.HttpStatus
  • methods:需要重試的請(qǐng)求方法蛉谜,取值在 org.springframework.http.HttpMethod
  • series:HTTP狀態(tài)碼序列平酿,取值在 org.springframework.http.HttpStatus.Series

23、RequestSize GatewayFilter Factory

設(shè)置允許接收最大請(qǐng)求包的大小悦陋,配置示例:

spring:
  cloud:
    gateway:
      routes:
      - id: request_size_route
      uri: http://localhost:8080/upload
      predicates:
      - Path=/upload
      filters:
      - name: RequestSize
        args:
          # 單位為字節(jié)
          maxSize: 5000000

如果請(qǐng)求包大小超過(guò)設(shè)置的值蜈彼,則會(huì)返回 413 Payload Too Large以及一個(gè)errorMessage

24、Modify Request Body GatewayFilter Factory

在轉(zhuǎn)發(fā)請(qǐng)求之前修改原始請(qǐng)求體內(nèi)容俺驶,該過(guò)濾器工廠只能通過(guò)代碼配置幸逆,不支持在配置文件中配置棍辕。代碼示例:

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("rewrite_request_obj", r -> r.host("*.rewriterequestobj.org")
            .filters(f -> f.prefixPath("/httpbin")
                .modifyRequestBody(String.class, Hello.class, MediaType.APPLICATION_JSON_VALUE,
                    (exchange, s) -> return Mono.just(new Hello(s.toUpperCase())))).uri(uri))
        .build();
}

static class Hello {
    String message;

    public Hello() { }

    public Hello(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}

Tips:該過(guò)濾器工廠處于 BETA 狀態(tài),未來(lái)API可能會(huì)變化还绘,生產(chǎn)環(huán)境請(qǐng)慎用

25楚昭、Modify Response Body GatewayFilter Factory

可用于修改原始響應(yīng)體的內(nèi)容,該過(guò)濾器工廠同樣只能通過(guò)代碼配置拍顷,不支持在配置文件中配置抚太。代碼示例:

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("rewrite_response_upper", r -> r.host("*.rewriteresponseupper.org")
            .filters(f -> f.prefixPath("/httpbin")
                .modifyResponseBody(String.class, String.class,
                    (exchange, s) -> Mono.just(s.toUpperCase()))).uri(uri)
        .build();
}

Tips:該過(guò)濾器工廠處于 BETA 狀態(tài),未來(lái)API可能會(huì)變化昔案,生產(chǎn)環(huán)境請(qǐng)慎用

26尿贫、Default Filters

Default Filters用于為所有路由添加過(guò)濾器工廠,也就是說(shuō)通過(guò)Default Filter所配置的過(guò)濾器工廠會(huì)作用到所有的路由上踏揣。配置示例:

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Foo, Default-Bar
      - PrefixPath=/httpbin

官方文檔:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末庆亡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子捞稿,更是在濱河造成了極大的恐慌又谋,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件娱局,死亡現(xiàn)場(chǎng)離奇詭異彰亥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)衰齐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)剩愧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人娇斩,你說(shuō)我怎么就攤上這事⊙妫” “怎么了犬第?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)芒帕。 經(jīng)常有香客問(wèn)我歉嗓,道長(zhǎng),這世上最難降的妖魔是什么背蟆? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任鉴分,我火速辦了婚禮,結(jié)果婚禮上带膀,老公的妹妹穿的比我還像新娘志珍。我一直安慰自己,他們只是感情好垛叨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布伦糯。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪敛纲。 梳的紋絲不亂的頭發(fā)上喂击,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音淤翔,去河邊找鬼翰绊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛旁壮,可吹牛的內(nèi)容都是我干的监嗜。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼寡具,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼秤茅!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起童叠,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤框喳,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后厦坛,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體五垮,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年杜秸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了放仗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撬碟,死狀恐怖诞挨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呢蛤,我是刑警寧澤惶傻,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站其障,受9級(jí)特大地震影響银室,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜励翼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一蜈敢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧汽抚,春花似錦抓狭、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狱从。三九已至,卻和暖如春叠纹,著一層夾襖步出監(jiān)牢的瞬間季研,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工誉察, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留与涡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓持偏,卻偏偏與公主長(zhǎng)得像驼卖,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鸿秆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容