getAnonymousResolver:配置不允许匿名访问 - 请求凭据

时间:2015-04-28 18:48:27

标签: servlets cq5 aem sling

我正在使用CQ5.6并从服务进行servlet调用。在我的错误日志中,我从日志语句中得到“java.io.IOException:Server返回HTTP响应代码:401 for URL:http://localhost:4502/content/sports/jcr:content/parSports/sportsscores.scores”。

如何解决此问题? (我没有用凭证做任何事情)

这是我的服务:

mport org.apache.felix.scr.annotations.Activate
import org.apache.felix.scr.annotations.Component
import org.apache.felix.scr.annotations.Properties
import org.apache.felix.scr.annotations.Property
import org.apache.felix.scr.annotations.Service
import org.osgi.service.component.ComponentContext
import org.apache.sling.commons.osgi.PropertiesUtil

@groovy.util.logging.Slf4j
@Component(label = "SportsScoresInit Service", description =
        "Call the servlet that gets the sports scores", immediate = true, metatype =
        true)
@Service(ScoresInterface.class)
@Properties([
        @Property(label = "Dummy", name = "dummy", value = "Default dummy")
])

public class SportsScoresInitial implements ScoresInterface {
    public String scoresFromServlet = "Default"

    public String getScoresFromServlet() {
        setScoresFromServlet()
        return scoresFromServlet
    }
    public void setScoresFromServlet() {
        //date = request.getParameter("date")
        //log.debug("date: {}",date)
        log.debug("In service to call servlet")
        String urlString = "http://localhost:4502/content/sports/jcr:content/parSports/sportsscores.scores"

        log.debug("urlString: " + urlString)
        URL url = null
        HttpURLConnection connection = null
        int responseCode = -9
        String result = ""
        log.debug("Before call to Sports Scores servlet")
        long startTime = System.currentTimeMillis()
        try {
            url = new URL(urlString)
            log.debug("url: " + url)
            connection = (HttpURLConnection) url.openConnection()
            log.debug("Connection: " + connection)
            connection.setRequestMethod("GET")
            responseCode = connection.getResponseCode()
            log.debug("After calling Sports Scores servlet")
            BufferedReader reader
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
            log.debug("reader: " + reader)
            result = reader.readLine()
            long stopTime = System.currentTimeMillis()
            long elapsedTime = stopTime - startTime
            log.debug("Elapsed Time is... " + elapsedTime)
            log.debug("result: " + result)
            PrintWriter writer = response.getWriter()
            response.setContentType("application/json")
            response.setCharacterEncoding("UTF-8")
            //writer.write(result)
        } catch (MalformedURLException e) {
            log.error("MalformedURL")
            e.printStackTrace()
            log.debug("Cause: " + e.getCause())
        } catch (IOException e) {
            log.error("IOException")
            e.printStackTrace()
            log.debug("Cause: " + e.getCause())
        }
        scoresFromServlet = result
    }

}

// Pulls data from OSGi
@Activate
protected void activate(ComponentContext ctx) {
    // Grab property values and store to class variables
    //message = PropertiesUtil.toString(ctx.getProperties().get("message"), "Welcome to this service too")
}

这是我的servlet:

import org.apache.sling.commons.osgi.PropertiesUtil

import java.net.HttpURLConnection
import java.net.MalformedURLException
import java.net.URL

import org.apache.sling.api.servlets.SlingSafeMethodsServlet
import org.apache.sling.api.SlingHttpServletRequest
import org.apache.sling.api.SlingHttpServletResponse

import javax.servlet.ServletException




import org.apache.felix.scr.annotations.Activate
import org.apache.felix.scr.annotations.Properties
import org.apache.felix.scr.annotations.Property
import org.apache.felix.scr.annotations.sling.SlingServlet
import org.osgi.service.component.ComponentContext

import groovy.transform.CompileStatic;


@CompileStatic
@groovy.util.logging.Slf4j
@SlingServlet(
        name="sportsScoresServlet",
        resourceTypes="icidigital/components/content/sportsScores",  
        extensions="scores", // put this in the ajax call in the javascript
        methods="GET",
        metatype=true)
@Properties([
        @Property(name="SportsScoresServlet", description="Get JSON String sports scores", value="sports scores")
])

/**
 * Handles requests for getting weather information from OpenWeatherMap.org.  returns the information as a JSon string.
 */
public class SportsScores extends SlingSafeMethodsServlet {


    @Property(label = "The api key", value = 'b0fc12635bbf445aa1a9013c5766fdbf', description = "This is the API Key used to access the Sports Scores API") // register the api key in the OSGi console
    private static final String SPORTS_SCORES_API_KEY = "apikey"


    private String apikey = ""
    private String apikeyTest = ""
    private String date = ""

    @Override
    public void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response) throws ServletException, IOException {
        //System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, 'TRACE');
        //Properties p = new Properties(System.getProperties());
        //System.setProperty(Dorg.slf4j.simpleLogger.defaultLogLevel, 'TRACE');

        log.debug('doGet in SportsScores')
        writeScores(request, response)

    }

    /**
     * Gets current weather information from OpenWeatherMap.org API
     * @param request
     * @param response
     * @throws IOException
     */
    public void writeScores(SlingHttpServletRequest request, SlingHttpServletResponse response)   {
        date = request.getParameter("date")
        log.debug("date: {}",date)
        log.debug("scores api key: {}", apikey)
        String urlString = "http://api.nfldata.apiphany.com/mlb/v2/JSON/BoxScores/${date}?subscription-key=${apikey}"

        log.debug("urlString: " + urlString)
        URL url = null
        HttpURLConnection connection = null
        int responseCode = -9
        String result = ""
        log.debug("Before call to FantasyData")
        long startTime = System.currentTimeMillis()
        try {
            url = new URL(urlString)
            log.debug("url: " + url)
            connection = (HttpURLConnection) url.openConnection()
            log.debug("Connection: " + connection)
            connection.setRequestMethod("GET")
            responseCode = connection.getResponseCode()
            log.debug("After calling FantasyData")
            BufferedReader reader
            reader = new BufferedReader(new InputStreamReader(connection.getInputStream()))
            log.debug("reader: " + reader)
            result = reader.readLine()
            //jsonSlurp(result)
            long stopTime = System.currentTimeMillis()
            long elapsedTime = stopTime - startTime
            log.debug("Elapsed Time is... " + elapsedTime)
            log.debug("result: " + result)
            PrintWriter writer = response.getWriter()
            response.setContentType("application/json")
            response.setCharacterEncoding("UTF-8")
            writer.write(result)
        } catch (MalformedURLException e) {
            log.error("MalformedURL")
            e.printStackTrace()
        } catch (IOException e) {
            log.error("IOException")
            e.printStackTrace()
            log.debug("Cause: " + e.getCause())
        }
    }

    @Activate
    protected void activate(ComponentContext ctx)
    {
        Dictionary dict = ctx.getProperties()
        apikey = PropertiesUtil.toString(dict.get(SPORTS_SCORES_API_KEY),'');

        //apikey = PropertiesUtil.toString(context.getProperties().get("apikey"), "b0fc12635bbf445aa1a9013c5766fdbf") // Get the api key from the OSGi console
        log.debug("sports scores servlet activated")
    }

}

1 个答案:

答案 0 :(得分:1)

I don't think what you are trying to do make much sense. Why are you doing an Http connection to the instance itself? You are trying to access an authoring instance, which requires permissions to access it.

It seems you are doing things backwards. You should have a service where you access that third party service, and then use it in your servlet. That way you don't need to use an http connection to the same instance.

Having said that, if you still want to process a request through CQ5 from itself, you can use the SlingRequestProcessor上触发,无需打开实际连接即可在内部处理请求