我想用 angular 4 发送数据到 javaservlet(跨域)
I want to send data with angular 4 to javaservlet (cross-domain)
我想将数据形式 angular 4 发送到 java servlet 但我无法发送,因为没有通过访问控制。我想使用 java servlet
将数据插入数据库
这是我的代码
前端:data.service.ts
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Headers, RequestOptions, ResponseOptions } from '@angular/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class DataService {
result: any;
private url = '//localhost:8080/my-java-web/';
constructor(private _http: Http) { }
addBookWithPromise(user: object): Promise<object> {
const headers = new Headers({ 'Content-Type': 'application/json',
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods":" GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
"Access-Control-Allow-Credentials": "true"});
const options = new ResponseOptions({ headers: headers });
return this._http.post(this.url + 'loginsuccess', user,
options).toPromise()
.then(this.extractData)
.catch(this.handleErrorPromise);
}
private extractData(res: Response) {
const body = res.json();
return body.data || {};
}
private handleErrorObservable (error: Response | any) {
console.error(error.message || error);
return Observable.throw(error.message || error);
}
private handleErrorPromise (error: Response | any) {
console.error(error.message || error);
return Promise.reject(error.message || error);
}
}
后端:javaservlet
public class LoginSuccess extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.addHeader("Access-Control-Allow-Origin","*");
response.addHeader("Access-Control-Allow-Methods"," GET, POST, OPTIONS");
response.addHeader("Access-Control-Allow-Headers","Content-Type");
response.addHeader("Access-Control-Allow-Credentials", "true");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("Success" +username);
非常感谢
您需要阅读 CORS 协议。
不久前,我写了一篇关于实施 CORS 的文章 blog post。它基于 Spring 框架(特别是 Spring Boot)的使用,而不是直接使用 Servlet API,但它对 CORS 的工作原理有相当广泛的解释。
您的具体问题是您只处理 POSTs。
CORS 协议涉及 Web 浏览器向您的服务器发出 OPTIONS 请求。
正是这个 OPTIONS 请求必须在响应中返回 Access-Control-Allow-Origin 和相关的 headers。
如果浏览器在响应中看到那些 headers,它将执行 POST。
如果它在对 OPTIONS 请求的响应中没有看到那些 headers,您将收到一个 HTTP 错误,读取类似 "No 'Access-Control-Allow-Origin' header is present on the requested resource" 的内容,并且 POST 请求将不被制作。
我想将数据形式 angular 4 发送到 java servlet 但我无法发送,因为没有通过访问控制。我想使用 java servlet
将数据插入数据库这是我的代码 前端:data.service.ts
import { Injectable } from '@angular/core';
import { Http, Response } from '@angular/http';
import { Headers, RequestOptions, ResponseOptions } from '@angular/http';
import { Observable } from 'rxjs';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/toPromise';
@Injectable()
export class DataService {
result: any;
private url = '//localhost:8080/my-java-web/';
constructor(private _http: Http) { }
addBookWithPromise(user: object): Promise<object> {
const headers = new Headers({ 'Content-Type': 'application/json',
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods":" GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
"Access-Control-Allow-Credentials": "true"});
const options = new ResponseOptions({ headers: headers });
return this._http.post(this.url + 'loginsuccess', user,
options).toPromise()
.then(this.extractData)
.catch(this.handleErrorPromise);
}
private extractData(res: Response) {
const body = res.json();
return body.data || {};
}
private handleErrorObservable (error: Response | any) {
console.error(error.message || error);
return Observable.throw(error.message || error);
}
private handleErrorPromise (error: Response | any) {
console.error(error.message || error);
return Promise.reject(error.message || error);
}
}
后端:javaservlet
public class LoginSuccess extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.addHeader("Access-Control-Allow-Origin","*");
response.addHeader("Access-Control-Allow-Methods"," GET, POST, OPTIONS");
response.addHeader("Access-Control-Allow-Headers","Content-Type");
response.addHeader("Access-Control-Allow-Credentials", "true");
PrintWriter out = response.getWriter();
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println("Success" +username);
非常感谢
您需要阅读 CORS 协议。 不久前,我写了一篇关于实施 CORS 的文章 blog post。它基于 Spring 框架(特别是 Spring Boot)的使用,而不是直接使用 Servlet API,但它对 CORS 的工作原理有相当广泛的解释。
您的具体问题是您只处理 POSTs。 CORS 协议涉及 Web 浏览器向您的服务器发出 OPTIONS 请求。
正是这个 OPTIONS 请求必须在响应中返回 Access-Control-Allow-Origin 和相关的 headers。
如果浏览器在响应中看到那些 headers,它将执行 POST。
如果它在对 OPTIONS 请求的响应中没有看到那些 headers,您将收到一个 HTTP 错误,读取类似 "No 'Access-Control-Allow-Origin' header is present on the requested resource" 的内容,并且 POST 请求将不被制作。