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

告別繁瑣操作,實現一次登錄產品互通

開發 前端
一個公司產品矩陣比較豐富的時候,用戶在不同系統之間來回切換,固然對產品用戶體驗上較差,并且增加用戶密碼管理成本。也沒有很好地利用內部流量進行用戶打通,并且每個產品的獨立體系會導致產品安全度下降。

最近開發新產品,然后老板說我們現在系統太多了,每次切換系統登錄太麻煩了,能不能做個優化,同一賬號互通掉。作為一個資深架構獅,老板的要求肯定要滿足,安排!

一個公司產品矩陣比較豐富的時候,用戶在不同系統之間來回切換,固然對產品用戶體驗上較差,并且增加用戶密碼管理成本。也沒有很好地利用內部流量進行用戶打通,并且每個產品的獨立體系會導致產品安全度下降。

因此實現集團產品的單點登錄對用戶使用體驗以及效率提升有很大的幫助。那么如何實現統一認證呢?我們先了解一下傳統的身份驗證方式。

1 傳統Session機制及身份認證方案

1.1 Cookie與服務器的交互

圖片圖片

眾所周知,http是無狀態的協議,因此客戶每次通過瀏覽器訪問web頁面,請求到服務端時,服務器都會新建線程,打開新的會話,而且服務器也不會自動維護客戶的上下文信息。比如我們現在要實現一個電商內的購物車功能,要怎么才能知道哪些購物車請求對應的是來自同一個客戶的請求呢?

圖片圖片

因此出現了session這個概念,session 就是一種保存上下文信息的機制,他是面向用戶的,每一個SessionID 對應著一個用戶,并且保存在服務端中。session主要以cookie 或 URL 重寫為基礎的來實現的,默認使用 cookie 來實現,系統會創造一個名為JSESSIONID的變量輸出到cookie中。

JSESSIONID 是存儲于瀏覽器內存中的,并不是寫到硬盤上的,如果我們把瀏覽器的cookie 禁止,則 web 服務器會采用 URL 重寫的方式傳遞 Sessionid,我們就可以在地址欄看到 sessinotallow=KWJHUG6JJM65HS2K6 之類的字符串。

通常 JSESSIONID 是不能跨窗口使用的,當你新開了一個瀏覽器窗口進入相同頁面時,系統會賦予你一個新的sessionid,這樣我們信息共享的目的就達不到了。

1.2 服務器端的session的機制

當服務端收到客戶端的請求時候,首先判斷請求里是否包含了JSESSIONID的sessionId,如果存在說明已經創建過了,直接從內存中拿出來使用,如果查詢不到,說明是無效的。

如果客戶請求不包含sessionid,則為此客戶創建一個session并且生成一個與此session相關聯的sessionid,這個sessionid將在本次響應中返回給客戶端保存。

對每次http請求,都經歷以下步驟處理:

  • 服務端首先查找對應的cookie的值(sessionid)。
  • 根據sessionid,從服務器端session存儲中獲取對應id的session數據,進行返回。
  • 如果找不到sessionid,服務器端就創建session,生成sessionid對應的cookie,寫入到響應頭中。

session是由服務端生成的,并且以散列表的形式保存在內存中

1.3 基于 session 的身份認證流程

基于seesion的身份認證主要流程如下:

圖片圖片

因為 http 請求是無狀態請求,所以在 Web 領域,大部分都是通過這種方式解決。但是這么做有什么問題呢?我們接著看

2 集群環境下的 Session 困境及解決方案

圖片圖片

隨著技術的發展,用戶流量增大,單個服務器已經不能滿足系統的需要了,分布式架構開始流行。通常都會把系統部署在多臺服務器上,通過負載均衡把請求分發到其中的一臺服務器上,這樣很可能同一個用戶的請求被分發到不同的服務器上,因為 session 是保存在服務器上的,那么很有可能第一次請求訪問的 A 服務器,創建了 session,但是第二次訪問到了 B 服務器,這時就會出現取不到 session 的情況。

我們知道,Session 一般是用來存會話全局的用戶信息(不僅僅是登陸方面的問題),用來簡化/加速后續的業務請求。

傳統的 session 由服務器端生成并存儲,當應用進行分布式集群部署的時候,如何保證不同服務器上 session 信息能夠共享呢?

2.1 Session共享方案

Session共享一般有兩種思路

  • session復制
  • session集中存儲
2.1.1 session復制

session復制即將不同服務器上 session 數據進行復制,用戶登錄,修改,注銷時,將session信息同時也復制到其他機器上面去

圖片圖片

這種實現的問題就是實現成本高,維護難度大,并且會存在延遲登問題。

2.1.2 session集中存儲

圖片圖片

集中存儲就是將獲取session單獨放在一個服務中進行存儲,所有獲取session的統一來這個服務中去取。這樣就避免了同步和維護多套session的問題。一般我們都是使用redis進行集中式存儲session。

3 多服務下的登陸困境及SSO方案

3.1 SSO的產生背景

圖片圖片

如果企業做大了之后,一般都有很多的業務支持系統為其提供相應的管理和 IT 服務,按照傳統的驗證方式訪問多系統,每個單獨的系統都會有自己的安全體系和身份認證系統。進入每個系統都需要進行登錄,獲取session,再通過session訪問對應系統資源。

這樣的局面不僅給管理上帶來了很大的困難,對客戶來說也極不友好,那么如何讓客戶只需登陸一次,就可以進入多個系統,而不需要重新登錄呢?

圖片圖片

“單點登錄”就是專為解決此類問題的。其大致思想流程如下:通過一個 ticket 進行串接各系統間的用戶信息

3.2 SSO的底層原理 CAS

3.2.1 CAS實現單點登錄流程

我們知道對于完全不同域名的系統,cookie 是無法跨域名共享的,因此 sessionId 在頁面端也無法共享,因此需要實現單店登錄,就需要啟用一個專門用來登錄的域名如(ouath.com)來提供所有系統的sessionId。當業務系統被打開時,借助中心授權系統進行登錄,整體流程如下:

  1. 當b.com打開時,發現自己未登陸,于是跳轉到ouath.com去登陸
  2. ouath.com登陸頁面被打開,用戶輸入帳戶/密碼登陸成功
  3. ouath.com登陸成功,種 cookie 到ouath.com域名下
  4. 把 sessionid 放入后臺redis,存放<ticket,sesssionid>數據結構,然后頁面重定向到A系統
  5. 當b.com重新被打開,發現仍然是未登陸,但是有了一個 ticket值
  6. 當b.com用ticket 值,到 redis 里查到 sessionid,并做 session 同步,然后種cookie給自己,頁面原地重定向
  7. 當b.com打開自己頁面,此時有了 cookie,后臺校驗登陸狀態,成功

整個交互流程圖如下:

圖片圖片

3.2.2 單點登錄流程演示

3.2.2.1 CAS登錄服務demo核心代碼

  • 用戶實體類
public class UserForm implements Serializable{
private static final long serialVersionUID = 1L;

private String username;
private String password;
private String backurl;

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;
}

public String getBackurl() {
    return backurl;
}

public void setBackurl(String backurl) {
    this.backurl = backurl;
}

}
  • 登錄控制器
@Controller
public class IndexController {
    @Autowired
    private RedisTemplate redisTemplate;

@GetMapping("/toLogin")
public String toLogin(Model model,HttpServletRequest request) {
    Object userInfo = request.getSession().getAttribute(LoginFilter.USER_INFO);
    //不為空,則是已登陸狀態
    if (null != userInfo){
        String ticket = UUID.randomUUID().toString();
        redisTemplate.opsForValue().set(ticket,userInfo,2, TimeUnit.SECONDS);
        return "redirect:"+request.getParameter("url")+"?ticket="+ticket;
    }
    UserForm user = new UserForm();
    user.setUsername("laowang");
    user.setPassword("laowang");
    user.setBackurl(request.getParameter("url"));
    model.addAttribute("user", user);

    return "login";
}

@PostMapping("/login")
public void login(@ModelAttribute UserForm user,HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
    System.out.println("backurl:"+user.getBackurl());
    request.getSession().setAttribute(LoginFilter.USER_INFO,user);

    //登陸成功,創建用戶信息票據
    String ticket = UUID.randomUUID().toString();
    redisTemplate.opsForValue().set(ticket,user,20, TimeUnit.SECONDS);
    //重定向,回原url  ---a.com
    if (null == user.getBackurl() || user.getBackurl().length()==0){
        response.sendRedirect("/index");
    } else {
        response.sendRedirect(user.getBackurl()+"?ticket="+ticket);
    }
}

@GetMapping("/index")
public ModelAndView index(HttpServletRequest request) {
    ModelAndView modelAndView = new ModelAndView();
    Object user = request.getSession().getAttribute(LoginFilter.USER_INFO);
    UserForm userInfo = (UserForm) user;
    modelAndView.setViewName("index");
    modelAndView.addObject("user", userInfo);
    request.getSession().setAttribute("test","123");
    return modelAndView;
}
}
  • 登錄過濾器
public class LoginFilter implements Filter {
    public static final String USER_INFO = "user";
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest,
                     ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) servletRequest;
     HttpServletResponse response = (HttpServletResponse)servletResponse;

    Object userInfo = request.getSession().getAttribute(USER_INFO);;

    //如果未登陸,則拒絕請求,轉向登陸頁面
    String requestUrl = request.getServletPath();
    if (!"/toLogin".equals(requestUrl)//不是登陸頁面
            && !requestUrl.startsWith("/login")//不是去登陸
            && null == userInfo) {//不是登陸狀態

        request.getRequestDispatcher("/toLogin").forward(request,response);
        return ;
    }

    filterChain.doFilter(request,servletResponse);
}

@Override
public void destroy() {

}
}
  • 配置過濾器
@Configuration
public class LoginConfig {

//配置filter生效
@Bean
public FilterRegistrationBean sessionFilterRegistration() {

    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new LoginFilter());
    registration.addUrlPatterns("/*");
    registration.addInitParameter("paramName", "paramValue");
    registration.setName("sessionFilter");
    registration.setOrder(1);
    return registration;
}
}
  • 登錄頁面
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>enjoy login</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div text-align="center">
    <h1>請登陸</h1>
    <form action="#" th:action="@{/login}" th:object="${user}" method="post">
        <p>用戶名: <input type="text" th:field="*{username}" /></p>
        <p>密  碼: <input type="text" th:field="*{password}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
        <input type="text" th:field="*{backurl}" hidden="hidden" />
    </form>
</div>


</body>
</html>

3.2.2.2 web系統demo核心代碼

  • 過濾器
public class SSOFilter implements Filter {
    private RedisTemplate redisTemplate;

public static final String USER_INFO = "user";

public SSOFilter(RedisTemplate redisTemplate){
    this.redisTemplate = redisTemplate;
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest,
                     ServletResponse servletResponse, FilterChain filterChain)
        throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) servletRequest;
    HttpServletResponse response = (HttpServletResponse)servletResponse;

    Object userInfo = request.getSession().getAttribute(USER_INFO);;

    //如果未登陸,則拒絕請求,轉向登陸頁面
    String requestUrl = request.getServletPath();
    if (!"/toLogin".equals(requestUrl)//不是登陸頁面
            && !requestUrl.startsWith("/login")//不是去登陸
            && null == userInfo) {//不是登陸狀態

        String ticket = request.getParameter("ticket");
        //有票據,則使用票據去嘗試拿取用戶信息
        if (null != ticket){
            userInfo = redisTemplate.opsForValue().get(ticket);
        }
        //無法得到用戶信息,則去登陸頁面
        if (null == userInfo){
            response.sendRedirect("http://127.0.0.1:8080/toLogin?url="+request.getRequestURL().toString());
            return ;
        }

        /**
         * 將用戶信息,加載進session中
         */
        UserForm user = (UserForm) userInfo;
        request.getSession().setAttribute(SSOFilter.USER_INFO,user);
        redisTemplate.delete(ticket);
    }

    filterChain.doFilter(request,servletResponse);
}

@Override
public void destroy() {

}
}
  • 控制器
@Controller
public class IndexController {
    @Autowired
    private RedisTemplate redisTemplate;

@GetMapping("/index")
public ModelAndView index(HttpServletRequest request) {
    ModelAndView modelAndView = new ModelAndView();
    Object userInfo = request.getSession().getAttribute(SSOFilter.USER_INFO);
    UserForm user = (UserForm) userInfo;
    modelAndView.setViewName("index");
    modelAndView.addObject("user", user);

    request.getSession().setAttribute("test","123");
    return modelAndView;
}
}
  • 首頁
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>enjoy index</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div th:object="${user}">
    <h1>cas-website:歡迎你"></h1>
</div>
</body>
</html>

3.2.3 CAS的單點登錄和OAuth2的區別

OAuth2: 三方授權協議,允許用戶在不提供賬號密碼的情況下,通過信任的應用進行授權,使其客戶端可以訪問權限范圍內的資源。

CAS: 中央認證服務(Central Authentication Service),一個基于Kerberos票據方式實現SSO單點登錄的框架,為Web 應用系統提供一種可靠的單點登錄解決方法(屬于 Web SSO )。

  • CAS的單點登錄時保障客戶端的用戶資源的安全,OAuth2則是保障服務端的用戶資源的安全 。
  • CAS客戶端要獲取的最終信息是,這個用戶到底有沒有權限訪問我(CAS客戶端)的資源。OAuth2獲取的最終信息是,我(oauth2服務提供方)的用戶的資源到底能不能讓你(oauth2的客戶端)訪問。

因此,需要統一的賬號密碼進行身份認證,用CAS;需要授權第三方服務使用我方資源,使用OAuth2;

責任編輯:武曉燕 來源: 一安未來
相關推薦

2024-10-16 16:30:14

ShellShell腳本

2023-09-13 15:09:35

軟件開發數字化進程

2012-11-03 17:05:30

Windows 8開發微軟

2024-03-11 06:00:00

OptunaPython超參數優化

2011-06-28 10:41:50

DBA

2020-10-24 13:50:59

Python編程語言

2021-12-27 10:08:16

Python編程語言

2025-07-14 06:05:00

2025-01-24 07:44:31

LinuxsystemdAnsible

2025-10-21 08:00:13

2025-04-27 03:00:00

Spring集成測試

2020-10-18 12:53:29

黑科技網站軟件

2024-08-23 08:50:51

監控Python開發

2020-03-10 07:51:35

面試諷刺標準

2020-03-18 13:07:16

華為

2017-01-23 12:40:45

設計演講報表數據

2017-02-28 11:13:36

華為

2020-12-29 10:25:07

漏洞JSONP注入
點贊
收藏

51CTO技術棧公眾號

一级特黄录像免费播放全99| 国产精品爽黄69天堂a| 久久精品aⅴ无码中文字字幕重口| 亚洲卡一卡二| 91丨九色丨尤物| 国产精品视频网站| 黄色一级片在线免费观看| 婷婷精品视频| 日韩一区二区免费在线电影| www一区二区www免费| 成人av一区| 国产成人免费在线视频| 国产精品免费一区二区三区都可以| av激情在线观看| 欧美精美视频| 欧美成人一级视频| 中文字幕av不卡在线| 里番在线播放| 国产精品色婷婷| 久久精品aaaaaa毛片| 国产美女永久免费| 视频在线在亚洲| 久久久亚洲国产天美传媒修理工| 国产精品情侣呻吟对白视频| 久久久精品国产**网站| 91精品国产色综合久久不卡蜜臀| 欧美 日韩 国产一区| 天使と恶魔の榨精在线播放| 欧美高清在线一区二区| 久久99精品久久久水蜜桃| 性中国xxx极品hd| 久久国产精品色| 日本精品久久久| 久久久久99精品成人片毛片| 99精品电影| 永久555www成人免费| 亚洲成人av免费在线观看| 7777精品| 欧美一级二级三级蜜桃| 91热视频在线观看| 日韩福利影视| 欧美日韩一二三区| 粗暴91大变态调教| 免费成人美女女| 精品福利樱桃av导航| 800av在线免费观看| 成人黄色在线电影| 亚洲欧美国产高清| 一区二区高清视频| 日本中文字幕在线看| 中文字幕乱码亚洲精品一区| 日韩福利在线| 77777影视视频在线观看| 国产片一区二区三区| 日韩精品资源| avtt在线播放| 国产精品女人毛片| 一区二区三区av| 免费人成在线观看播放视频| 中文字幕一区二区三区在线观看| 在线不卡日本| 九义人在线观看完整免费版电视剧| 国产精品久久久久9999吃药| 在线免费一区| 菠萝蜜视频国产在线播放| 亚洲另类春色国产| 成人在线国产视频| av资源中文在线| 福利二区91精品bt7086| 国产免费人做人爱午夜视频| 国产另类xxxxhd高清| 欧美系列在线观看| 亚洲一区二区在线视频观看| 电影中文字幕一区二区| 日韩精品在线网站| 亚洲精品乱码久久久久久久| 少妇精品久久久| 色婷婷久久av| 久久久久久久久久久97| 国产亚洲午夜| 国产精品丝袜久久久久久高清 | 亚洲一区二区三区视频| 精品国产av 无码一区二区三区 | 韩国亚洲精品| 欧美中文在线观看| 亚洲视频一区在线播放| 国产精品1区2区3区在线观看| 国产精品成人观看视频免费| 国产资源在线播放| 亚洲人成精品久久久久久| 日本一区二区三区四区五区六区| 91色在线看| 在线中文字幕一区| 先锋资源在线视频| 国产成人调教视频在线观看| 久久这里只有精品99| 青青草av在线播放| 久久精品av麻豆的观看方式| 国产综合18久久久久久| 91社区在线观看播放| 亚洲国产欧美一区二区三区丁香婷| 日韩av综合在线观看| 日韩毛片免费看| 亚洲成人中文字幕| 午夜爽爽爽男女免费观看| 99视频在线精品国自产拍免费观看| 国产精品欧美激情在线播放| 国产91免费在线观看| 国产精品麻豆网站| 日韩在线一级片| 精品一区二区三区中文字幕| 亚洲视频综合网| 久久精品久久精品久久| 麻豆91精品91久久久的内涵| 精品欧美一区二区久久久伦| 自由的xxxx在线视频| 欧美亚日韩国产aⅴ精品中极品| 亚洲精品一区二区18漫画| 欧洲乱码伦视频免费| 91精品国产乱码久久久久久久久 | 国产av 一区二区三区| 校园激情久久| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 国产91av在线| www.热久久| 国产精品成人免费| 日本美女高潮视频| 蜜桃成人av| 97久久精品视频| 精品国产乱码一区二区三| 中文字幕一区二区在线播放| 日本一极黄色片| 欧美在线导航| 午夜精品国产精品大乳美女| 精品毛片在线观看| 亚洲欧美激情视频在线观看一区二区三区| 国产嫩草在线观看| 欧美日韩精品在线一区| 欧美在线亚洲在线| 桃花色综合影院| 五月婷婷久久丁香| 天堂www中文在线资源| 国内精品久久久久久久97牛牛| 91久久爱成人| 在线黄色网页| 日韩精品一区二区三区视频| 久久久久久久蜜桃| 国产成人av一区二区三区在线观看| 水蜜桃在线免费观看| 国产激情综合| 欧美成人激情视频免费观看| 国产日韩一级片| 一区二区三区资源| 又色又爽又黄18网站| 精品白丝av| 国产精品青青草| 欧美freesex黑人又粗又大| 亚洲国产三级网| 国产精品久免费的黄网站| 久久综合色一综合色88| 日韩 欧美 高清| 精品久久国产| 国产日韩欧美日韩大片| 黄色网页网址在线免费| 日韩一区二区三区四区五区六区| 久久成人国产精品入口| 成人av网站大全| 中文字幕日本最新乱码视频| 国产一区二区三区91| 国产日韩欧美中文| 日韩欧美一起| 日韩毛片在线看| www.av88| 亚洲精品国产成人久久av盗摄| 91成人在线观看喷潮蘑菇| 99精品久久久| 日韩欧美亚洲日产国产| 国产欧美视频在线| 91高清免费视频| www免费网站在线观看| 日韩一区国产二区欧美三区| 日本天堂在线视频| 日本一区二区三区四区| 亚洲熟妇一区二区| 丝袜美腿亚洲综合| 9l视频自拍9l视频自拍| 日本妇女一区| 国产美女91呻吟求| 国产一二三在线| 色狠狠久久aa北条麻妃| 欧美熟妇乱码在线一区| 欧美在线观看视频在线| 精品少妇久久久久久888优播| 久久久不卡网国产精品二区| 香蕉视频xxx| 日韩激情一二三区| av日韩在线看| av一区二区在线观看| 国产精品三区在线| 青娱乐极品盛宴一区二区| 韩国v欧美v日本v亚洲| 日本中文字幕电影在线免费观看 | 精品久久久中文| 中文字幕第二区| fc2成人免费人成在线观看播放| www.99r| 国产精品主播| 一二三四中文字幕| 日韩免费在线| 麻豆亚洲一区| 一区二区三区高清在线观看| 国产精品欧美日韩一区二区| 国产在线精彩视频| 久久精品国产欧美激情| 黄色国产在线| 日韩高清不卡av| wwwav网站| 制服丝袜成人动漫| 中文字幕在线观看精品| 色综合久久88色综合天天6 | 亚洲精品女人久久久| 国产福利一区二区三区视频在线| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 亚洲黄色一区| 日韩成人手机在线| 欧美一区二区三区久久精品茉莉花| 视频一区三区| 日韩av系列| 国产一区二区在线网站| 97se亚洲| 97在线中文字幕| 久久久久久爱| 91最新在线免费观看| 国产精品天堂蜜av在线播放| 国产精品91免费在线| 最近在线中文字幕| 欧美整片在线观看| 免费观看亚洲| 欧美中文在线观看| 日本免费久久| 国产精品99导航| 欧美gay视频| 国产国产精品人在线视| 日韩视频网站在线观看| 国产精品成人av性教育| 在线成人视屏| 国产精品视频一区二区高潮| 99riav视频一区二区| 国产精品男女猛烈高潮激情| 久久电影天堂| 91精品久久久久久久久久久久久久| 久久久久久久性潮| 成人网在线视频| 久久69av| 国产精品久久久久久免费观看| jizzjizzjizz欧美| 精品一区二区日本| 深爱激情久久| 正在播放91九色| 综合日韩在线| 无码粉嫩虎白一线天在线观看| 亚洲免费播放| 日韩有码免费视频| 久久99蜜桃精品| 国产成人精品综合久久久久99| 成人一级片在线观看| 国产传媒第一页| 国产欧美日韩另类视频免费观看| 国产三级精品三级观看| 亚洲精品ww久久久久久p站| 免费毛片一区二区三区| 色综合天天综合网国产成人综合天| 中文字幕一区二区人妻视频| 欧美久久久久久久久中文字幕| 国产黄色一区二区| 亚洲精品丝袜日韩| 天堂а√在线资源在线| 欧美成人午夜免费视在线看片| 色吧亚洲日本| 国产在线视频欧美| 另类ts人妖一区二区三区| 欧美最大成人综合网| 国产精品精品| 少妇无码av无码专区在线观看| 青青青爽久久午夜综合久久午夜| 亚洲妇女无套内射精| 91免费观看视频| 日韩激情小视频| 精品日本高清在线播放 | 国产99在线观看| 国产精品久久久久久五月尺| 91成人精品在线| 婷婷精品国产一区二区三区日韩| 亚洲视频电影在线| 免费观看日韩毛片| 国产精品69毛片高清亚洲| 性少妇bbw张开| 亚洲男人天堂av| 久久久精品毛片| 欧美精品一区二区三区很污很色的| 国产在线观看精品一区| 欧美极品少妇xxxxⅹ裸体艺术| 成人不卡视频| 国产欧美日韩伦理| 91精品1区| 我要看一级黄色大片| 波多野结衣视频一区| 男人av资源站| 色婷婷综合久久久中文字幕| 亚洲黄色小说网址| www.日韩欧美| 欧美日韩五码| 久久久婷婷一区二区三区不卡| 伊人久久大香线蕉综合四虎小说 | 国产91色综合久久免费分享| 精品国产aaa| 五月婷婷激情综合| 99久久精品免费看国产交换| 在线亚洲午夜片av大片| 美女扒开腿让男人桶爽久久软| 97在线中文字幕| 久久精品影视| 亚洲天堂2018av| 国产人妖乱国产精品人妖| 91九色丨porny丨肉丝| 亚洲成人1234| 久久亚洲资源| 99久久精品久久久久久ai换脸| 国产精品99久久精品| 欧美婷婷精品激情| 国产亚洲欧美日韩俺去了| 美女又爽又黄免费视频| 亚洲第一网站男人都懂| 国内老司机av在线| 福利视频一区二区三区| 欧美日韩久久| 日韩欧美中文视频| 亚洲婷婷综合色高清在线| 夜夜躁狠狠躁日日躁av| 这里只有精品在线观看| 国产成人精品一区二三区在线观看 | ,一级淫片a看免费| 中文字幕精品网| 精品123区| 一区二区高清视频| 激情综合色综合久久综合| 日韩福利小视频| 欧美一区二区三区视频免费| www视频在线免费观看| 亚洲一区二区三区777| 欧美日本一区| 日本一区二区在线观看视频| 黑人狂躁日本妞一区二区三区 | 少妇高潮久久久久久潘金莲| 国产美女久久| 99精品视频网站| 国产一区91精品张津瑜| 久热这里只有精品在线| 亚洲成年人在线播放| 亚洲同志男男gay1069网站| 清纯唯美一区二区三区| 精品一区二区免费| 免费又黄又爽又色的视频| 亚洲国产高潮在线观看| 亚洲天堂资源| 亚洲一区精品视频| 高清成人免费视频| 偷偷操不一样的久久| 自拍偷拍亚洲精品| 91精品国产自产在线丝袜啪| 黄色免费视频大全| 中文字幕第一区| 国内精品久久久久久久久久| 98精品国产高清在线xxxx天堂| 国产探花一区在线观看| 手机在线视频一区| 午夜伊人狠狠久久| 国产精品秘入口| **亚洲第一综合导航网站| 妖精视频成人观看www| 少妇的滋味中文字幕bd| 欧美zozo另类异族| 自拍偷自拍亚洲精品被多人伦好爽 | 亚洲成人激情av| 99reav在线| 都市激情久久久久久久久久久| 久久综合婷婷| 欧美日韩大片在线观看| 亚洲人成在线一二| 午夜视频在线观看精品中文| 欧美黄网站在线观看| 亚洲欧美日韩中文播放 | 亚洲专区**| 欧美伦理片在线看| 一区二区三区小说| 国产精品视频一区二区久久| http;//www.99re视频| 日本强好片久久久久久aaa| 亚洲一区二区91| www.国产精品一二区|