如何解决Java Jersey CORS 不允许外部请求
我在 http://localhost:8093 上使用 Java Jersey 创建了一个简单的 REST API 接口,但是当我通过 javascript 通过不同的服务(例如 http://localhost:80/ )发送 XmlHTTPRequest 时,不允许使用 CORS。 这是我非常简单的代码片段:
//-----------------------------------------应用程序.java:
import javax.ws.rs.ApplicationPath;
import org.glassfish.jersey.server.ResourceConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@ApplicationPath("rest")
public class Application extends ResourceConfig {
public static void main(String[] args) {
SpringApplication.run(Application.class,args);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
}
}));
}
public Application() {
register(new UserAPI());
}
}
//----------------------------------------- UserAPI.java:
import java.text.ParseException;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Consumes("application/json")
@Produces("application/json")
@Path("user")
public class UserAPI {
@POST
@Path("add")
public void addUser(UserBean ub) throws ParseException,UserException,NullPasswordException{
Logger monGologger = Logger.getLogger( "org.mongodb.driver" );
monGologger.setLevel(Level.SEVERE);
User u= new User(ub.getUsername(),ub.getRole());
(new MongoDataManager()).addUser(u);
}
@POST
@Path("edit")
public void editUser(UserBean ub) throws ParseException,ub.getpassword());
u.setRole(Role.valueOf(ub.getRole()));
u.setPasswordLastUpdate(new Date());
(new MongoDataManager()).editUser(u);
}
@POST
@Path("delete")
public void deleteUser(UserBean ub) throws ParseException {
Logger monGologger = Logger.getLogger( "org.mongodb.driver" );
monGologger.setLevel(Level.SEVERE);
(new MongoDataManager()).deleteUser(ub.getUsername());
}
}
//----------------------------------------- UserBean.java:
public class UserBean {
private String username,password,temppass;
private String residence;
private String role;
private String password_lastupdate;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getpassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTemppass() {
return temppass;
}
public void setTemppass(String temppass) {
this.temppass = temppass;
}
public String getResidence() {
return residence;
}
public void setResidence(String residence) {
this.residence = residence;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getpassword_lastupdate() {
return password_lastupdate;
}
public void setPassword_lastupdate(String password_lastupdate) {
this.password_lastupdate = password_lastupdate;
}
}
//----------------------------------------- Javascript函数:
function create() {
event.preventDefault()
let isNew = document.getElementById("createNuovoUser").checked;
console.log(isNew)
let url;
let request = new XMLHttpRequest(); // new HttpRequest instance
if (isNew){
url = 'http://localhost:8093/rest/user/delete'
request.open("POST",url,true);
request.setRequestHeader("content-type","application/json");
request.onreadystatechange = function() {
if (this.readyState === 4) {
document.getElementById("createTextArea").value = username + "\n";
alert("User eliminato");
}
};
let username = document.getElementById("username").value
let role = document.getElementById("role").value
request.send(JSON.stringify({"username": username}));
} else{
url = 'http://localhost:8093/rest/user/add'
request.open("POST","application/json");
request.onreadystatechange = function() {
if (this.readyState === 4) {
document.getElementById("createTextArea").value = username + "\n" + role;
alert("User cereato");
}
};
let username = document.getElementById("username").value
let role = document.getElementById("role").value
request.send(JSON.stringify({"username": username,"role": role}));
} }
任何建议或解决方案表示赞赏 谢谢
解决方法
这是球衣的正常问题。 您只需要添加一个允许“选项”请求的请求过滤器
看看这个话题 How to handle CORS using JAX-RS with Jersey
在实践中,你需要实现一个类来扩展服务器配置
import java.io.IOException;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
@Provider
public class CORSFilter implements ContainerResponseFilter {
@Override
public void filter(ContainerRequestContext request,ContainerResponseContext response) throws IOException {
response.getHeaders().add("Access-Control-Allow-Origin","*");
response.getHeaders().add("Access-Control-Allow-Headers","CSRF-Token,X-Requested-By,Authorization,Content-Type");
response.getHeaders().add("Access-Control-Allow-Credentials","true");
response.getHeaders().add("Access-Control-Allow-Methods","GET,POST,PUT,DELETE,OPTIONS,HEAD");
}
}
然后在服务器类中使用此代码显式选择它
final ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(new CORSFilter());
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。