微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java Jersey CORS 不允许外部请求

如何解决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 举报,一经查实,本站将立刻删除。