现象描述:
工作中维护的Android APP突然连不上第三方服务器了,服务器返回:
Code:403 Message:Forbidden
首先了解下403状态:
该状态表示服务器理解了本次请求但是拒绝执行该任务,该请求不该重发给服务器。在HTTP请求的方法不是“HEAD”,并且服务器想让客户端知道为什么没有权限的情况下,服务器应该在返回的信息中描述拒绝的理由。
说白了就是服务器用来防止一些没有任何标识的网络机器人进行恶意访问,我们通过配置User-Agent,添加标识,即可解决该问题。
User-Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分。
User Agent页简称UA。她是一个特殊字符串头,是一种想访问网站提供你说使用的浏览器类型和版本,操作系统和版本,浏览器内核等信息的标识,用户所访问的网站可以显示不同的排版,而为用户提供更好的体验或者进行信息统计。
为什么通过HttpURLConnection访问会出现403状态,而用WebView.loadUrl加载该网址时,却没问题呢?
这是由于通过HttpURLConnection访问该网址时并未设置请求头,要加入以下代码设置:
HttpURLConn.setRequestProperty(“User-agent”,userAgent);
获取userAgent的方式有很多,更多方法请google。
方案一:获取手机本身的UserAgent配置
/**
* 通过WebView获取UserAgent配置,注意:该方法需要运行在主线程中
* @return WebView的UserAgent配置
*/
private static String getUserAgent(Context context){
WebView webView=new WebView(context);
webView.layout(0,0,0,0);
WebSettings settings=webView.getSettings();
String userAgent = settings.getUserAgentString();
Log.i("User-Agent","User-Agent: "+ userAgent);
return userAgent;
}
获取到的UserAgent:
Mozilla/5.0 (Linux; Android 7.0; MI 5 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36
方案二:模拟电脑浏览器标识,
userAgent="Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)";
如果更好的获取userAgent方法,请留言给我,万分感谢!