Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
This repository was archived by the owner on Jun 5, 2024. It is now read-only.

Commit 0aa0ee0

Browse files
committed
修复登录cookie同步问题
1 parent e528c1c commit 0aa0ee0

File tree

15 files changed

+250
-135
lines changed

15 files changed

+250
-135
lines changed

‎README.md

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,20 @@
66
</p>
77
<p align="center">
88
<a href="https://sj.qq.com/myapp/detail.htm?apkName=com.rae.cnblogs">
9-
<img src="https://img.shields.io/badge/download-v1.1.5-brightgreen.svg" alt="release">
10-
</a>
11-
<a href="https://github.com/raedev/android-cnblogs/blob/master/LICENSE">
12-
<img src="https://img.shields.io/hexpm/l/plug.svg" alt="license">
9+
<img src="https://img.shields.io/badge/download-v2.0.1-brightgreen.svg" alt="release">
1310
</a>
11+
<a href="https://github.com/raedev/android-cnblogs/blob/master/LICENSE">
12+
<img src="https://img.shields.io/hexpm/l/plug.svg" alt="license">
13+
</a>
1414
</p>
1515

16-
## 简介
16+
17+
## 博客园介绍
18+
19+
博客园创立于2004年1月,是一个面向开发者的知识分享社区。自创建以来,博客园一直致力并专注于为开发者打造一个纯净的技术交流社区,推动并帮助开发者通过互联网分享知识,从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。
20+
21+
22+
## APP简介
1723

1824
- 界面净白风格,专注阅读,给你极简体验
1925
- 夜间模式同样很出色
@@ -27,14 +33,20 @@
2733
- 时下热门IT新闻随时查看,还有知识库来补充
2834
- 闪存功能,园友的"段子"圈,个个都是人才,说话又好听
2935
- WIFI下自动缓存文章,离线也可阅读
30-
- 更多功能等你来发现
3136

32-
## APP截图
33-
34-
![](https://github.com/raee/android-cnblogs/blob/master/guide.jpg)
3537

3638
## 版本更新记录
3739

40+
> v2.0.1
41+
42+
- 发现页全新改版:
43+
- 推出专栏功能,助你系统学习新技术
44+
- 推出排行榜功能,技术热点时刻了解
45+
- 推出博问功能,解答技术疑惑
46+
- 优化文章查看速度
47+
- 其他细节调优以及线上BUG修复
48+
49+
3850
> v1.1.5
3951
4052
- 全新的个人中心,支持修改头像、账号、昵称、个性签名以及重置密码
@@ -46,10 +58,10 @@
4658
- 调整UI卡片设计风格
4759

4860

49-
## 博客园介绍
5061

51-
博客园创立于2004年1月,是一个面向开发者的知识分享社区。自创建以来,博客园一直致力并专注于为开发者打造一个纯净的技术交流社区,推动并帮助开发者通过互联网分享知识,从而让更多开发者从中受益。博客园的使命是帮助开发者用代码改变世界。
62+
## APP介绍图片
5263

64+
![](https://github.com/raee/android-cnblogs/blob/master/guide.jpg)
5365

5466
## License
5567

‎module-blog/src/main/java/com/rae/cnblogs/blog/fragment/BlogDetailFragment.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ public void onActivityCreated(@Nullable Bundle savedInstanceState) {
151151
// 知识库没有评论处理
152152
BlogType mBlogType = BlogType.typeOf(mContentEntity.getType());
153153
if (mBlogType == BlogType.KB) {
154-
mPostCommentView.setVisibility(View.INVISIBLE);
155-
mViewCommentView.setVisibility(View.INVISIBLE);
154+
mPostCommentView.setVisibility(View.GONE);
155+
mViewCommentView.setVisibility(View.GONE);
156156
}
157157
}
158158

‎module-discover/src/main/java/com/rae/cnblogs/discover/fragment/DiscoverFragment.java

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,9 @@ public class DiscoverFragment extends BasicFragment implements IDiscoverHomeCont
5959
private Banner mBanner;
6060
private ViewGroup mTabLayout;
6161
private List<AntAdInfo> mAdInfoList;
62+
private int mBannerPosition;
63+
private ViewPager mBannerViewPager;
64+
private ViewPager.SimpleOnPageChangeListener mSimpleOnPageChangeListener;
6265

6366
@Override
6467
protected int getLayoutId() {
@@ -121,27 +124,51 @@ private void initViews() {
121124
mBanner = (Banner) getLayoutInflater().inflate(R.layout.view_discover_banner, (ViewGroup) getView(), false);
122125
mBanner.setImageLoader(new BannerImageLoader());
123126
mBanner.setIndicatorGravity(Gravity.CENTER);
127+
mBanner.setOffscreenPageLimit(4);
128+
mBannerViewPager = mBanner.findViewById(R.id.bannerViewPager);
129+
mBannerViewPager.setPageMargin((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -35, getResources().getDisplayMetrics()));
130+
mSimpleOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
131+
@Override
132+
public void onPageSelected(int position) {
133+
super.onPageSelected(position);
134+
mBannerPosition = position;
135+
}
136+
};
137+
124138
mBanner.setOnBannerListener(new OnBannerListener() {
125139
@Override
126140
public void OnBannerClick(int position) {
127141
AntAdInfo adInfo = mAdInfoList.get(position % mAdInfoList.size());
128142
AppRoute.autoRoute(getContext(), adInfo.getType(), adInfo.getUrl(), adInfo.getData());
129143
}
130144
});
131-
132-
ViewPager viewPager = mBanner.findViewById(R.id.bannerViewPager);
133-
viewPager.setOffscreenPageLimit(4);
134-
viewPager.setPageMargin((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -35, getResources().getDisplayMetrics()));
135145
mAdapter.addHeaderView(mBanner, 0);
146+
}
136147

148+
@Override
149+
public void onPause() {
150+
super.onPause();
151+
if (mBanner != null) mBanner.stopAutoPlay();
152+
}
137153

154+
@Override
155+
public void onStart() {
156+
super.onStart();
157+
if (mBanner != null) mBanner.startAutoPlay();
138158
}
139159

140160
@Override
141-
public void onLoadAds(List<AntAdInfo> ads) {
161+
public void onLoadAds(finalList<AntAdInfo> ads) {
142162
mAdInfoList = ads;
143163
mRefreshLayout.setRefreshing(false);
164+
mBannerViewPager.removeOnPageChangeListener(mSimpleOnPageChangeListener);
144165
mBanner.setImages(ads).start();
166+
mBannerViewPager.addOnPageChangeListener(mSimpleOnPageChangeListener);
167+
if (mBannerPosition > 0 && ads.size() > 0) {
168+
int position = mBannerPosition % ads.size();
169+
mBannerViewPager.setCurrentItem(position);
170+
}
171+
145172
}
146173

147174
@Override
@@ -175,7 +202,7 @@ public void onLoadCategories(List<AntTabInfo> homeTabs) {
175202
if (iconUrl.startsWith("res")) {
176203
try {
177204
iconUrl = iconUrl.replace("res/", "");
178-
logo.setImageResource(getResources().getIdentifier(iconUrl, "drawable", getContext().getPackageName()));
205+
logo.setImageResource(getResources().getIdentifier(iconUrl, "drawable", mTabLayout.getContext().getPackageName()));
179206
} catch (Exception e) {
180207
e.printStackTrace();
181208
}

‎module-resource/src/main/res/values/strings.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
<string name="copyright">Copyright © 2004–2018 cnblogs.com All Rights Reserved</string>
2626
<string name="loading">请稍后...</string>
2727
<string name="signing">正在登录...</string>
28-
<string name="loading_web_user_info">正在进行身份认证..</string>
28+
<string name="loading_web_user_info">正在进行用户认证..</string>
2929
<string name="loading_user_info">「%s」· 技术改变世界</string>
30-
<string name="loading_blog_app">你的每一步改变都不平凡</string>
30+
<string name="loading_blog_app">正在获取用户信息..</string>
3131
<string name="loading_user_info_finish">技术改变世界</string>
3232
<string name="login_retry_error">多次登录失败?试试官方网页登录吧!</string>
3333
<string name="login_retry">正在重试,请稍等片刻。</string>

‎module-sdk/src/main/java/com/rae/cnblogs/sdk/CnblogsApiProvider.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import com.squareup.okhttp3.OkHttpExtBuilder;
2121

2222
import java.lang.ref.WeakReference;
23+
import java.net.CookieManager;
2324
import java.util.concurrent.TimeUnit;
2425

26+
import okhttp3.JavaNetCookieJar;
2527
import okhttp3.OkHttpClient;
2628
import retrofit2.Retrofit;
2729
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
@@ -34,27 +36,30 @@ public abstract class CnblogsApiProvider {
3436

3537
private final Retrofit mRetrofit;
3638
private final WeakReference<Context> mContext; // application context
39+
private final CnblogsCookieManager mCookieManager;
3740

3841
CnblogsApiProvider(Context context) {
3942
mContext = new WeakReference<>(context.getApplicationContext());
40-
OkHttpExtBuilder builder = new OkHttpExtBuilder();
43+
OkHttpExtBuilder builder = new OkHttpExtBuilder().https();
44+
CookieManager.setDefault(new CookieManager());
45+
JavaNetCookieJar cookieJar = new JavaNetCookieJar(CookieManager.getDefault());
46+
mCookieManager = new CnblogsCookieManager(context, cookieJar);
4147

4248
// 调试模式启用接口日志打印
4349
if (BuildConfig.API_LOG_DEBUG) {
4450
builder.debug("CNBLOGS-API");
4551
}
4652

4753
OkHttpClient client = builder
48-
.https()
49-
.cookie()
5054
.build()
55+
.cookieJar(cookieJar)
5156
// 连接超时
5257
.connectTimeout(30, TimeUnit.SECONDS)
5358
// 流读取超时
5459
.readTimeout(120, TimeUnit.SECONDS)
5560
// 流写入超时
5661
.writeTimeout(120, TimeUnit.SECONDS)
57-
.addInterceptor(RequestInterceptor.create(context))
62+
.addInterceptor(RequestInterceptor.create(context, mCookieManager))
5863
.build();
5964

6065
mRetrofit = new Retrofit.Builder()
@@ -64,6 +69,7 @@ public abstract class CnblogsApiProvider {
6469
.addConverterFactory(ConverterFactory.create())
6570
.build();
6671

72+
6773
}
6874

6975
Retrofit getRetrofit() {
@@ -147,4 +153,13 @@ protected Context getContext() {
147153
* 获取接口下载地址
148154
*/
149155
public abstract String getDownloadUrl();
156+
157+
/**
158+
* 同步JAVA的cookie到网页的Cookie
159+
*/
160+
public void javaCookie2WebCookie() {
161+
mCookieManager.javaCookie2WebCookie();
162+
}
163+
164+
150165
}
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
package com.rae.cnblogs.sdk;
2+
3+
import android.content.Context;
4+
import android.text.TextUtils;
5+
import android.webkit.CookieManager;
6+
import android.webkit.CookieSyncManager;
7+
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
import okhttp3.Cookie;
12+
import okhttp3.HttpUrl;
13+
import okhttp3.JavaNetCookieJar;
14+
import okhttp3.OkHttpClient;
15+
16+
/**
17+
* 博客园COOKIE管理器
18+
* 用于同步WebCookie和JavaCookie,保持接口的登录状态
19+
*/
20+
public final class CnblogsCookieManager {
21+
22+
23+
private final Context mContext;
24+
private final JavaNetCookieJar mCookieJar;
25+
26+
public CnblogsCookieManager(Context context, JavaNetCookieJar cookieJar) {
27+
mCookieJar = cookieJar;
28+
mContext = context;
29+
}
30+
31+
public CnblogsCookieManager(Context context, OkHttpClient client) {
32+
mContext = context;
33+
mCookieJar = (JavaNetCookieJar) client.cookieJar();
34+
}
35+
36+
37+
/**
38+
* 同步网页的cookie到HTTP请求cookie中去
39+
*/
40+
public void webCookie2JavaCookie() {
41+
// 同步接口的cookie达到同步web登陆
42+
CookieManager cookieManager = CookieManager.getInstance();
43+
String webCookies = cookieManager.getCookie("http://cnblogs.com");
44+
String sslCookies = cookieManager.getCookie("https://cnblogs.com");
45+
if (TextUtils.isEmpty(webCookies)) webCookies = sslCookies;
46+
saveCookie2JavaCookie(webCookies);
47+
}
48+
49+
/**
50+
* 同步JAVA的cookie到网页的Cookie
51+
*/
52+
public void javaCookie2WebCookie() {
53+
String url = "http://cnblogs.com";
54+
HttpUrl uri = HttpUrl.parse(url);
55+
if (uri == null) return;
56+
List<Cookie> cookies = mCookieJar.loadForRequest(uri);
57+
if (cookies != null) {
58+
// 同步接口的cookie达到同步web登陆
59+
CookieSyncManager.createInstance(mContext);
60+
CookieManager cookieManager = CookieManager.getInstance();
61+
for (Cookie cookie : cookies) {
62+
cookieManager.setCookie(url, cookie.toString());
63+
}
64+
CookieSyncManager.getInstance().sync();
65+
}
66+
}
67+
68+
/**
69+
* 保存cookie到HTTP请求cookie中去
70+
*
71+
* @param webCookies 需要保存的COOKIE
72+
*/
73+
public void saveCookie2JavaCookie(String webCookies) {
74+
if (TextUtils.isEmpty(webCookies)) return;
75+
String url = "http://cnblogs.com";
76+
List<Cookie> cookies = new ArrayList<>();
77+
String[] texts = webCookies.split(";");
78+
HttpUrl httpUrl = HttpUrl.parse(url);
79+
// 解析字符串
80+
for (String text : texts) {
81+
if (TextUtils.isEmpty(text)) continue;
82+
text = text.trim(); // 去掉多余的空格
83+
if (!text.endsWith(";")) {
84+
text += ";";
85+
}
86+
text += " domain=.cnblogs.com; path=/; HttpOnly";
87+
Cookie cookie = Cookie.parse(httpUrl, text);
88+
cookies.add(cookie);
89+
}
90+
91+
// 保存cookie
92+
mCookieJar.saveFromResponse(httpUrl, cookies);
93+
}
94+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /