webForumDet fria alternativet

Optimering av Java & SQL

18 svar · 2 541 visningar · startad av jme

jmeMedlem sedan maj 20012 237 inlägg
#1

Hej!

Placerar denna tråd under J2EE, eftersom mycket av inlägget baseras på användning under J2EE.

Håller på med en www-applikation (Tomcat 5.0.18) åt en kund. Applikationen byggs upp av J2EE (servlets & jsp). Applikationen använder MySql(4.0.13) som databas databas.

Vi har märkt att sidorna är en aning långsamma.
Vill nu optimera koden.

Kan man på ett absolut säkert sätt stoppa direkt åtkomst på *.jsp filer?

Försökte med att skapa en <servlet-mapping> i web.xml men det slutade med stack-overflow då en förfrågan övergick till en "for(;;)" loop. ;) Dvs mappningen gjorde det så att varje anrop mot en jsp-sida skickades till servletten som sedan dirigerade förfrågan till en handler. Men då handlern skickade sedan svaret i form av en jsp-sida, så.... ;)

<servlet-mapping>
<servlet-name>MinController</servlet-name>
<url-pattern>/jsp/*</url-pattern>
</servlet-mapping>

Just nu har vi tyvärr det så dumt, att en validering görs även på varje jsp-sida och i den s k controller servletten.

Så vill jag inte ha det.

Sedan några sql-frågor:

Jag har läst om att följande är att föredra:

String t = result.getString(int_värde) // result = (ResultSet)

i stället för:

String t = result.getString("kolumnNamn")

Just nu har jag det så här:

UserBean b;

b.setName(result.getString("name") );
b.setEmail(result.getString("email") );
b.setAge(result.getInt("age") );

om jag nu använder result.getString(int_värde) så inser jag inte riktigt, hur jag på ett enkelt sätt kan göra som ovan, utan en himla massa switch() satser...

Om jag inte kör med kolumn-namnen så måste jag ju veta i vilken ordning allt finns i ResultSet objektet. Så har jag det för mig iaf.

Sen måste jag ocksp pilla ihop en s k ConnectionPool, dvs ett system för att "återanvända" uppkopplingarna mot databasen och inte skapa ett nytt för varje anrop. Så som jag har det just nu.

Systemet är skapat för kanske 10-20 personer som inte kommer att använda det samtidigt.

Sen ännu en dum fråga, som jag faktiskt hittills har förbisett: :r

Måste man göra nåt speciellt, för att ha ett system som stödjer föera samtidiga användare?

Servlet-ramverket borde väl vara multitrådad?

spangoMedlem sedan juni 20008 205 inlägg
#2
  1. Varför hindra direkt åtkomst av jsp-filer? :q
  2. Jag tvivlar spontant på att ResultSet.getXXX(int) är så överdrivet mycket snabbare än ResultSet.getXXX(String), men det är bara min spontana gissning. Lookupen är ju inte särdeles komplicerad, även om det väl är snabbare att direktindexera med intar i stället.
  3. Om servlets är multitrådade eller inte beror på servern. Tomcat bör "rimligen" vara det, ja ;)
jmeMedlem sedan maj 20012 237 inlägg
#3
  1. Varför hindra direkt åtkomst av jsp-filer?

Vissa sidor, t ex admin.sidor är enbart för admins. Försöker man nå, som vanlig användare, sidan /admin/admin.jsp så får man ett felmeddelande.

Vi har mappat handlers mot vissa namn:

t ex handlern admin mot adressen

/Controller?cmd=admin

Även om man som vanlig användare aldrig ser en länk med ovanstående, så vet man aldrig, om nån illvillig person kommer på det som står ovan.

En kontroll av behörighet görs alltid, innan en förfrågan utförs.

Om man nu skriver https://www.adress.com/jsp/admin/admin.jsp

så måste en kontroll göras på i jsp-sidan om användaren har rätt till resursen.

Just nu har vi det tyvärr så. Jag tycker det är ett rätt så klumpigt sätt.

Kontrollen görs i princip två gånger.

Controller servletten tar emot en förfrågan, skickar den till en sk handler som sedan bearbetar förfrågan och skickar ett svar. Controller servletten-tar emot svaret och genom en

getServletContext().getRequestDispatcher(...).forward() så skickas man till rätt jsp-sida (då görs ännu en kontroll).

Jag testade med att mappa alla *.jsp anrop till controller servletten, men det resulterade i en evighetsloop, då controllern returnerar en adress till en jsp-sida, så fångar den den igen.

Förstår ni? :)

spangoMedlem sedan juni 20008 205 inlägg
#4

Så använd Tomcat för att autentisera, då.

jmeMedlem sedan maj 20012 237 inlägg
#5

Menar du realms?

spangoMedlem sedan juni 20008 205 inlägg
#6

Ja. Något som hindrar?

jmeMedlem sedan maj 20012 237 inlägg
#7

Nej, tror inte det. Ska titta närmare på realms.

antilizaerMedlem sedan apr. 200357 inlägg
#8

Tror att du kommer känna in en del genom att använda en Connection pool för databasen som du är inne på, men dumt att pilla ihop en egen, använd Tomcats inbyggda istället. Kanske var den du hade i åtanke, bara så att du inte pillar ihop något som redan finns...

jmeMedlem sedan maj 20012 237 inlägg
#9

antilizaer: Du är ju min räddning! :D

Viste ju inte att Tomcat har en inbyggd connection pool.

Måste givetvis kika på det.

jmeMedlem sedan maj 20012 237 inlägg
#10

Tittade igenom server.xml. Tyvärr verkar de inte ha lagt till stöd för Tomcats Connection Pool. Kan ju alltid fråga om de vill göra det men eftersom det tar tid att konfigurerar och säkerställe funktionaliteten, så är jag inte riktigt säker på saken. Har bar read-access på server.xml så jag kan inte sjävl göra nåt åt saken.

LimeMedlem sedan sep. 2001961 inlägg
#11

Nej TC5 har inte inbyggda Connections pools men det finns färdigskrivna för MySQL.

jmeMedlem sedan maj 20012 237 inlägg
#12

spango:

realms i TC är väl som htaccess i Apache?

Dvs om en användare försöker nå en jsp-sida, han/hon inte har access till, så visas ett login-fönster, eller?

Så vill jag inte ha det, utan jag vill att användaren skickas till en error-sida.

spangoMedlem sedan juni 20008 205 inlägg
#13

Det finns olika sätt på hur man får realms att funka. Använder du FORM som auth-method skickas man till en sida där man ombeds logga in, om det känns bättre...

jmeMedlem sedan maj 20012 237 inlägg
#14

det låter bra!

jmeMedlem sedan maj 20012 237 inlägg
#15

OT: märkte just att jag har iaf read access på alla andra användares kataloger, kan läsa deras web.xml osv.

Inte bra...

jmeMedlem sedan maj 20012 237 inlägg
#16

OT:

-rw-r--r--
betyder väl att bara ägaren kan både läsa och skriva, medlemmar ia samma grupp kan bara läsa och alla andra kan läsa?

spangoMedlem sedan juni 20008 205 inlägg
#17

Japp. Och den umasken är väl normalinställningen på *nix-system.

susnetMedlem sedan nov. 20048 inlägg
#18

DBCP är en bra connection pool att använda ihop med Tomcat.

TomasJMedlem sedan feb. 200563 inlägg
#19

Re: Optimering av Java & SQL

jme skrev:

Kan man på ett absolut säkert sätt stoppa direkt åtkomst på *.jsp filer?

Det enklaste sättet är nog att lägga JSP-sidorna i en underkatalog till WEB-INF.
Se avsnittet "Resource Guards via Simple and Generic Configuration" på följande URL:
http://www.corej2eepatterns.com/Design/PresoDesign.htm

jme skrev:

  1. Varför hindra direkt åtkomst av jsp-filer?

Vissa sidor, t ex admin.sidor är enbart för admins. Försöker man nå, som vanlig användare, sidan /admin/admin.jsp så får man ett felmeddelande.

Vi har mappat handlers mot vissa namn:

t ex handlern admin mot adressen

/Controller?cmd=admin

Även om man som vanlig användare aldrig ser en länk med ovanstående, så vet man aldrig, om nån illvillig person kommer på det som står ovan.

Man kan även tillägga att det inte bara är illvilliga personer som man vill stoppa utan även sökmotorer, så att man slipper få besökare till JSP-sidor som man inte hade tänkt sig att någon skulle besöka direkt.

Om man har en applikation som är baserad på JSP model 2, d.v.s. om man använder en servlet-controller som ser till att populera bönorna som sedan ska visas på en jsp-sida, så kan nämligen en sådan sida vara ganska innehållslös alternativt innehålla fula felmeddelanden om man tillåter direktaccess utan att gå genom controllern.
Därför vill man gärna undvika att ge sökmorer och besökare direktaccess till JSP-sidorna.

/ Tomas

130 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
127 ms — hämta tråd, inlägg och bilagor (db)