精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲欧美日韩在线综合| 久热在线中文字幕色999舞| 国产免费黄色av| 成人影视在线播放| 国产在线精品一区二区三区不卡| 欧美激情久久久久久| 亚洲av无码一区二区三区人| 国产精品中文| 色播五月激情综合网| 免费久久久久久| 亚洲av成人无码网天堂| 久久精品国产精品亚洲精品| 海角国产乱辈乱精品视频| 精品无码人妻一区二区免费蜜桃| 日韩精品亚洲专区在线观看| 91国在线观看| 日本一本中文字幕| 淫片在线观看| 91毛片在线观看| 亚洲一区久久久| 最近中文字幕在线视频| 99热精品在线| 九九精品在线视频| 麻豆一区在线观看| 国产欧美日韩影院| 亚洲第一精品夜夜躁人人躁| 网站在线你懂的| 亚洲伦乱视频| 亚洲韩国精品一区| 日韩一级特黄毛片| 免费在线观看黄色| 欧美国产日韩一二三区| 精品乱子伦一区二区三区| 国产视频手机在线观看| 日av在线不卡| 日本亚洲欧美成人| 欧美一区二区三区四| 欧美暴力喷水在线| 欧美xxxx18国产| 永久免费看片视频教学| 日韩中字在线| 日韩在线视频一区| 一区二区免费在线观看视频| 91精品国产自产精品男人的天堂| 5月丁香婷婷综合| 午夜久久久精品| 成人va天堂| 色婷婷久久久久swag精品 | 人人澡人人澡人人看欧美| 久久久久久久久久久网| 欧美 日韩 国产一区二区在线视频| www.日韩.com| 国产黄色的视频| 最新国产精品久久久| 欧美剧在线观看| 日本妇女毛茸茸| 欧美色综合网| 久久久久国产精品一区| 色播视频在线播放| 国产一级久久| 国产成人精品一区二区| 欧美一级做a爰片免费视频| 美日韩一区二区三区| 国产精品久久久久秋霞鲁丝| 中文字幕视频免费观看| 蜜臀久久99精品久久久久宅男| 国产精品看片资源| 一级黄色片在线播放| 国产一区啦啦啦在线观看| 亚洲一区二区自拍| 神马久久久久久久久久| 久久精品一区八戒影视| 亚洲精品中文字幕乱码三区不卡| 免费av在线网站| 一区二区久久久久| 欧美 日韩 激情| 韩国成人在线| 91精品久久久久久久91蜜桃| 老司机av网站| 中文字幕伦av一区二区邻居| 日韩在线精品视频| 久久免费小视频| 亚洲欧美日韩国产一区二区| 国产精品视频区1| 亚洲av永久纯肉无码精品动漫| 成人av第一页| 亚洲欧美国产不卡| 后进极品白嫩翘臀在线播放| 日韩欧美国产中文字幕| 99九九99九九九99九他书对| 精品成人自拍视频| 中文字幕av一区| 国产亚洲精品久久久久久无几年桃| 亚洲男女自偷自拍| 成人av在线网址| 亚州精品国产精品乱码不99按摩| 国产日韩欧美亚洲| 日韩一级性生活片| 岛国一区二区| 亚洲国产精品人久久电影| 国产探花视频在线播放| 国精品一区二区| 国产精品旅馆在线| www.色日本| 中文字幕欧美日韩一区| 国产美女在线一区| 国产成人精品一区二区三区免费 | 午夜国产福利在线观看| 欧美黄色网视频| 久久夜色精品亚洲噜噜国产mv| 成人午夜视频精品一区| 国产一区二区三区综合| 日本最新一区二区三区视频观看| 尤物在线网址| 欧美三级日韩在线| 国产精品九九九九九| 中文字幕日韩一区二区不卡| 日韩av观看网址| 国产91麻豆视频| 亚洲视频狠狠干| 国产日韩成人内射视频| 精品国产影院| 欧美精品激情在线观看| 国产影视一区二区| 国产色产综合色产在线视频| 人妻夜夜添夜夜无码av| 久久精品免视看国产成人| 在线观看免费高清视频97| 国产免费av一区二区| 成人精品gif动图一区| 欧洲金发美女大战黑人| 91精品福利观看| 中文字幕亚洲二区| 国产一卡二卡三卡| 久久久久久一二三区| 日韩av一二三四区| www.日本少妇| 91美女主播在线视频| 欧美一区二区三区啪啪| 肉色超薄丝袜脚交69xx图片| 肉色丝袜一区二区| 欧美日韩免费观看一区| 精品国产免费人成网站| 国产丝袜一区视频在线观看 | 黄色一区二区三区| 怡红院一区二区| 亚洲婷婷免费| 国产一区高清视频| 亚洲风情在线资源| 亚洲精品一区二区在线| 日本黄色一级视频| 久久久久久久综合狠狠综合| 能看的毛片网站| 国产精品入口久久| 国产精品夜间视频香蕉| 蜜桃视频在线观看www社区| 欧美日韩免费观看一区三区| 国产破处视频在线观看| 激情综合色综合久久| 日韩中文在线字幕| 中文字幕区一区二区三| 98视频在线噜噜噜国产| 日本成人一区二区三区| 欧美中文字幕一区二区三区亚洲| 永久免费毛片在线观看| 久久精品国产999大香线蕉| 欧洲美女和动交zoz0z| 人人九九精品视频| 97超级碰碰碰久久久| 欧美日韩国产综合视频| 欧美日韩一区在线| www.超碰在线观看| aa级大片欧美| 黄色永久免费网站| 国产精品一区二区入口九绯色| 亚洲无中文字幕| 国产一区二区精品免费| 三级成人黄色影院| 色噜噜国产精品视频一区二区 | videos性欧美另类高清| 亚洲性视频网站| 国产精品久久婷婷| 亚洲成年人网站在线观看| 三级网站在线免费观看| 麻豆成人免费电影| 久久在线中文字幕| 国产成人精品一区二区免费看京| 国产精品在线看| 丁香花高清在线观看完整版| 亚洲欧美中文日韩在线| 国产情侣激情自拍| 日韩欧美中文免费| 日本高清一二三区| xnxx国产精品| 亚洲一级片免费观看| 国产日本精品| 老汉色影院首页| 久久99精品久久久久久园产越南| 91成人伦理在线电影| 三上悠亚激情av一区二区三区| 欧美精品一区二区三区国产精品| 日韩大片b站免费观看直播| 在线综合视频播放| 狠狠人妻久久久久久| 一区二区三区在线视频免费| 成人无码av片在线观看| 成人h动漫精品一区二| 亚洲欧美日本一区二区三区| 99综合精品| 久久久久久久久影视| 精品国产乱码久久久久久1区2匹| 国产精品乱码一区二区三区| 国产精品伊人| 国产不卡视频在线| 国产后进白嫩翘臀在线观看视频 | 自由的xxxx在线视频| 亚洲午夜精品久久久久久性色| www.xxx国产| 欧美日本国产视频| 波多野结衣网站| 欧美视频免费在线| 日本一区二区不卡在线| 亚洲精品少妇30p| 蜜臀久久99精品久久久久久| 99热精品国产| 国产精九九网站漫画| 狠狠久久亚洲欧美| 色婷婷成人在线| 性欧美疯狂猛交69hd| 91蝌蚪国产九色| 久久久精品国产一区二区三区| 国产精品毛片一区二区在线看舒淇| 欧美性少妇18aaaa视频| 国产情侣在线视频| 亚洲一区二区高清| 中文字幕人妻一区二| 亚洲欧美影音先锋| 一本在线免费视频| 国产精品青草综合久久久久99| 免费在线观看污| 久久免费电影网| 亚洲理论片在线观看| 久久久久久一级片| 中文字幕网站在线观看| 国产三级久久久| 国产农村妇女精品一区| 中文字幕不卡三区| 国产黄色片在线| 国产精品嫩草影院av蜜臀| 开心激情五月网| 综合av第一页| 久久中文字幕无码| 午夜精品久久久久久久久久久 | 欧美日韩免费一区二区三区| 少妇又紧又色又爽又刺激视频| 欧美视频精品在线观看| 中文字幕在线观看欧美| 欧美日韩电影在线播放| 国产精品视频久久久久久| 欧美一区二区高清| 亚洲国产精品久久人人爱潘金莲| 欧美成人官网二区| 天天爽夜夜爽夜夜爽| 亚洲视频axxx| 国内精品不卡| 午夜精品久久久久久久白皮肤| 成年女人在线看片| 国产成人在线一区| 久久久免费人体| 99久久精品免费看国产四区| 久久久久久久久久久久久久久久久久久久| 精品国产一区二区三| 久久成人高清| 国产奶头好大揉着好爽视频| 国内成人在线| 欧洲熟妇精品视频| 国产一区二区免费看| 亚洲av无码一区二区三区观看| 欧美国产精品专区| 久久久无码精品亚洲国产| 精品欧美aⅴ在线网站| 一区二区三区免费在线| 精品国产一区二区亚洲人成毛片| 免费动漫网站在线观看| 美女国内精品自产拍在线播放| av成人影院在线| 国产精品中文久久久久久久| jizz国产精品| 综合av第一页| 一起操在线播放| 欧美日韩在线免费观看| 国产喷水吹潮视频www| 日韩精品在线看| 免费黄网站在线| 韩国三级电影久久久久久| 四虎精品在线观看| 久久riav| 午夜视频精品| 污污网站免费观看| 91丝袜国产在线播放| frxxee中国xxx麻豆hd| 日韩欧美在线一区| 日本韩国在线观看| 久久亚洲精品网站| 日韩久久一区二区三区| 国产一区视频观看| 综合视频在线| 91精品999| 久久美女艺术照精彩视频福利播放 | 久久在线中文字幕| 精品亚洲国内自在自线福利| 国产特黄级aaaaa片免| 一二三四社区欧美黄| 国产精品久久久午夜夜伦鲁鲁| 国产亚洲精品美女久久久久| 天堂av中文在线观看| aa成人免费视频| 亚洲成人精品| 女同激情久久av久久| 国产蜜臀97一区二区三区| 欧美一区二区三区四| 亚洲成人aaa| 激情网站在线| 91视频婷婷| 欧美在线1区| 91视频福利网| 中文字幕佐山爱一区二区免费| 亚洲综合成人av| 国产亚洲欧洲在线| 88xx成人免费观看视频库| 久久久久欧美| 国产精品丝袜xxxxxxx| 日本一级片在线播放| 亚洲福利视频一区二区| www.国产麻豆| 欧美大片在线看| 亚洲一区二区三区日本久久九| 国产精品波多野结衣| 国产一区不卡精品| 欧洲猛交xxxx乱大交3| 91精品免费在线观看| 最新av在线播放| 99精品欧美一区二区三区| 欧美日本一区二区视频在线观看| av在线网站免费观看| 亚洲另类一区二区| 国产精品女人久久久| 久久夜色精品国产亚洲aⅴ| 99综合99| av在线com| 成人av电影免费观看| 在线观看中文字幕视频| 亚洲欧美国产精品va在线观看| 亚洲女色av| 亚洲国产精品毛片| 九一久久久久久| 久久久精品一区二区涩爱| 欧美v亚洲v综合ⅴ国产v| 蜜桃视频www网站在线观看| 免费99视频| 美女视频黄a大片欧美| 五月综合色婷婷| 欧美mv日韩mv| 超碰aⅴ人人做人人爽欧美| 日韩影片在线播放| 国产一区在线看| 欧美成人aaaaⅴ片在线看| 国产丝袜一区二区| 在线观看欧美| 国产一区二区视频播放| 久久久99久久| 国产巨乳在线观看| 国模吧一区二区| 欧美一区三区| 亚洲av无码专区在线播放中文| 一本大道久久a久久综合婷婷| 97视频在线观看网站| 成人片在线免费看| 日韩高清在线电影| 欧美成人手机视频| 亚洲老头同性xxxxx| 亚洲成人高清| 欧美黄色免费影院| 亚洲激情五月婷婷| 国产在线播放av| wwwxx欧美| 免费观看在线色综合| 国产精选第一页| 中文字幕日韩欧美在线视频| 色悠久久久久综合先锋影音下载| 国产福利视频在线播放| 亚洲三级电影网站| 毛片在线免费| 99高清视频有精品视频| 日本午夜精品视频在线观看 | 日韩欧美黄色动漫| 怡红院红怡院欧美aⅴ怡春院| 欧美不卡三区| 高清免费成人av| 中文字幕av资源|