我正在开发一个web应用程序,包括UI-Angular,Server-Java,RestEasy 3.0.9.Final for rest api calls
当我试图从另一个域访问其余服务时,我得到以下错误
无法加载对预检请求的响应未通过访问控制检查:请求的资源上不存在"Access-Control-Allow-Origin"标头.因此,不允许来源" http:// localhost:8080 "访问.
我配置我的服务器端以响应跨域调用,这是使用GET调用但POST调用正在创建ERROR
web.xml中
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>com.test.sample.app.CorsFeature</param-value>
</context-param>
<listener>
<listener-class>
org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
</listener>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>resteasy-servlet</servlet-name>
<servlet-class>
org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>com.test.sample.app.Application</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>resteasy-servlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>resteasy.servlet.mapping.prefix</param-name>
<param-value>/rest</param-value>
</context-param>
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
服务类
@GET
@Path("/getnameAtt")
@Produces(MediaType.APPLICATION_JSON)
public Response getHostnameAttributes() {
return Response
.status(200)
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Headers",
"origin, content-type, accept, authorization")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods",
"GET, POST, PUT, DELETE, OPTIONS, HEAD")
.header("Access-Control-Max-Age", "1209600")
.entity(new TestImpl().getHostNameAttributes())
.build();
}
@POST
@Path("/getSeq") …Run Code Online (Sandbox Code Playgroud) 目前,我做了类似的事情
import javax.annotation.Nonnull;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
@ApplicationPath("oauth")
public class OAuthApplication extends Application {
final Set<Class<?>> classes = new HashSet<>();
@Nonnull
@Override
public Set<Class<?>> getClasses() {
classes.add(RegisterResource.class);
return Collections.unmodifiableSet(classes);
}
}
Run Code Online (Sandbox Code Playgroud)
不,如果我添加十个新Resource的ApplicationPath,我需要做
classes.add(<ClassName>.class);
Run Code Online (Sandbox Code Playgroud)
十次,这是乏味的,有时也是健忘的.
请问JAX-RS或RESTEasy提供,这样我可以提包名和类是在它扫描的方式吗?
我知道Jersey有一些东西
public class MyApplication extends ResourceConfig {
public MyApplication() {
packages("org.foo.rest;org.bar.rest");
}
}
Run Code Online (Sandbox Code Playgroud)
有什么想法/想法吗?
UPDATE
似乎我们可以做到以下 web.xml
<context-param>
<param-name>resteasy.scan</param-name>
<param-value>true</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
有具体的Java等价物吗?
我有两个服务器(Apache和JBoss AS7),我需要提供对客户端的所有http方法的访问.所有这些请求必须通过ajax发送.客户端代码示例:
$.ajax({
type: "get",
url: "http://localhost:9080/myproject/services/mobile/list",
crossDomain: true,
cache: false,
dataType: "json",
success: function(response) {
console.log(response);
},
error: function (jqXHR, textStatus, errorThrown) {
console.log(textStatus);
console.log(jqXHR.responseText);
console.log(errorThrown);
}
});
Run Code Online (Sandbox Code Playgroud)
在JBoss AS7中我使用RESTEasy,实现如下CORS:
@Path("/mobile")
@Provider
@ServerInterceptor
public class GroupMobile implements MessageBodyWriterInterceptor {
@Inject
private GroupDAO groupDAO;
@GET
@Path("/list")
@Produces(MediaType.APPLICATION_JSON)
public List<Group> getGroups() {
return groupDAO.listAll();
}
@Override
public void write(MessageBodyWriterContext context) throws IOException,
WebApplicationException {
context.getHeaders().add("Access-Control-Allow-Origin", "*");
context.proceed();
}
@OPTIONS
@Path("/{path:.*}")
public Response handleCORSRequest(
@HeaderParam("Access-Control-Request-Method") final String requestMethod,
@HeaderParam("Access-Control-Request-Headers") final String requestHeaders) …Run Code Online (Sandbox Code Playgroud) 我的JAX-RS应用程序有一个扩展的Application类.
@ApplicationPath("/")
public class MyApplication extends Application {
// empty; really empty
}
Run Code Online (Sandbox Code Playgroud)
如何在org.glassfish.jersey.media.multipart.MultiPartFeature不修改课程的情况下启用?或者没有必要注册所有资源类/包?
我正在使用AngularJS和Resteasy开发一个应用程序.正如所料,我面临众所周知的问题
XMLHttpRequest cannot load http://localhost:8080/..... No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:3000' is therefore not allowed access. The response had HTTP status code 403.
正如在其他堆栈溢出帖[1]上看到的,我尝试使用来自Feature对象的Resteasy的CorsFilter,但我得到:
[33m02:06:57,883 WARN [org.jboss.resteasy.core.ExceptionHandler] (default task-1) failed to execute: javax.ws.rs.ForbiddenException: Origin not allowed: http://localhost:3000
at org.jboss.resteasy.plugins.interceptors.CorsFilter.checkOrigin(CorsFilter.java:194)
at org.jboss.resteasy.plugins.interceptors.CorsFilter.filter(CorsFilter.java:134)
Run Code Online (Sandbox Code Playgroud)
我的CorsFeature对象:
@Provider
public class CorsFeature implements Feature {
@Override
public boolean configure(FeatureContext context) {
CorsFilter corsFilter = new CorsFilter();
corsFilter.getAllowedOrigins().add("*");
context.register(corsFilter);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在web.xml中我添加了:
<context-param>
<param-name>resteasy.providers</param-name> …Run Code Online (Sandbox Code Playgroud) 我有一个包含三个资源的 REST-API。第一个中的方法称为 PublicResource,任何人都应该可以访问(即匿名访问)。第二个方法中的方法称为 SecretResource,应该只能由特定的用户组访问。最后,称为 MixedResource 的第三个资源具有混合设置,其中一些方法受到保护,一些方法对公共访问开放。
注释@PermitAll 和@RolesAllowed 并不像我期望的那样工作。尽管 PublicResource 用 @PermitAll 进行了注释,但我在尝试访问它时仍然会被要求授权。MixedResource 中用@PermitAll 注释的方法也是如此。所以基本上,我的所有资源都被要求授权,即使我应该匿名访问。
我在 Payara 4.1 上运行,我很困惑,因为我在另一个运行在 WebLogic 12.1.3 上的应用程序中进行了非常相似的设置,并且注释按预期工作。我错过了什么或弄错了什么?在下面查看我的完整代码。
公共资源.java:
import javax.annotation.security.PermitAll;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
@Path("public")
@PermitAll
public class PublicResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String itsPublic() {
return "public";
}
}
Run Code Online (Sandbox Code Playgroud)
秘密资源.java:
import javax.annotation.security.RolesAllowed;
import javax.ws.rs.GET;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
@Path("secret")
@RolesAllowed({ "SECRET" })
public class SecretResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String itsSecret() {
return "secret";
}
}
Run Code Online (Sandbox Code Playgroud)
混合资源.java:
import …Run Code Online (Sandbox Code Playgroud) 将corsfilter添加到ApplicationPath后,我无法访问任何服务
这是一个例子
import java.util.HashSet;
import java.util.Set;
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
import org.jboss.resteasy.plugins.interceptors.CorsFilter;
@ApplicationPath("/")
public class JaxRsActivator extends Application {
private Set<Object> singletons = new HashSet<Object>();
private Set<Class<?>> classes = new HashSet<Class<?>>();
public JaxRsActivator() {
CorsFilter corsFilter = new CorsFilter();
corsFilter.getAllowedOrigins().add("*");
corsFilter.setAllowedHeaders("Content-Type");
singletons.add(corsFilter);
}
@Override
public Set<Class<?>> getClasses() {
return classes;
}
@Override
public Set<Object> getSingletons() {
return singletons;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我卷曲,我会得到这个,
curl -i http://localhost:8080/unika/usuarios -H "Origin:otherdomain.com"
HTTP/1.1 404 Not Found
Connection: keep-alive
Access-Control-Allow-Origin: otherdomain.com
X-Powered-By: Undertow 1
Server: Wildfly 8 …Run Code Online (Sandbox Code Playgroud) 我在用resteasy-jaxrs - 3.0.9.FINAL。我有两个独立javax.ws.rs.core.Application的
@ApplicationPath("oauth")
public class OAuthApplication extends Application {
final Set<Class<?>> classes = new HashSet<>();
@Nonnull
@Override
public Set<Class<?>> getClasses() {
classes.add(RegisterResource.class);
classes.add(TokenResource.class);
classes.add(HelloResource.class);
return Collections.unmodifiableSet(classes);
}
}
Run Code Online (Sandbox Code Playgroud)
对于/oauth基于端点和
@ApplicationPath("rest")
public class RestApplication extends Application {
final Set<Class<?>> classes = new HashSet<>();
@Nonnull
@Override
public Set<Class<?>> getClasses() {
classes.add(CategoryResource.class);
classes.add(CategoryGroupResource.class);
classes.add(TransactionResource.class);
classes.add(MonthlySummaryResource.class);
classes.add(MemberResource.class);
return Collections.unmodifiableSet(classes);
}
}
Run Code Online (Sandbox Code Playgroud)
我的过滤器看起来像
@Provider
public class CorsFeature implements Feature {
@Override
public boolean configure(FeatureContext featureContext) {
CorsFilter corsFilter …Run Code Online (Sandbox Code Playgroud)