通过url请求带有basic验证项目的内部资源的方法
如果你访问的一个项目中带有basic
验证,如下:
假如现在你想在某个地方通过接口的方式直接调用当前项目中的资源、接口等,那么需要怎么访问呢?
1、浏览器中访问
如果只是在浏览器中访问,可以这样做:
假设你这个带有basic验证的项目端口为9099,当登录后,访问它的一个接口的办法,如下:
http://111.86.21.79:9099/test/get
现在你想不弹出账号密码框直接url访问,就可以把账号密码拼到url路径中即可,如下这么做就可以访问成功:
http://username:password@111.86.21.79:9099/test/get
2、项目中调用
当然现实情况没有这么简单,我们可能需要在ajax
中调用,而ajax
调用如上那样,却调用不成功,有时候我们遇到一些接口,在浏览器能访问,而ajax
却不能访问,我觉得最大的问题是请求头
的问题,但是我不管咋设置也不成功,要么跨域,要么调用失败。
第一种解决办法(后台请求) 成功
对于basic
的验证,是通过Base64
加密账号密码,在请求头中加了header
可以实现验证。
import org.springframework.web.bind.annotation.*;
import sun.misc.BASE64Encoder;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.List;
import java.util.Map;
/**
* Created by Administrator on 2018/5/18.
*/
@RestController
public class TestController{
@CrossOrigin
@RequestMapping(value="/testBasic",method= RequestMethod.GET)
public Object selectZhnyNsxqTrpgetById(){
BASE64Encoder encoder = new BASE64Encoder();
//通过BASE64对账号密码加密
String ticket = encoder.encode("lingdada:12343".getBytes());
System.out.println(ticket);
String url = "http://111.86.21.79:9099/test/get";
String result = sendGetGeoserverXml(url,ticket);
return result;
}
public String sendGetGeoserverXml(String url,String ticket) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
//主要就是这里,设置这样的请求头,Basic要和加密后的账号密码在一起,并且中间有空格
connection.setRequestProperty("Authorization","Basic "+ticket);
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应,如果返回结果有乱码,可以通过对字符流InputStreamReader设置编码
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
}
第二种解决办法(ajax请求) 失败
网上有人说过,ajax的解决办法,但是我失败了,如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<script type="text/javascript" src="/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="/webtoolkit.base64.js"></script>
<script>
function make_basic_auth(user, password) {
var tok = user + ':' + password;
var hash = Base64.encode(tok);
return "Basic " + hash;
}
var auth = make_basic_auth('lingdada','12343');
function testSelect() {
$.ajax({
type: "GET",
url: "http://111.86.21.79:9099/test/get",
headers: {'Authorization': auth,"lingdada":"12343"},
// beforeSend : function(req) {
// req.setRequestHeader('accept','*/*');
// req.setRequestHeader('Authorization', auth);
// },
success: function (data) {
console.log(data)
$("#result").html("").html(data);
}
});
}
function getMessage(data){
console.log(data)
}
</script>
</head>
<body>
<button onclick="testSelect()">测试</button>
<span id="result"></span>
</body>
</html>
关于webtoolkit.base64.js的下载地址
希望大家解决过的留言一下。