本篇文章给大家谈谈预检的响应具有无效的HTTP状态代码401-Spring,以及http预检请求的知识点,同时本文还将给你拓展ajax–将数据发布到RESTful无效的HTTP状态代码405、Angu
本篇文章给大家谈谈预检的响应具有无效的HTTP状态代码401-Spring,以及http预检请求的知识点,同时本文还将给你拓展ajax – 将数据发布到RESTful无效的HTTP状态代码405、Angular 2 – 预检的响应具有无效的HTTP状态代码401、angular – HTTP状态代码401,即使我正在发送授权请求标头、angular – 身份验证错误:预检的响应具有无效的HTTP状态代码405等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- 预检的响应具有无效的HTTP状态代码401-Spring(http预检请求)
- ajax – 将数据发布到RESTful无效的HTTP状态代码405
- Angular 2 – 预检的响应具有无效的HTTP状态代码401
- angular – HTTP状态代码401,即使我正在发送授权请求标头
- angular – 身份验证错误:预检的响应具有无效的HTTP状态代码405
预检的响应具有无效的HTTP状态代码401-Spring(http预检请求)
大家。我是Angular 2和Spring框架的新手。我正在尝试使用授权标头(基本auth)进行简单的get请求。
我正在使用Spring Boot(1.2.6.RELEASE),这也可能是相关的。我的CORS配置如下所示。
@Componentpublic class SimpleCorsFilter implements Filter {private final Logger log = LoggerFactory.getLogger(SimpleCorsFilter.class);public SimpleCorsFilter() { log.info("SimpleCORSFilter init");}@Overridepublic void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin")); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me, authorization, x-auth-token"); chain.doFilter(req, res);}@Overridepublic void init(FilterConfig filterConfig) {}@Overridepublic void destroy() {}}
这是客户端的外观
this.headers.append(''Authorization'', ''Basic dXNlcjphZG1pbg==''); return this.http .get(`http://localhost:8080/api/login?username=${username}`, {headers : this.headers} ) .map(response => response.json().data as any);}
我不断得到:
XMLHttpRequest无法加载 http:// localhost:8080 / api / login?username =
user。预检的响应具有无效的HTTP状态代码401
请帮助,我不知道我要缺少什么…我已经检查了很多帖子,但无法到达那里…
答案1
小编典典当http方法为OPTIONS时,避免过滤并设置状态200
if("OPTIONS".equalsIgnoreCase(request.getMethod())) { response.setStatus(HttpServletResponse.SC_OK);} else { chain.doFilter(req, res);}
ajax – 将数据发布到RESTful无效的HTTP状态代码405
function WishList() { } WishList.prototype.addToWishList = function(redirectURL,postURL,userObj) { $.ajax({ type: "POST",url: postURL,data: JSON.stringify(userObj),dataType: 'json',contentType: "application/json",success: function(data){alert(data);},failure: function(errMsg) { alert(errMsg); } } This is my object: var user1 = { ID:1,Sex:1,Name:"titi",Company:"ABC",Address:"Phnom Penh",Email:"test.abc@gmail.com",Phone:"011123456",WebAccount:"test.abc@gmail.com",Password:"123456",GroupCustomerID:125,Stars:1,IsVIP:0,PriceLevel:1,LastDateSale:"\/Date(-62135596800000)\/",TotalCredit:150.12,AgingData:null,TotalRedeemPoint:1000.00,RedeemData:null,ExchangeRate:155.00,HistoryData:null }; Calling function : $(document).ready(function () { var myWishList = new WishList(); $('#addToWishList').click(function(){ myWishList.addToWishList('http://www.blahblahblah.com','http://blahblah/Website/Products/Product.svc/Wishlist/',user1); }); });
然后我的控制台出错了:
“NetworkError:在Firefox中不允许405方法和无效的HTTP状态代码405,XMLHttpRequest无法在chrome中加载url.
注意:当我使用Chrome的Rest Client发布到Web服务时,它可以正常工作.
非常感谢任何帮助,谢谢.
http://praneeth4victory.wordpress.com/2011/09/29/405-method-not-allowed/
看起来他们可以在IE中使用它,但与其他浏览器有一些问题.也许这些改变将有助于更好地访问服务.
这篇文章很好地解释了它的错误和部分,所以如果上面的链接没有帮助,这个可以帮助你进一步诊断问题.
http://www.checkupdown.com/status/E405.html
好的最后编辑,只是想确保你有足够的信息,希望能解决你的问题,这里有一篇关于潜在问题的好文章,我相信你有…
http://www.d-mueller.de/blog/cross-domain-ajax-guide/
Angular 2 – 预检的响应具有无效的HTTP状态代码401
但不幸的是他们都没有帮助我:-(.
这是我的问题:我尝试从我的localhost连接到服务器上的REST服务.它适用于FF REST插件,但我的应用程序导致以下错误:
>选项http://…/my_REST_Service/ 401(未经授权)
> XMLHttpRequest无法加载http://…/my_REST_Service/.预检的响应具有无效的HTTP状态代码401
我如何尝试获取我想要的数据:
@Injectable() export class ModelsComponent implements OnInit { private restRoot = 'http://.../my_REST_Service'; private data; constructor(private http: Http) { } ngOnInit() { this.getModels().subscribe(res => { this.data = res; console.log(this.data); }); } authHeaders() { let username: string = 'xxxx'; let password: string = 'xxxx'; let token: string = btoa(username + ":" + password); let headers: Headers = new Headers(); headers.append('Access-Control-Expose-Headers','Authorization'); headers.append('Authorization','Basic ' + token); headers.append("Access-Control-Allow-Origin","http://localhost:4200/"); headers.append("Access-Control-Allow-Methods","*"); headers.append("Access-Control-Allow-Headers","Accept,Accept-Charset,Accept-Encoding,Accept-Language,Authorization,Connection,Content-Type,Cookie,DNT,Host,Keep-Alive,Origin,Referer,User-Agent,X-CSRF-Token,X-Requested-With"); headers.append("Access-Control-Allow-Credentials","true"); return headers; } getModels(): Observable<any> { return this.http.get(this.restRoot,{ headers: this.authHeaders(),withCredentials: true <- from a similar issue }).map(res => res.json()); } }
我的服务器配置如下:
Header set Access-Control-Allow-Origin "http://localhost:4200" Header set Access-Control-Allow-Headers "Accept,X-Requested-With" Header set Access-Control-Allow-Methods "*" Header set Access-Control-Allow-Credentials "true" Header set Access-Control-Expose-Headers "Authorization" <- from a similar issue
我知道还有其他相同/类似的问题.但我仍然不知道该做什么或怎么做.
如果有人可以帮我解决我的代码,我真的很感激!
解决方法
它没有说明你在Access-Control-Allow-Thing中提到的任何事情.
>浏览器正在发出OPTIONS请求,询问是否允许跨源请求.
>回复显示“您的用户名和密码错误”.
由于浏览器未收到发出交叉原始请求的权限:它尚未发送用户名和密码.
您需要在服务器上找到执行授权的代码,并从该测试中排除OPTIONS请求.任何人都应该能够提出OPTIONS请求,而不仅仅是拥有用户名和密码的人.
angular – HTTP状态代码401,即使我正在发送授权请求标头
在那里我尝试通过在我的Angualr代码中传递如下的JWT令牌来执行POST请求
save(jobId: number,taskId: number,note: Note) { return this.http.post(environment.APIENDPOINT + '/jobs/' + jobId + '/tasks/' + taskId + '/notes',note,this.setHeaders()).map((response: Response) => response.json()); }
private setHeaders() { // create authorization header with jwt token let currentUser = JSON.parse(localStorage.getItem('currentUser')); console.log("Current token---"+ currentUser.token); if (currentUser && currentUser.token) { let headers = new Headers(); headers.append('Content-Type','application/json'); headers.append('authorization','Bearer '+ currentUser.token); let r = new RequestOptions({ headers: headers }) return r; } }
但是在服务器端它返回状态码401.问题是在Springboot端它检查授权头如下,它返回null
String authToken = request.getHeader("authorization ");
然后我查看了请求标头,它在Access-Control-Request-Headers下有如下的授权标头.但它对服务器端是不可见的.
然后我进一步阅读并发现这可能是CORS配置的问题.所以我修改了我的CORS配置过滤器以使addExposedHeader如下所示
@Bean public CorsFilter corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("*"); config.addAllowedHeader("*"); config.addExposedHeader("authorization"); config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("GET"); config.addAllowedMethod("POST"); config.addAllowedMethod("PUT"); config.addAllowedMethod("DELETE"); //config.addExposedHeader("Content-Type"); source.registerCorsConfiguration("/**",config); return new CorsFilter(source); }
服务器仍然抱怨它无法找到Authorization标头.我在这里错过了什么吗?感谢你的帮助
解
在阅读下面的sideshowbarker评论后,我能够理解这个问题背后的基础知识.
在我的项目中,我有一个JWT令牌过滤器,在里面它始终检查Authorization标头.然后我将其修改如下,现在它按预期工作
protected void doFilterInternal(HttpServletRequest request,HttpServletResponse response,FilterChain chain) throws servletexception,IOException { try { if ("OPTIONS".equalsIgnoreCase(request.getmethod())) { response.setStatus(HttpServletResponse.SC_OK); }else{ String authToken = request.getHeader(this.tokenHeader); jWTTokenAuthenticationService.parseClaimsFromToken(authToken); -- } chain.doFilter(request,response); }Catch(AuthenticationException authEx){ SecurityContextHolder.clearContext(); if (entryPoint != null) { entryPoint.commence(request,response,authEx); } }
}
那是因为发生的事情是这样的:
>您的代码告诉您的浏览器它想要使用Authorization标头发送请求.
>您的浏览器说,好的,带有Authorization标头的请求要求我执行CORS预检OPTIONS,以确保服务器允许使用Authorization标头的请求.
>您的浏览器在没有Authorization标头的情况下将OPTIONS请求发送到服务器,因为OPTIONS检查的全部目的是查看是否可以包含该标头.
>您的服务器看到OPTIONS请求,但不是以指示它允许请求中的Authorization标头的方式响应它,而是由于它缺少标头而拒绝它使用401.
>您的浏览器需要对CORS预检做出200或204的响应,而是获得401响应.所以你的浏览器就在那里停止,从不尝试从你的代码中发出POST请求.
更多细节:
问题屏幕截图中的Access-Control-Request-Headers和Access-Control-Request-Method请求标头表明浏览器正在执行CORS preflight OPTIONS request.
在您的请求中存在Authorization和Content-Type:application / json请求标头是您的浏览器执行CORS预检的原因 – 在您的代码中尝试POST请求之前向服务器发送OPTIONS请求.因为OPTIONS预检失败,浏览器就会停在那里,从不尝试POST.
因此,您必须弄清楚发送请求的服务器上当前服务器端代码的哪一部分导致它需要OPTIONS请求的授权,并进行更改,以便它在没有授权的情况下以200或204成功响应响应OPTIONS被要求.
有关为特定的Spring服务器执行此操作的特定帮助,请参阅以下答案:
> Disable Spring Security for OPTIONS Http Method
> Spring CorsFilter does not seem to work still receiving a 401 on preflight requests
> Response for preflight has invalid HTTP status code 401 – Spring
> AngularJS & Spring Security with ROLE_ANONYMOUS still returns 401
angular – 身份验证错误:预检的响应具有无效的HTTP状态代码405
Failed to load resource: the server responded with a status of 405 (Method Not Allowed) Fetch API cannot load http://blah-blah-blah. Response for preflight has invalid HTTP status code 405
这是登录方法:
login(event,phone,password) { event.preventDefault(); window.fetch('http://blah-blah-blah',{ method: 'POST',headers: { 'Accept': 'application/json','Content-Type': 'application/json' },body: JSON.stringify({ phone,password }) }) .then(status) .then(json) .then((response:any) => { localStorage.setItem('access_token',response.id_token); this.router.parent.navigateByUrl('/home'); }) .catch((error) => { alert(error.message); console.log(error.message); }); }
CORS
.飞行前请求是一个特殊请求,浏览器在发出实际POST请求之前使用OPTIONS动词发送:
OPTIONS http://blah-blah-blah
服务器必须使用正常的200状态代码进行响应,并包含正确的CORS标头,指示允许哪些域向其发出请求.只有在那之后才会发送实际的POST请求.
您的API的问题是端点向此OPTIONS请求返回了405 Not Noted状态代码.因此,您需要修复API,使其支持OPTIONS动词.
今天关于预检的响应具有无效的HTTP状态代码401-Spring和http预检请求的讲解已经结束,谢谢您的阅读,如果想了解更多关于ajax – 将数据发布到RESTful无效的HTTP状态代码405、Angular 2 – 预检的响应具有无效的HTTP状态代码401、angular – HTTP状态代码401,即使我正在发送授权请求标头、angular – 身份验证错误:预检的响应具有无效的HTTP状态代码405的相关知识,请在本站搜索。
本文标签: