繁体   English   中英

Liferay:允许远程访问JSON Web服务

[英]Liferay: Allow remote access to JSON Web Services

我正在尝试从同一台机器访问,但访问的端口是Liferay提供的JSON Web服务的不同端口。

我在portal-ext.properties文件中设置了以下属性:

json.servlet.hosts.allowed=127.0.0.1
auth.token.check.enabled=true
jsonws.servlet.https.required=false
json.web.service.enabled=true
axis.servlet.hosts.allowed=127.0.0.1
json.service.auth.token.hosts.allowed=127.0.0.1

我还从$LIFERAY_HOME/tomcat-8.0.32/webapps/ROOT/WEB-INF/web.xml配置了web.xml文件,并添加了以下内容,尽管在论坛的某些帖子中说这是不必要的:

<filter>
    <filter-name>CorsFilter</filter-name>
    <filter-class>org.apache.catalina.filters.CorsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CorsFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

我可以通过curl访问端点,但是无法从另一个端口上运行的应用程序中获取以下错误:

 Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

以下是使用Javascript进行请求的代码:

var url = `http://127.0.0.1:8080/api/jsonws/user/get-user-by-email-address/?companyId=20116&emailAddress=test%liferay.com&p_auth=${key}`;

var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener('readystatechange', function () {
  if (this.readyState === 4) {
    console.log(this.responseText);
  }
});

xhr.open('GET', url);
xhr.setRequestHeader('authorization', 'Basic Y2FsYmVyY2FAYXV0ZW50aWEuY29tOnRlc3Q=');
xhr.setRequestHeader('cache-control', 'no-cache');

xhr.send(data);

我认为这与portal-ext.properties配置有关,也许与端口有关。 有任何想法吗?

这并不是Liferay的错误配置,而是与浏览器安全相关的问题,称为CORS(跨源资源共享)。 您可以在此处阅读有关它的更多信息,但总的来说,可以归结为以下事实:为了使site Asite B加载资源(本质上是XMLHttpRequest所做的), site B需要指定该资源可用于site A通过特殊的头!

Liferay显然不这样做,因为它无法知道您将从何处消耗资源。 对于您要进行的工作,需要创建一个Servlet过滤器并将其部署到Liferay,然后在其中自己添加适当的标头。 此处提供了此类过滤器的示例。

我决定追随的方法是创建一个OSGi的模块使用刀片CLI支持Liferay提供脚手架休息服务( blade.rest与JAX-RS)(作为解释这里 )。 从那里,我配置了CXF端点和REST扩展器。 然后,我将UsersRestService类修改为以下内容:

package com.liferay.blade.samples.rest;

import com.liferay.portal.kernel.service.UserLocalService;

import java.util.Collections;
import java.util.Set;

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Application;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;

@ApplicationPath("/blade.users")
@Component(
    immediate = true, property = {"jaxrs.application=true"},
    service = Application.class
)
public class UsersRestService extends Application {

    @Override
    public Set<Object> getSingletons() {
        return Collections.singleton(this);
    }

    @GET
    @Path("/list")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getUsers() {
        String json = "{\n" + "  \"value\": \"cool\"\n" + "}";
        return Response
                .status(200)
                .entity(json)
                .build();
    }

    @Reference
    private volatile UserLocalService _userLocalService;

}

在此类中,您可以访问Liferay的服务,因此可以向API Rest公开您想要的内容。

我需要检查的最后一件事是“ Access-Control-Allow-Origin”属性,因为它似乎是在分配的位置,但是我不知道在哪里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM