java - 无法从 Angular 6 httpclient 向 java servlet 发送请求
问题描述
如何从 Angular 连接到 java Servlet?这是我的角度服务代码
import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";
import { Observable } from "rxjs";
@Injectable({ providedIn: "root" })
export class UploadService {
url: string;
constructor(private http: HttpClient) {
this.url = "http://localhost:8081/ServletSample/";
}
uploadFile(data): Observable<any> {
return this.http.post(this.url, data);
}
sendData(data): Observable<any> {
return this.http.post(this.url + "DataServlet", data);
}
}
下面是Authservice
import { Injectable } from "@angular/core";
import { HttpEvent, HttpHandler, HttpInterceptor } from "@angular/common/http";
import { HttpRequest } from "@angular/common/http";
import { Observable } from "rxjs";
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
const clonedRequest = req.clone({
headers: req.headers.set("X-CustomAuthHeader", "aaaa")
});
console.log("req", req);
console.log("new headers", clonedRequest.headers.keys());
return next.handle(clonedRequest);
}
}
java servlet 在以下端口中运行
http://localhost:8081/ServletSample/DataServlet
下面是java servlet代码
package com.test.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DataServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 548987777;
public DataServlet() {
super();
System.out.println("DataServlet constructor called");
}
/**
* @see Servlet#init(ServletConfig)
*/
public void init(ServletConfig config) throws ServletException {
System.out.println("DataServlet \"Init\" method called"+ config.toString());
}
/**
* @see Servlet#destroy()
*/
public void destroy() {
System.out.println("DataServlet \"Destroy\" method called");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException
{
System.out.println("DataServlet doGet method called"+ request);
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("DataServlet doPost method called");
}
}
但是当我发送请求时在浏览器控制台中出现错误
从源“ http://localhost:4201 ”访问“ http://localhost:8081/ServletSample/DataServlet ”的 XMLHttpRequest已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:没有“访问” -Control-Allow-Origin' 标头存在于请求的资源上。
解决方案
从您收到的错误来看,您必须在 servlet 上启用 CORS 以允许接受来自其他来源的调用。
只需创建一个private
方法并从您发送实际响应的方法中调用它。您可以headers
在此方法中设置。像这样的东西:
private void setAccessControlHeaders(HttpServletResponse resp) {
resp.setHeader("Access-Control-Allow-Origin", "http://localhost:9000");
resp.setHeader("Access-Control-Allow-Methods", "GET");
}
推荐阅读
- git - Git:直接在工作目录中进行的更改(链接到裸存储库)
- css - 有没有比 modal-lg 提供更大宽度的类?
- macos - 如何在不进行迁移的情况下卸载 macports?
- javascript - 使用 Ajax 显示部分视图模型 - ASP.NET C# AJAX JQuery
- html - 我怎样才能使这些盒子的尺寸相同?
- android - 获取空对象错误以在 recyclerView 中使用多个布局
- mongoose - 需要一个使用带静态或方法的 mockingoose 的示例
- linux - 如何制定正确的 iptable 规则,如浏览器端口配置
- clojure - 通过 Clojure 中值列表中的第一个元素获取键
- api - 在 React Native fetch 方法中解析 JSON 不起作用