Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Апплеты > Апплет и WebService


Автор: vlad1823 13.10.2011, 13:01
Создан Java-апплет... Среда разработки "SpringSource Tool Suite Version: 2.6.1.RELEASE". Java version "1.6.0_22". В среде разработки апплет отлично отрабатывает...
Что главное в нем... Он вызывает на выполнение метод setData WebService... WebService находится на отдельном Linux сервере...
Данный метод производит изменение атрибута приложения InfoSphere.
Как только апплет запускаю не из среды, апплет отображается в браузере, но в методе апплета, где происходит обращение к WebService вылетает ошибка.
Про FAQ http://base.vingrad.ru/view/112-Podpisi-v-apletah---kak-eto-delaetsya- читал. Да и другие статьи тоже... http://www.javable.com/columns/crypto/workshop/01/ch1/?print...
Но невыходит каменный цветок у Данилы-мастера...
Метод в апплете, где происходит вызов WebService
Цитата

    private void extracted(String arg0, String arg1, String arg2, String arg3) {
  try {
    // First create the connection
    SOAPConnectionFactory soapConnFactory = SOAPConnectionFactory
     .newInstance();
    SOAPConnection connection = soapConnFactory.createConnection();

    // Next, create the actual message
    MessageFactory messageFactory = MessageFactory.newInstance();
    SOAPMessage message = messageFactory.createMessage();

    // Create objects for the message parts
    SOAPPart soapPart = message.getSOAPPart();
    SOAPEnvelope envelope = soapPart.getEnvelope();
    SOAPBody body = envelope.getBody();

    // Populate the body
    // Create the main element and namespace
    SOAPElement bodyElement = body.addChildElement(envelope.createName(
     "setData", "nsi", "http://nsi.asur.mos.ru/"));
    // // Add content
    bodyElement.addChildElement("arg0").addTextNode(arg0);
    bodyElement.addChildElement("arg1").addTextNode(arg1);
    bodyElement.addChildElement("arg2").addTextNode(arg2);
    bodyElement.addChildElement("arg3").addTextNode(arg3);

    
    //System.getSecurityManager().checkAccept("192.168.11.120", 7507);
    // Save the message
    message.saveChanges();

    // Check the input
    System.out.println("\nREQUEST:\n");
    message.writeTo(System.out);
    // Send the message and get a reply

    // Set the destination
    String destination = "http://192.168.11.120:7507/nsidataset/SetDataSrvc";
    // Send the message
    SOAPMessage reply = connection.call(message, destination);
    // Check the output
    System.out.println("\nRESPONSE:\n");
    // Create the transformer
    TransformerFactory transformerFactory = TransformerFactory
     .newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    // Extract the content of the reply
    Source sourceContent = reply.getSOAPPart().getContent();
    // Set the output for the transformation
    StreamResult result = new StreamResult(System.out);
    System.out.println("\n");
    transformer.transform(sourceContent, result);

    System.out.println();
    // Close the connection
    connection.close();
  } catch (Exception e) {
    String s = "";
    for (StackTraceElement iterable_element : e.getStackTrace()) {
    s += iterable_element.getClassName() + "."
      + iterable_element.getMethodName() + "."
      + iterable_element.getLineNumber() + "\n";
    }
    e.printStackTrace();
    generatredSignatureTextField.setText(e.getMessage() + " \n " + s);
  }
    }

Место ошибки 
Цитата
SOAPMessage reply = connection.call(message, destination);

И так, что сделал для создания доверенного апплета:
1. Создание JAR-архива
Цитата
jar cvf AppletNew.jar AppletNew

2. Создал в keystore свой персональный сертификат...
Цитата
keytool -genkey -alias signEDS -keystore compstore -keypass <....> -storepass <....> -dname "CN=EDS, OU=JavaSoft, O=<....>, L=<....>, S=<....>, C=RU"

3. Подписал апплет созданным сертификатом...
Цитата
jarsigner -keystore compstore -storepass <....> -keypass <....> -signedjar SAppletNew.jar AppletNew.jar signEDS

Файлы в каталоге META-INF: MANIFEST.MF, SIGNEDS.DSA, SIGNEDS.SF имеются...
4. Перекинул файлы: 
SAppletNew.jar - подписанный апплет;
compstore - созданное хранилище сертификатов.
в другой каталог (E:\1\) для тестирования апплета.
В этом каталоге создал HTML-файл вызова апплета
Цитата

<html>
    <body>
  <applet code="AppletNew/AppletNew.class" ARCHIVE="SAppletNew.jar" width=400 height=400>
    <PARAM name="xml" value="Это XML-файл">
    <PARAM name="name_catalog" value="Базовый регистр">
    <PARAM name="id_item" value="citizenshipType">
  </applet>
    </body>
</html>

5. В файле "C:\Program Files\Java\jre6\lib\security\java.policy" добавил:
Цитата

keystore "file:E:\1\compstore";
grant {
    permission java.net.SocketPermission "192.168.11.120:7507", "accept";
    permission java.net.SocketPermission "192.168.11.120:7507", "connect";
    permission java.net.SocketPermission "192.168.11.120:7507", "listen";
};
для того чтобы указать в политике безопасности, что мы можем доверять апплету и разрешить обращение по URL...

Ну и теперь запускаю апплет в браузере... Апплет отображается... Формируется подпись, как и положено, НО при отсылании подписи на WebService вылетает ошибка...
Цитата
403Forbidden
 
(Запрещено) Сервер понял запрос, но он отказывается его выполнять из-за ограничений в доступе со стороны клиента к указанному ресурсу.
Чего нехватает ?
А скорее всего политики безопасности... Но что еще нужно указать?

Автор: Skipy 13.10.2011, 13:12
Если бы были ограничения доступа - до сервера бы дело даже не дошло. 403-я ошибка возвращется сервером, когда клиент запрашивает ресурс, доступ к которому запрещен на сервере. Т.е. клиент полез "не туда". 

Автор: vlad1823 14.10.2011, 05:42
Skipy
Точно, когда апплет запускаю просто в браузере, то через прокси запрос идет....
Спасибо...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)