精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBoot 實現 Token 無感刷新機制

開發 前端
在前后端分離架構主導的今天,身份認證已成為系統安全的第一道防線。Token認證憑借其無狀態特性成為主流方案,但Token有效期始終是平衡安全性與用戶體驗的難點 —— 過短導致頻繁登錄,過長增加安全風險。

前言

在前后端分離架構主導的今天,身份認證已成為系統安全的第一道防線。Token認證憑借其無狀態特性成為主流方案,但Token有效期始終是平衡安全性與用戶體驗的難點 —— 過短導致頻繁登錄,過長增加安全風險。

傳統 Token 認證的痛點

傳統單Token機制存在難以調和的矛盾:

  • 安全性需求:Token應短期有效,降低被盜用后的風險窗口
  • 用戶體驗需求:Token應長期有效,避免頻繁登錄打斷操作流程
  • 業務連續性:金融、醫療等領域對接口連續性要求極高,Token過期可能導致業務中斷

雙 Token 機制:無感刷新的核心

無感刷新的解決方案是引入雙Token架構:

  • Access Token(訪問令牌):短期有效(如2小時),用于接口訪問
  • Refresh Token(刷新令牌):長期有效(如7天),僅用于獲取新Access Token

工作流程如下:

  • 用戶登錄時,服務器同時生成Access TokenRefresh Token
  • 客戶端請求接口時攜帶Access Token
  • Access Token過期時,客戶端使用Refresh Token靜默獲取新Access Token
  • Refresh Token過期,則要求用戶重新登錄

這種機制既保證了接口訪問的短期安全性,又通過Refresh Token延長了用戶會話周期。

效果圖

圖片圖片

  • 用戶登錄功能,獲取Access TokenRefresh Token
  • 展示Token信息和過期時間
  • API請求測試區域,支持自定義請求路徑、方法和請求體
  • 自動處理Token過期情況,當Access Token過期時會自動使用Refresh Token刷新
  • 記錄Token刷新歷史,方便查看刷新情況

實現

JWT 工具類:Token 生成與解析

@Component
public class JwtUtil {

    private final String SECRET_KEY = "yianweilai"; // 實際項目中應從配置文件獲取

    /**
     * 從 token 中提取用戶名
     */
    public String extractUsername(String token) {
        return extractClaim(token, Claims::getSubject);
    }

    /**
     * 從 token 中提取過期時間
     */
    public Date extractExpiration(String token) {
        return extractClaim(token, Claims::getExpiration);
    }

    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = extractAllClaims(token);
        return claimsResolver.apply(claims);
    }

    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
    }

    /**
     * 檢查 token 是否過期
     */
    public Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }

    /**
     * 生成 token
     */
    public String generateToken(String username, int seconds) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username, seconds);
    }

    private String createToken(Map<String, Object> claims, String subject, int seconds) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + seconds * 1000))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    /**
     * 驗證 token
     */
    public Boolean validateToken(String token, UserDetails userDetails) {
        final String username = extractUsername(token);
        return (username.equals(userDetails.getUsername()) && !isTokenExpired(token));
    }
}

Token 服務:管理 Token 生命周期

@Service
public class TokenService {

    private static final String REFRESH_TOKEN_KEY_PREFIX = "refresh_token:";

    @Autowired
    private JwtUtil jwtUtil;

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public String generateAccessToken(String username) {
        return jwtUtil.generateToken(username, 5);
    }

    public String generateRefreshToken(String username) {
        String refreshToken = jwtUtil.generateToken(username, 10);
        // 將 Refresh Token 存儲到 Redis
        redisTemplate.opsForValue().set(REFRESH_TOKEN_KEY_PREFIX + username, refreshToken, 10, TimeUnit.SECONDS);
        return refreshToken;
    }

    public boolean validateRefreshToken(String username, String refreshToken) {
        // 從 Redis 獲取存儲的 Refresh Token
        String storedRefreshToken = redisTemplate.opsForValue().get(REFRESH_TOKEN_KEY_PREFIX + username);

        if (storedRefreshToken != null && storedRefreshToken.equals(refreshToken)) {
            // 驗證 Refresh Token 是否過期
            return !jwtUtil.isTokenExpired(refreshToken);
        }
        returnfalse;
    }
}

以上測試需要,所以時間周期比較短。

攔截器:自動處理 Token 刷新

@Component
public class JwtAuthenticationFilter extends OncePerRequestFilter {

    private final JwtUtil jwtUtil;
    private final UserDetailsService userDetailsService;
    private final TokenService tokenService;

    public JwtAuthenticationFilter(JwtUtil jwtUtil, UserDetailsService userDetailsService, TokenService tokenService) {
        this.jwtUtil = jwtUtil;
        this.userDetailsService = userDetailsService;
        this.tokenService = tokenService;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        // 從請求頭中獲取 token
        final String authorizationHeader = request.getHeader("Authorization");

        String username = null;
        String accessToken = null;
        String refreshToken = null;

        // 解析 token
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            accessToken = authorizationHeader.substring(7);
            try {
                username = jwtUtil.extractUsername(accessToken);
            } catch (ExpiredJwtException e) {
                // Access Token 已過期,嘗試使用 Refresh Token 刷新
                refreshToken = request.getHeader("Refresh-Token");
                if (refreshToken != null) {
                    try {
                        String refreshUsername = jwtUtil.extractUsername(refreshToken);
                        if (refreshUsername != null) {
                            // 驗證 Refresh Token 是否有效
                            boolean isValidRefreshToken = tokenService.validateRefreshToken(refreshUsername, refreshToken);
                            if (isValidRefreshToken) {
                                // 生成新的 Access Token
                                String newAccessToken = tokenService.generateAccessToken(refreshUsername);
                                response.setHeader("x-new-access-token", newAccessToken);
                                username = refreshUsername;
                                accessToken = newAccessToken;
                            }
                        }
                    } catch (Exception ex) {
                        // Refresh Token 無效,讓用戶重新登錄
                        response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                        response.getWriter().write("Refresh-Token失效,請重新登錄!");
                        return;
                    }
                }
            } catch (Exception e) {
                // 其他 token 解析錯誤
                response.setStatus(HttpServletResponse.SC_FORBIDDEN);
                response.getWriter().write("Token解析錯誤!");
                return;
            }
        }

        // 設置認證信息
        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = this.userDetailsService.loadUserByUsername(username);

            if (jwtUtil.validateToken(accessToken, userDetails)) {
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }
        }

        filterChain.doFilter(request, response);
    }
}

前端配合方案

Token 存儲策略
  • Access Token:存儲在內存或localStorage(短期有效,風險較低)
  • Refresh Token:存儲在HttpOnly Cookie(防止XSS攻擊)
請求攔截器:自動攜帶 Token
// 創建請求攔截器和響應攔截器
    const apiClient = {
        // 請求攔截器 - 為每個請求添加認證頭
        requestInterceptor: function(config) {
            if (tokens.accessToken) {
                config.headers = config.headers || {};
                config.headers['Authorization'] = `Bearer ${tokens.accessToken}`;

                // 添加Refresh Token到請求頭
                if (tokens.refreshToken) {
                    config.headers['Refresh-Token'] = tokens.refreshToken;
                }
            }
            return config;
        },

        // 響應攔截器 - 處理響應和錯誤
        responseInterceptor: async function(response) {
            // 檢查是否有新的Access Token
            const newAccessToken = response.headers.get('x-new-access-token');

            if (newAccessToken) {
                // 更新本地存儲的Token
                tokens.accessToken = newAccessToken;

                // 保存到本地存儲
                saveTokensToStorage();

                // 更新UI顯示
                updateTokenDisplay();

                // 記錄刷新歷史
                addRefreshHistory(Date.now(), '響應攔截器檢測到新Token', '自動更新成功');
                showToast('Access Token 已自動更新', 'success');
            }

            return response;
        },

        // 錯誤處理攔截器
        errorInterceptor: async function(error) {
            const originalRequest = error.config;

            // 處理401錯誤
            if (error.response && error.response.status === 401) {
                // 檢查是否已經嘗試過刷新Token
                if (originalRequest._retry) {
                    // 已經嘗試過刷新,仍然失敗,需要重新登錄
                    showToast('Token驗證失敗,請重新登錄', 'error');
                    logout();
                    return Promise.reject(error);
                }

                // 標記已經嘗試刷新
                originalRequest._retry = true;

                try {
                    // 嘗試使用Refresh Token刷新
                    showToast('Token已過期,嘗試刷新...');
                    const isRefreshed = await refreshAccessToken();

                    if (isRefreshed) {
                        // 刷新成功,重新嘗試原始請求
                        showToast('Token刷新成功,重試請求...');
                        return this.fetch(originalRequest.url, originalRequest);
                    }
                } catch (refreshError) {
                    showToast('Token刷新失敗,請重新登錄', 'error');
                    logout();
                    return Promise.reject(refreshError);
                }
            }

            return Promise.reject(error);
        },

        // 封裝fetch請求,應用攔截器
        fetch: async function(url, config = {}) {
            try {
                // 應用請求攔截器
                const requestConfig = this.requestInterceptor({
                    method: 'GET',
                    ...config,
                    url
                });

                // 發送請求
                const response = await fetch(url, requestConfig);

                // 處理非成功狀態碼
                if (!response.ok) {
                    throw {
                        response,
                        config: requestConfig
                    };
                }

                // 應用響應攔截器
                return this.responseInterceptor(response);
            } catch (error) {
                // 應用錯誤攔截器
                return this.errorInterceptor(error);
            }
        }
    };

安全考慮

實現Token無感刷新時,需要注意以下安全問題:

  • Refresh Token 的安全性Refresh Token有效期較長,應妥善保管,建議存儲在HttpOnly Cookie中,防止XSS攻擊
  • Token泄露風險:使用HTTPS協議,防止Token在傳輸過程中被截獲
  • 單點登錄控制:每個用戶只允許有一個有效的Refresh Token,當用戶登錄時,生成新的Refresh Token并使舊的失效
  • Token過期策略:合理設置Access TokenRefresh Token的有效期,平衡安全性和用戶體驗
  • 異常處理:當檢測到Token被盜用時,應立即失效相關Token,并通知用戶
責任編輯:武曉燕 來源: 一安未來
相關推薦

2011-07-15 09:57:03

MongoDB緩存刷新

2021-12-08 06:53:28

Choreograph屏幕機制

2025-05-07 08:00:00

刷新令牌自動續簽FastAPI

2025-06-23 04:00:00

接口SpringToken

2021-04-21 07:53:13

Android屏幕刷新

2020-10-13 08:36:30

React 架構機制

2022-09-28 12:39:46

axios攔截器

2025-10-30 07:30:00

JavaScript身份驗證Token

2024-07-11 10:38:02

2010-09-06 08:43:13

.NET 4

2020-09-21 14:35:20

VuenextTick前端

2010-03-10 11:55:30

Mocha BSM運維管理摩卡軟件

2024-04-17 12:59:18

前端Token開發

2010-06-02 11:33:26

Linux 內存監控

2024-01-03 21:50:32

緩存機制請求

2012-04-12 10:19:08

Ajax.NET

2025-04-03 00:45:00

2016-10-21 09:29:53

嵌入式Linux更新機制

2025-10-23 08:50:32

2025-03-31 08:40:00

微服務OSS適配器
點贊
收藏

51CTO技術棧公眾號

亚洲看片网站| 国产精品视频网站| 亚洲天堂视频一区| 综合久久av| 亚洲国产成人va在线观看天堂 | 欧美大片91| 欧美日韩免费看| 正在播放一区| 欧美日韩国产综合视频| 韩国av一区二区三区在线观看| 午夜精品99久久免费| 色欲狠狠躁天天躁无码中文字幕| 久久亚洲精精品中文字幕| 欧美日韩在线第一页| 一区二区三区av| 嫩草在线播放| 国产成都精品91一区二区三| 国产精品久久久久久久久久久久| 久草国产在线观看| 色喇叭免费久久综合| 日韩成人av在线| 在线成人精品视频| 成人全视频在线观看在线播放高清| 夜色激情一区二区| 在线观看欧美一区| 在线a人片免费观看视频| gogo大胆日本视频一区| 91在线高清免费观看| 手机av免费观看| 一区二区三区福利| 色综合久综合久久综合久鬼88| 手机毛片在线观看| 国产精品亚洲片在线播放| 亚洲黄色有码视频| 国产人妻精品午夜福利免费| 日韩精品第二页| 欧洲国内综合视频| www.国产区| gogo亚洲高清大胆美女人体 | 波多野结衣在线观看一区| 999亚洲国产精| 久久久亚洲国产天美传媒修理工| www.毛片com| 久久久久久久久久久久久久久久久久| 原创国产精品91| 国产美女永久免费无遮挡| 亚欧日韩另类中文欧美| 亚洲国产毛片完整版| 呦呦视频在线观看| 欧美调教在线| 亚洲欧美国产日韩中文字幕| 国产精品伦子伦| 日本韩国欧美超级黄在线观看| 亚洲激情小视频| 亚洲图片综合网| 网曝91综合精品门事件在线| 亚洲精品国产精品乱码不99按摩| www.日本高清| 精品一区毛片| 中文字幕自拍vr一区二区三区| 日韩一区二区三区四区视频| 99久久精品费精品国产风间由美| 久久艳片www.17c.com| 青娱乐免费在线视频| 一区视频在线看| 91精品国产色综合久久不卡98口| 五月天综合激情网| 日韩不卡一区二区| 成人在线视频网| 午夜精品久久久久久久99热黄桃 | 亚洲国产精品推荐| 一区二区三区免费在线观看视频| 美女亚洲一区| 中文字幕亚洲专区| 色欲人妻综合网| 野花国产精品入口| 国产成人福利网站| 国产又爽又黄免费软件| 成人美女视频在线观看| 蜜桃传媒视频麻豆第一区免费观看| 成年人在线看| 亚洲在线观看免费视频| 黄在线观看网站| 国产精品3区| 亚洲精品成人网| 国产精品综合激情| 欧美精选一区| 人人澡人人澡人人看欧美| 97精品久久人人爽人人爽| 国产69精品久久99不卡| 日本不卡二区| 性直播体位视频在线观看| 欧美视频免费在线| 欧美黄色性生活| 九九热播视频在线精品6| 中文字幕亚洲欧美一区二区三区| 久久久久久久久99| 蜜桃久久av一区| 国产欧美日韩伦理| 日本最新在线视频| 欧美午夜片欧美片在线观看| 在线免费看v片| 亚洲制服一区| 欧美激情视频网| 中文字幕精品在线观看| 成人激情综合网站| 青青草原国产免费| 欧美黄色网页| 亚洲成成品网站| 成年人视频软件| 亚洲三级视频| 亚洲综合自拍一区| av成人手机在线| 岛国av一区二区三区| 黄色三级视频在线播放| 国产一区不卡| 91豆花精品一区| www.久久成人| 1区2区3区精品视频| 日本一极黄色片| 久久综合五月婷婷| 欧美激情视频三区| 成人av无码一区二区三区| 中文字幕在线一区免费| 一本久道综合色婷婷五月| 97人人澡人人爽91综合色| 久久色免费在线视频| 国产污视频网站| 91麻豆免费观看| 欧美久久在线观看| 97成人在线| 九色精品美女在线| 国产黄a三级三级三级| 最新久久zyz资源站| 艹b视频在线观看| 欧美亚洲激情| 国产精品pans私拍| 久青草国产在线| 一本一本大道香蕉久在线精品| 超碰97在线资源站| 一本久道久久久| 精品中文字幕人| jk漫画禁漫成人入口| 日韩精品中文字幕久久臀| 精品久久免费视频| 成人av免费在线| 亚欧无线一线二线三线区别| 国产在线播放精品| 91成人天堂久久成人| 色资源在线观看| 日本高清视频一区二区| 国产精品20p| 捆绑调教美女网站视频一区| 亚洲国产精品日韩| 国产精品3区| 欧美第一淫aaasss性| 精品毛片在线观看| 精品国产31久久久久久| 亚洲第一页av| 久久久精品五月天| 视频一区视频二区视频| 婷婷激情成人| 欧美激情综合亚洲一二区| 手机看片一区二区三区| 色综合久久99| 人与动物性xxxx| 国产剧情在线观看一区二区| 国产av人人夜夜澡人人爽麻豆| 日韩av资源网| 国产女人18毛片水18精品| caoporn免费在线| 日韩大陆毛片av| www.久久网| 亚洲美女偷拍久久| 亚洲国产第一区| 人人狠狠综合久久亚洲| 99热这里只有精品7| 91国内精品白嫩初高生| 欧美资源在线观看| 成人在线播放| 日韩电影中文字幕| 一级二级三级视频| 午夜日韩在线电影| 日本美女xxx| 成人美女视频在线观看| 2025韩国理伦片在线观看| 欧美日韩三级| 日韩三级电影网站| jizz性欧美2| 国产精品久久久久久网站| 伊人福利在线| 国产亚洲人成a一在线v站| 亚洲国产精品久久久久爰性色| 色欧美片视频在线观看| 欧美极品视频在线观看| 日本一区二区视频在线| 动漫美女无遮挡免费| 另类小说一区二区三区| 欧美二区在线视频| 亚洲精品一二三区区别| 欧美不卡三区| 亚洲一区二区三区日本久久九| 国产精品福利网站| 国产拍在线视频| 另类少妇人与禽zozz0性伦| 青青操在线视频| 欧美电影精品一区二区| 亚洲一区二区天堂| 色吊一区二区三区| 国产无遮挡又黄又爽在线观看 | 一区二区三区精品国产| 天堂网av成人| 肥熟一91porny丨九色丨| 久久日本片精品aaaaa国产| 欧美在线免费观看| av电影免费在线看| 九九热最新视频//这里只有精品| 在线看的av网站| 亚洲欧美国产另类| 亚洲欧美色视频| 亚洲成人999| 亚洲精选一区二区三区| 日韩三级在线免费观看| 国产美女永久免费| 7777精品伊人久久久大香线蕉的| 青青艹在线观看| 欧美影院午夜播放| 男人天堂2024| 欧美性猛交xxxx偷拍洗澡| 国产对白videos麻豆高潮| 亚洲精品高清视频在线观看| 亚洲区一区二区三| 国产精品欧美久久久久无广告 | 欧美激情二区| 在线亚洲国产精品网| 国产精品久久久久一区二区国产| 亚洲女人天堂av| 手机福利在线| 亚洲欧美在线播放| 黄色片在线免费观看| 亚洲免费人成在线视频观看| 青青草视频在线观看| 亚洲欧美国产精品专区久久| 精品亚洲综合| 色噜噜国产精品视频一区二区| 日本在线视频网| 久久综合免费视频| 欧美性爽视频| 午夜免费久久久久| 天堂电影一区| 国产精品99免视看9| 成人av集中营| 成人网中文字幕| 亚洲啊v在线免费视频| 国产精品久久7| 日韩精品欧美大片| 视频在线99re| 亚洲男女av一区二区| 99久久久精品视频| 免费日韩av片| 美女在线视频一区二区| 国产一区二区三区蝌蚪| 国产女主播在线播放| 91在线观看污| 免费成人深夜天涯网站| 亚洲欧洲综合另类| 日本午夜精品理论片a级app发布| 黑人精品xxx一区一二区| 午夜精品久久久久久久蜜桃| 欧美日韩综合一区| 成人av免费播放| 亚洲欧美制服综合另类| 麻豆影院在线| 97超碰蝌蚪网人人做人人爽| 日韩精品一区二区三区| 成人日韩av在线| 久久久伦理片| 亚洲精品人成| 亚洲美女黄网| 中文字幕 91| 成人免费视频视频在线观看免费| 蜜桃av免费看| 亚洲免费资源在线播放| 天天操天天爽天天干| 欧美中文字幕一二三区视频| 亚洲av无码一区二区三区性色| 国产婷婷97碰碰久久人人蜜臀| 九七久久人人| 欧洲亚洲女同hd| 国产在线不卡一区二区三区| 免费在线成人av电影| 亚洲成人精品| 色综合av综合无码综合网站| 国产精品一区久久久久| 精品人伦一区二区三电影| 一区二区三区在线看| 亚洲s码欧洲m码国产av| 日韩欧美中文字幕精品| 九色在线播放| 午夜精品福利电影| 精品视频在线观看网站| 色婷婷精品国产一区二区三区| 黄色另类av| 17c国产在线| 久久久噜噜噜久噜久久综合| 国产在线视频二区| 51午夜精品国产| 91精彩在线视频| 日本精品va在线观看| 9l视频自拍九色9l视频成人| 欧美一区二视频在线免费观看| 合欧美一区二区三区| 国产一级片自拍| 久久精品视频免费| 亚洲精品国产精品乱码| 日韩精品一区二区三区视频在线观看| av网站无病毒在线| 国产高清视频一区三区| 久久悠悠精品综合网| 久久这里只有精品18| 国产原创一区二区三区| av资源在线免费观看| 91豆麻精品91久久久久久| 色在线免费视频| 91精品国产色综合久久不卡98口| 蜜桃在线一区| 欧美精品一区二区性色a+v| 麻豆极品一区二区三区| 少妇精品无码一区二区免费视频| 色8久久精品久久久久久蜜| 日本一级在线观看| 欧美在线视频观看免费网站| 日韩大尺度在线观看| 99爱视频在线| 久久精品视频一区二区| 日本欧美www| 伊人久久综合97精品| 亚洲mmav| 亚洲春色在线视频| 蜜臀av一区二区在线观看| 天天操天天舔天天射| 欧美自拍丝袜亚洲| 五月香视频在线观看| 成人黄色免费看| 中文视频一区| 香蕉久久久久久av成人| 亚洲一区中文在线| 少妇精品视频一区二区 | 黑人巨茎大战欧美白妇 | 91成人在线免费视频| 日本丶国产丶欧美色综合| 成人在线观看黄色| 国产三级精品网站| 一区二区三区午夜视频| 中文字幕第六页| 亚洲成年人影院| 性xxxx视频播放免费| 国产v综合ⅴ日韩v欧美大片| 欧美日韩有码| 91热视频在线观看| 亚洲综合免费观看高清在线观看| 色欲久久久天天天综合网| 日韩av片免费在线观看| 91一区二区| 久草免费资源站| 日韩欧美在线第一页| 日韩专区在线| 国产精品视频在线免费观看| 男女av一区三区二区色多| 国产aaaaaaaaa| 日韩欧美一区在线| 最近高清中文在线字幕在线观看1| 日韩中文字幕av在线| 国产在线播放一区三区四| 国产一级一片免费播放放a| 亚洲人高潮女人毛茸茸| www.欧美视频| 男女高潮又爽又黄又无遮挡| 中文字幕欧美三区| 亚洲第一大网站| 国产精品久久二区| 欧美涩涩视频| 免费成人深夜天涯网站| 日韩美女主播在线视频一区二区三区| 新版的欧美在线视频| 一区二区三区免费看| 不卡的av在线| 亚洲一区精品在线观看| 6080yy精品一区二区三区| 国产精品久久久久久麻豆一区软件 | 亚洲精品中文字幕乱码三区不卡| 国产成人精品三级| 在线观看亚洲黄色| 久久久久久久久久久久av| 第九色区aⅴ天堂久久香| 2一3sex性hd| 日韩一区二区在线观看视频 | 精品国产区在线| 精油按摩中文字幕久久| 在线观看亚洲欧美|