Search code examples
liferayliferay-6

Liferay jsonws not accessible from remote location


My liferay portlet jsonws not accessible from remote location but i can access it using localhost

example [http://localhost:8050/MySite-portlet/api/secure/jsonws] is accesible on the lacal machine
but when i try to access it remotely using the external ip e.g
[http://120.23.223.24:8050/MySite-portlet/api/secure/jsonws] its returning me the Connection refused error

However [http://120.23.223.24:8050/api/jsonws] and [http://120.23.223.24:8050/web/MySite] is working

my portal-ext.properties file contains the following entries

open.id.auth.enabled=
auth.login.site.url=
auth.login.community.url=
company.default.home.url=
default.logout.page.path=
default.landing.page.path=
redirect.url.ips.allowed=
jsonws.servlet.hosts.allowed=
json.servlet.hosts.allowed=
json.web.service.enabled=true
jsonws.web.service.public.methods=*
json.service.auth.token.enabled=true
jsonws.web.service.strict.http.method=false

I am using liferay-tomcat 6.1.0

Below is the error I am getting

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.


    exception

    `java.net.ConnectException: Connection refused: connect
        java.net.PlainSocketImpl.socketConnect(Native Metho

d)
    java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
    java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
    java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
    java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
    java.net.Socket.connect(Socket.java:529)
    java.net.Socket.connect(Socket.java:478)
    sun.net.NetworkClient.doConnect(NetworkClient.java:163)
    sun.net.www.http.HttpClient.openServer(HttpClient.java:394)
    sun.net.www.http.HttpClient.openServer(HttpClient.java:529)
    sun.net.www.http.HttpClient.<init>(HttpClient.java:233)
    sun.net.www.http.HttpClient.New(HttpClient.java:306)
    sun.net.www.http.HttpClient.New(HttpClient.java:323)
    sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:860)
    sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:801)
    sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:726)
    sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1049)
    java.net.URL.openStream(URL.java:1010)
    com.liferay.portal.jsonwebservice.JSONWebServiceServlet.service(JSONWebServiceServlet.java:136)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    com.liferay.portal.kernel.servlet.PortalClassLoaderServlet.service(PortalClassLoaderServlet.java:98)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
    sun.reflect.GeneratedMethodAccessor218.invoke(Unknown Source)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    com.liferay.portal.kernel.bean.ClassLoaderBeanHandler.invoke(ClassLoaderBeanHandler.java:54)
    $Proxy431.doFilter(Unknown Source)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
    com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:121)
    com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:201)
    com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:48)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:203)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:105)
    com.liferay.portal.kernel.servlet.PortalClassLoaderFilter.doFilter(PortalClassLoaderFilter.java:69)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:203)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:105)
    com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:70)`

Solution

  • Can you set up a debugger to look into this? If you look at the code in JSONWebServiceServlet, you'll find this in service() (I took the code from 6.1.1 which I have available - this differs from the line numbers in your sample - you might want to try an update as well, something has changed in this class. Also, for brevity, I've eliminated empty lines and some linebreaks, don't let that irritate you)

        if (servletContext.getContext(PropsValues.PORTAL_CTX) != null) {
            RequestDispatcher requestDispatcher = request.getRequestDispatcher(
                apiPath);
            requestDispatcher.forward(request, response);
        }
        else {
            String requestURI = request.getRequestURI();
            String requestURL = String.valueOf(request.getRequestURL());
            String serverURL = requestURL.substring(0, requestURL.length() - requestURI.length());
            String queryString = request.getQueryString();
            if (Validator.isNull(queryString)) {
                queryString = StringPool.BLANK;
            }
            else {
                queryString += StringPool.AMPERSAND;
            }
            String servletContextPath = ContextPathUtil.getContextPath(servletContext);
            queryString +=  "contextPath=" + HttpUtil.encodeURL(servletContextPath);
      // CHECK THIS VALUE IN DEBUGGER:
            apiPath = serverURL + apiPath + StringPool.QUESTION + queryString;
            URL url = new URL(apiPath);
            InputStream inputStream = null;
            try {
                inputStream = url.openStream();
                OutputStream outputStream = response.getOutputStream();
                StreamUtil.transfer(inputStream, outputStream);
            }
            finally {
                StreamUtil.cleanUp(inputStream);
            }
        }
    

    One possibility is that Liferay itself can't connect to the server name that it determines - e.g. because of Firewall or DNS setup. Once you know what apiPath results in (sadly there seems to be no logging that you could activate) you should be a lot closer to the solution than now.