Søger du en specifik kategori?

 



Oprettet man. d. 09. marts 2009 kl. 15:24

arne_v
arne_v (1.016.094 point)
Guidens karaktér
1
2
3
4
5

Java web applikationer med Tomcat

Denne artikel beskriver hvordan man kan konfigurere container managed security og en database connection pool i Tomcat. Den forudsætter lidt erfaring med Java web applikationer og Tomcat.
Historie:
V1.0 - 13/01/2004 - original
V1.1 - 31/01/2004 - forbedret formatering
V1.2 - 09/02/2004 - flere ændringer af formatering
Container managed security
I Java web applikationer skelner man mellem:
  - container managed security
  - application managed security

container managed security = JSP/servlet engine styrer sikkerheden

application managed security = mine JSP og servlet styrer selv
sikkerheden

Man skelner også mellem:'
  - declarative security
  - programmatic security

declarative security = adgangen angives i XML config fil

programmatic security = adgangen angives i Java kode

Jeg vil forklare hvordan man bruger container managed declarative
security med Tomcat.

Det er interessant, fordi det er det som kræver mindst kode.

Man skal bruge en database med 2 tabeller med 2 felter i hver.

De kan f.eks. oprettes med:

CREATE TABLE Tomcat_users (
  username VARCHAR(50) NOT NULL,
  password VARCHAR(50) NOT NULL,
  PRIMARY KEY(username)
);

CREATE TABLE Tomcat_roles (
  username VARCHAR(50) NOT NULL,
  role VARCHAR(50) NOT NULL,
  PRIMARY KEY(username, role)
);


Man skal så ligge noget data ind. Mit test eksempel bruger:

INSERT INTO Tomcat_users(username, password)
VALUES('system', 'system');
INSERT INTO Tomcat_users(username, password)
VALUES('arne', 'arne');

INSERT INTO Tomcat_roles(username, role)
VALUES('arne', 'user');
INSERT INTO Tomcat_roles(username, role)
VALUES('system', 'user');
INSERT INTO Tomcat_roles(username, role)
VALUES('system', 'administrator');

d.v.s. bruger system har user+administrator rolle, mens
bruger arne kun har user rolle.

Så indsætter man en referance til dem i conf/server.xml:

<Realm  className="org.apache.catalina.realm.JDBCRealm" debug="99"
              driverName="sun.jdbc.odbc.JdbcOdbcDriver"
              connectionURL="jdbc:odbc:TestMSAccess"
              connectionName="" connectionPassword=""
              userTable="Tomcat_users" userNameCol="username" userCredCol="password"
              userRoleTable="Tomcat_roles" roleNameCol="role" />


Jeg har bare brugt JDBC ODBC Bridge og MS Access til min test her.

JDBC driver jar filer skal anbringes i common/lib.

Hvis nu man f.eks. vil have 2 forskellige områder:
  - et som alle har adgang til
  - et som kun brugere med administrator rolle har adgang til
så fordeler man indholdet i /open/* og /secure/* og putter
følgende i web.xml:

  <security-constraint>
      <web-resource-collection>
          <web-resource-name>open part</web-resource-name>
          <url-pattern>/open/*</url-pattern>
      </web-resource-collection>
      <auth-constraint>
          <role-name>user</role-name>
      </auth-constraint>
  </security-constraint>
  <security-constraint>
      <web-resource-collection>
          <web-resource-name>secure part</web-resource-name>
          <url-pattern>/secure/*</url-pattern>
      </web-resource-collection>
      <auth-constraint>
          <role-name>administrator</role-name>
      </auth-constraint>
  </security-constraint>
  <login-config>
      <auth-method>FORM</auth-method>
      <form-login-config>
          <form-login-page>/login.jsp</form-login-page>
          <form-error-page>/error.jsp</form-error-page>
      </form-login-config>
  </login-config>


Man laver en login.jsp som indeholder:

<form action="j_security_check" method="POST">
Username: <input type="text" name="j_username"><br>
Password: <input type="text" name="j_password"><br>
<input type="submit" value="Login">
</form>

og en error.jsp som indeholder:

Login failed !

Og det er faktisk alt. Så sørger Tomcat for resten.

Database connection pool
Det er nødvendigt for god performance af en seriøs web applikation at
bruge en database connection pool.

Genbrug af connections forbedrer performance voldsomt, da det er en
meget dyr operation at lave en fysisk database connection.

Ved at have et begrænset antal fysiske database connectiosn, så undgår
man også at databasen løber tør for connections og at applikationen
derfor går ned.

En database connection pool fungerer på den måde at:
  - poolen initialiseres med N fysiske database connections
  - når en side skal bruge en database connection så låner
    den en logisk database connection fra poolen og leverer den
    tilbage igen efter brug

Man konfigurerer så en DataSource i en context (wep applikation)
i conf/server.xml:

      <Context docBase="pooltest" path="/pooltest" reloadable="true">
            <Resource auth="Container" name="jdbc/TestMySQL" type="javax.sql.DataSource" />
            <ResourceParams name="jdbc/TestMySQL">
                <parameter>
                      <name>factory</name>
                      <value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
                </parameter>
                <parameter>
                      <name>maxActive</name>
                      <value>100</value>
                </parameter>
                <parameter>
                      <name>maxIdle</name>
                      <value>30</value>
                </parameter>
                <parameter>
                      <name>maxWait</name>
                      <value>10000</value>
                </parameter>
                <parameter>
                      <name>username</name>
                      <value></value>
                </parameter>
                <parameter>
                      <name>password</name>
                      <value></value>
                </parameter>
                <parameter>
                      <name>driverClassName</name>
                      <value>com.mysql.jdbc.Driver</value>
                </parameter>
                <parameter>
                      <name>url</name>
                      <value>jdbc:mysql://localhost/Test</value>
                </parameter>
            </ResourceParams>
          </Context>

JDBC driver jar filer skal anbringes i common/lib.

Min web applikation hedder pooltest. Jeg bruger en MySQL database.
Og jeg giver den JNDI navnet jdbc/TestMySQL. Parameterne er vist
nærmest selvforklarende.

Når man så skal bruge en database connection henter man den med:

import java.sql.*;
import javax.naming.*;
import javax.sql.*;

...

Context init = new InitialContext();
Context ctx = (Context) init.lookup("java:comp/env");
DataSource ds = (DataSource) ctx.lookup("jdbc/TestMySQL");
Connection con = ds.getConnection();


Den connection man får kan man bruge helt ligesom en connection hentet
med traditionel JDBC DriverManager.getConnection.

Når man skal frigive connection bruger man bare:

con.close();


Mere skal der ikke til.

Skrevet tir. d. 13. januar 2004 kl. 23:24| #1

Ok havde et lille problem med at jeg i forvejen havde et default Realm der bruger xml, men nu spiller det.

Skrevet lør. d. 13. marts 2004 kl. 18:27| #2

roo104 (20.170 point)
Jeg tror jeg havde samme problem som loadet, så brugte <DefaultContext> så virkede det.

Skrevet tir. d. 10. april 2007 kl. 13:52| #3


Skriv en kommentar



Mest populære guides

Guidens karakter
!!!Karaktér: 3
14 stemmer
31/01 - 2011
Af: heinzdmx

Dropbox - gratis online lagerplads

Jeg vil i denne guide forklare lidt om hvad Dropbox er og også hvordan du får mest mulig plads på Dropbox. Dropbox er kort sagt en service hvor du har dine data lagt til backup på både nettet og din egen computer.
Guidens karakter
!!!Karaktér: 4
33 stemmer
02/02 - 2009
Af: jkrons

Dato- og tidsberegninger i Excel

En introduktion til simple beregninger med dato og tid i Excel. Opdateret med afsnit om beregning af tillæg.
Excel  |  Læs »
Guidens karakter
!!!Karaktér: 4
21 stemmer
06/11 - 2011
Af: fromsej

Sådan fjerner du virus og malware

Udviklingen går stærkt på "skidt"fronten, så vi har sammensat en ny og effektiv programpakke til fjernelse af det.
Virus  |  Læs »

Log ind

   

   



   




Tips & Tricks fra PC World

Teaser billede

Top 5: Virale YouTube-videoer fra Danmark

Lægger du mærke til de mere eller mindre skjulte reklamebudskaber, når du ser videoer på nettet? Vi har taget et kig på fem utrolige danske videoer, som er blevet virale hit.


Anmeldelser fra PC World

Teaser billede

Test: Mobil med Ferrari-design - og en Trabant-motor

Motorola har begået endnu en smartphone med lækkert design og potentiale til at være blandt de bedste. Men den når ikke i mål. Se her hvorfor.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Sådan fupper smarte svindlere dig på Facebook

Se hvordan du undgår Facebook-fup i fremtiden.


Nyheder fra Computerworld

Teaser billede

App-udvikling 2.0: Sådan er den perfekte app

ComputerViews: Den værste app-hype er ved at have lagt sig, og nu ser vi konturerne af fremtidens app-design. Men hvordan udnytter man de mobile muligheder optimalt?


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger