GVKun编程网logo

预检的响应具有无效的HTTP状态代码401-Spring(http预检请求)

27

本篇文章给大家谈谈预检的响应具有无效的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预检请求)

预检的响应具有无效的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

ajax – 将数据发布到RESTful无效的HTTP状态代码405

我创建了一个方法将json数据发布到Web服务:
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

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

我知道还有其他相同/类似的问题.但我仍然不知道该做什么或怎么做.
如果有人可以帮我解决我的代码,我真的很感激!

解决方法

“我的服务器配置如此” – 这大多是无关紧要的.查看错误消息:“预检的响应具有无效的HTTP状态代码401”

它没有说明你在Access-Control-Allow-Thing中提到的任何事情.

>浏览器正在发出OPTIONS请求,询问是否允许跨源请求.
>回复显示“您的用户名和密码错误”.

由于浏览器未收到发出交叉原始请求的权限:它尚未发送用户名和密码.

您需要在服务器上找到执行授权的代码,并从该测试中排除OPTIONS请求.任何人都应该能够提出OPTIONS请求,而不仅仅是拥有用户名和密码的人.

angular – HTTP状态代码401,即使我正在发送授权请求标头

angular – HTTP状态代码401,即使我正在发送授权请求标头

最近我在我的Springboot和基于Angualr2的应用程序中引入了JWT身份验证.
在那里我尝试通过在我的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);
    }
}

}

您需要将服务器配置为不需要OPTIONS请求的授权(即,请求发送到的服务器 – 而不是服务于您的前端代码的服务器).

那是因为发生的事情是这样的:

>您的代码告诉您的浏览器它想要使用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

angular – 身份验证错误:预检的响应具有无效的HTTP状态代码405

我想实现身份验证.实际上,我的项目是在Angular 2 Beta中构建的,但我正在使用 this身份验证示例进行测试.我有自己的API,只是将其url添加到此示例项目中.它没有用)它显示了这个错误:
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);
});
}
看起来您正在尝试进行跨域AJAX调用.为此,您的远程服务器API必须支持 CORS.飞行前请求是一个特殊请求,浏览器在发出实际POST请求之前使用OPTIONS动词发送:
OPTIONS http://blah-blah-blah

服务器必须使用正常的200状态代码进行响应,并包含正确的CORS标头,指示允许哪些域向其发出请求.只有在那之后才会发送实际的POST请求.

您的API的问题是端点向此OPTIONS请求返回了405 Not Noted状态代码.因此,您需要修复API,使其支持OPTIONS动词.

今天关于预检的响应具有无效的HTTP状态代码401-Springhttp预检请求的讲解已经结束,谢谢您的阅读,如果想了解更多关于ajax – 将数据发布到RESTful无效的HTTP状态代码405、Angular 2 – 预检的响应具有无效的HTTP状态代码401、angular – HTTP状态代码401,即使我正在发送授权请求标头、angular – 身份验证错误:预检的响应具有无效的HTTP状态代码405的相关知识,请在本站搜索。

本文标签: