Avatar billede claus_joergensen Nybegynder
07. maj 2005 - 22:55 Der er 28 kommentarer

sessions i webservice

Hej

Jeg er ved at lave en slags kalender i XUL og J2EE.
Har min login webservice kørende, med mysql og det hele.

Men hvordan kan jeg gøre så at webservicen husker hvem der er logget ind, så der ikke skal sendes username/password for hver kommando ?

Gerne en dyb forklaring, da jeg er nybeynder inden for J2EE.

Apache Tomcat / WindowsXP
Avatar billede twm Nybegynder
07. maj 2005 - 23:04 #1
Du er nødt til at indføre din egen session. Dvs når brugeren logger ind giver du ham en unik tekst string, som der sendes med over hver gang der kaldes til webservicen.
Avatar billede twm Nybegynder
07. maj 2005 - 23:05 #2
alla:
public String login(String username, String password)
public getData(String token, String blablabla)
Avatar billede claus_joergensen Nybegynder
07. maj 2005 - 23:06 #3
Jeg skulle da mene at det var muligt at sætte session i selve webservicen.
XUL kan nemlig ikke håntere sessions, så vidt jeg ved.
Avatar billede claus_joergensen Nybegynder
07. maj 2005 - 23:07 #4
Kiggede lidt på http://www.eksperten.dk/spm/607408 , men kan ikke forstå det.
Ved ikke rigtigt hvad en WSDD er.
Avatar billede arne_v Ekspert
07. maj 2005 - 23:08 #5
Du kan godt bruge Basic authentication med Tomcat og Axis, hvor Tomcat administrerer
det på HTTP niveau.
Avatar billede twm Nybegynder
07. maj 2005 - 23:09 #6
Så vidt jeg ved understøtter webservices ikke sessions, medmindre man laver dem selv, som ovenfor eller bruger en tilsvarende teknologi som session beans
Avatar billede claus_joergensen Nybegynder
07. maj 2005 - 23:09 #7
Glemte at skrive at jeg benytter AXIS , men det er jo en selvfølge.

Dit svar er ihvertfald ikke korrekt, da http://ws.apache.org/axis/faq.html#faq9 siger at AXIS understøtter sessions.
Avatar billede arne_v Ekspert
07. maj 2005 - 23:09 #8
Hvis du bruger Apache Axis web service toolkit (og altså ikke SUN JWSDP), så
er WSDD den fil der styrer deployment af web servicen

WSDD = Web Service Deployment Descriptor
Avatar billede claus_joergensen Nybegynder
07. maj 2005 - 23:09 #9
arne_v kan du give et simpelt eksempel ?
Avatar billede arne_v Ekspert
07. maj 2005 - 23:14 #10
Jeg tror ikke at det er så svært.

Følgende burde virke:
  - sæt Tomcat op til container managed security
  - protect din web service web app i web.xml
  - sæt scope til session i din WSDD
  - fisk eventuelt oplysninger om brugernavn ud af message context i din web service

Jeg kan godt prøve og lave et eksempel.

Men hvis ikke du har arbejdet meget med Tomcat så kan det måske godt blive
lidt langhåret alligevel.
Avatar billede twm Nybegynder
07. maj 2005 - 23:14 #11
arne_v virker det kun med axis webservice klient eller ville det også virke med en .net klient?
Avatar billede arne_v Ekspert
07. maj 2005 - 23:19 #12
Principielt bør det også kunne bringes til at virke med .NET client.

Basic authentication er defineret i selve HTTP protokollen.

Men hvor nemt det er at få den header ind i requesten for en stub genereret
med wsdl tool er jeg ikke klar over.

Men det kunne man jo undersøge.
Avatar billede arne_v Ekspert
08. maj 2005 - 01:13 #13
Jeg har et kørende eksempel nu.
Avatar billede arne_v Ekspert
08. maj 2005 - 01:15 #14
1) sæt Tomcat op til container managed security

jeg er lidt doven her så jeg har bare oprettet et par brugere i conf/tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="wsusers"/>
  <user username="wsuser2" password="hemmeligt" roles="tomcat,wsusers"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="wsuser1" password="hemmeligt" roles="tomcat,wsusers"/>
</tomcat-users>

du vil sikkert hellere validere mod en database - men det er standard Tomcat at
sætte det op
Avatar billede arne_v Ekspert
08. maj 2005 - 01:16 #15
2) protect din web service web app i web.xml

jeg har sat følgende ind

  <security-constraint>
      <web-resource-collection>
          <web-resource-name>Protected web service</web-resource-name>
          <url-pattern>/*</url-pattern>
      </web-resource-collection>
      <auth-constraint>
          <role-name>wsusers</role-name>
      </auth-constraint>
  </security-constraint>
  <login-config>
      <auth-method>BASIC</auth-method>
  </login-config>
Avatar billede arne_v Ekspert
08. maj 2005 - 01:17 #16
selve web servicen Test.java

package test;

public class Test {
    private int v;
    public int getV() {
        return v;
    }
    public void setV(int v) {
        this.v = v;
    }
}
Avatar billede arne_v Ekspert
08. maj 2005 - 01:17 #17
3) sæt scope til session i din WSDD

min TestService.wsdd

<deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java">
    <service name="TestService" provider="java:RPC">
        <parameter name="className" value="test.Test"/>
        <parameter name="allowedMethods" value="*"/>
        <parameter name="scope" value="session"/>
    </service>
</deployment>
Avatar billede arne_v Ekspert
08. maj 2005 - 01:18 #18
og mit test program

package testtest;

import javax.xml.rpc.*;

import stub.*;

public class TestTest {
    public static void main(String[] args) throws Exception {
        TestService service = new TestServiceLocator();
        Test tst = service.getTestService();
        ((Stub)tst)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new Boolean(true));
        ((Stub)tst)._setProperty(Stub.USERNAME_PROPERTY, "wsuser1");
        ((Stub)tst)._setProperty(Stub.PASSWORD_PROPERTY, "hemmeligt");
        int n = (int)(System.currentTimeMillis() % 1000);
        System.out.println(n);
        tst.setV(n);
        for(int i = 0; i < 10; i++) {
            System.out.println(tst.getV());
        }
    }
}
Avatar billede arne_v Ekspert
08. maj 2005 - 01:19 #19
og du får aldrig det lort buildet uden ant så her er en build.xml

<project name="test" default="deploy">
    <path id="axis.classpath">
        <fileset dir="/Jakarta/Axis-1_2RC3/lib">
            <include name="**/*.jar"/>
        </fileset>
    </path>
    <taskdef resource="axis-tasks.properties" classpathref="axis.classpath"/>
    <target name="build">
        <javac classpathref="axis.classpath" srcdir="srvsrc" destdir="srvbin"/>
        <jar destfile="test.jar" basedir="srvbin"/>
    </target>
    <target name="deploy" depends="build">
        <copy file="test.jar" todir="/Jakarta/Tomcat-5.5.7/webapps/axis/WEB-INF/lib"/>
        <axis-admin hostname="localhost" port="8080" xmlfile="TestService.wsdd" username="wsuser1" password="hemmeligt"/>
    </target>
    <target name="stubgen" depends="deploy">
        <axis-wsdl2java output="gensrc" url="http://localhost:8080/axis/services/TestService?wsdl" username="wsuser1" password="hemmeligt">
            <mapping namespace="http://localhost:8080/axis/services/TestService" package="stub"/>
        </axis-wsdl2java>
        <javac classpathref="axis.classpath" srcdir="gensrc" destdir="clibin"/>
    </target>
    <target name="testbuild" depends="stubgen">
        <javac classpathref="axis.classpath" srcdir="clisrc" destdir="clibin"/>
    </target>
    <target name="testrun" depends="deploy,testbuild">
        <java fork="yes" classpathref="axis.classpath" classpath="clibin" classname="testtest.TestTest"/>
    </target>
</project>
Avatar billede arne_v Ekspert
08. maj 2005 - 01:24 #20
directories er:

srvsrc
clisrc

gensrc

srvbin
clibin
Avatar billede arne_v Ekspert
08. maj 2005 - 01:24 #21
Hvis du i web servicen skal bruge username så er det i MessageContext - skriv hvis
jeg skal putte det ind
Avatar billede arne_v Ekspert
08. maj 2005 - 09:18 #22
det kan faktisk gøres lidt fixere end jeg plejer at gøre det

kode kommer her
Avatar billede arne_v Ekspert
08. maj 2005 - 09:18 #23
package test;

import javax.xml.rpc.server.*;

public class Test implements ServiceLifecycle {
    private int v;
    private ServletEndpointContext wsctx;
    public void init(Object context) {
        wsctx = (ServletEndpointContext)context;
    }
    public void destroy() {
        wsctx = null;
    }
    public int getV() {
        return v;
    }
    public void setV(int v) {
        this.v = v;
    }
    public String getUser() {
        return wsctx.getUserPrincipal().getName();
    }
}
Avatar billede arne_v Ekspert
08. maj 2005 - 09:18 #24
package testtest;

import javax.xml.rpc.*;

import stub.*;

public class TestTest {
    public static void main(String[] args) throws Exception {
        TestService service = new TestServiceLocator();
        Test tst = service.getTestService();
        ((Stub)tst)._setProperty(Stub.SESSION_MAINTAIN_PROPERTY, new Boolean(true));
        ((Stub)tst)._setProperty(Stub.USERNAME_PROPERTY, "wsuser1");
        ((Stub)tst)._setProperty(Stub.PASSWORD_PROPERTY, "hemmeligt");
        System.out.println(tst.getUser());
        int n = (int)(System.currentTimeMillis() % 1000);
        System.out.println(n);
        tst.setV(n);
        for(int i = 0; i < 10; i++) {
            System.out.println(tst.getV());
        }
    }
}
Avatar billede arne_v Ekspert
08. maj 2005 - 11:36 #25
og en C# client til twm:

using System;
using System.Net;

public class TestTest
{
    public static void Main(string[] args)
    {
        ServicePointManager.Expect100Continue = false; // to avoid .NET - Tomcat 5 bug
        TestService tst = new TestService();
        CredentialCache auth = new CredentialCache();
        NetworkCredential basic = new NetworkCredential("wsuser1", "hemmeligt");
        auth.Add(new Uri(tst.Url), "Basic", basic);
        tst.Credentials = auth;
        tst.CookieContainer = new CookieContainer();
        Console.WriteLine(tst.getUser());
        int n = (int)(DateTime.Now.Ticks % 10000000);
        Console.WriteLine(n);
        tst.setV(n);
        for(int i = 0; i < 10; i++)
        {
            Console.WriteLine(tst.getV());
        }
    }
}
Avatar billede claus_joergensen Nybegynder
08. maj 2005 - 19:39 #26
nice, omend lidt langhåret som du sagde :D
Vil nok tage mit et par dage at teste, så vender tilbage senere på ugen.

Indtil videre mange tusind tak.
Avatar billede arne_v Ekspert
28. maj 2005 - 16:47 #27
OK ?
Avatar billede arne_v Ekspert
24. juli 2005 - 17:18 #28
du har ikke accepteret svaret ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester