有一段时间我正在玩RESTeasy和angularjs $ http电话。想法是使用角度网络应用程序使用的Web Api作为它的后端,但是那些我希望至少仅为网站提供HTTP基本身份验证的呼叫,因为不会有任何用户帐户等等。到目前为止,我设法做的是REST服务在mozilla中使用Poster附加组件调用时使用身份验证(“授权”:“基本user_pass_Base64_hash”标头)。但是当我尝试通过angularjs $ http进行连接时问题就出现了。这是一个角度调用代码:
$http({
url:'http://serverurl/rest/anouncements/announce/1',
method: 'GET',
headers: {'Authorization':'Basic someBase64Hash'}
})
.success(function(data){
// do something with data
}) ;
通过Servlet过滤器我通过添加这些标题来修改响应:
response.addHeader("Access-Control-Allow-Origin", "*");
response.addHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
response.addHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type, Content-Length");
并检查用户:是否在数据库中存在从哈希解码的密码。
我真的不知道我能做些什么才能让它发挥作用,我已经尝试了很多我在其他帖子或文档中读过的内容。可以请任何人帮忙吗? Resteasy版本为2.2.3,角度为1.2.10。
谢谢,Michal
答案 0 :(得分:0)
好的,经过一番挣扎,我弄清楚到底发生了什么;)
也许我对此的体验会对某人有所帮助。
正如我之前提到的,我使用扩展javax.servlet.Filter的类来控制响应头。在doFilter(..)方法I中,检查请求方法是否为OPTIONS。如果是这样,那么我添加这些标题:
((HttpServletResponse) response).addHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
((HttpServletResponse) response).addHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
但如果没有,我会做我的授权(解析base64字符串,检查db以获取传递的凭据),如果没问题,请将Content-Type标头设置为我希望在我的角度代码中从服务器获得的响应:< / p>
((HttpServletResponse) response).addHeader("Content-Type", "application/json");
并将请求和响应对象传递给javax.servlet.Filter超类中的doFilter方法:
chain.doFilter(request, response);
虽然,我不会过滤OPTIONS请求。
当然,如果我在DB中检查凭据失败,我会从响应中发送403。
在角度我只做简单
$http.get('someUrl').then(function(response){
// do something with promise
});
在每个请求中添加我的base64哈希&#39;授权&#39;头:
$http.defaults.headers.common.Authorization = 'Basic a3J6YXE0OmtyemFxNjY2' ;
在这两种情况下,无论是请求方法还是OPTIONS,我都会将此标题添加到响应中:
response.addHeader("Access-Control-Allow-Origin", "*");
当然,没有什么可以阻止您直接指定允许与之开展业务的来源:)
我希望这会有所帮助,当然还有任何意见和建议值得赞赏!
干杯,米哈尔!