Aplicație informatică pentru comunicarea online intre mai mulți utilizatori [302633]

UNIVERSITATEA TEHNICĂ DE CONSTRUCȚII BUCUREȘTI

FACULTATEA DE HIDROTEHNICĂ

DOMENIU: INGINERIA SISTEMELOR

SPECIALIZAREA: AUTOMATICĂ SI INFORMATICĂ APLICATĂ

PROIECT DE LICENȚĂ

CORDONATOR ȘTINȚIFIC: ABSOLVENT: [anonimizat]. Univ. Dr. [anonimizat]

2019

UNIVERSITATEA TEHNICĂ DE CONSTRUCȚII BUCUREȘTI

FACULTATEA DE HIDROTEHNICĂ

DOMENIU: INGINERIA SISTEMELOR

SPECIALIZAREA: AUTOMATICĂ SI INFORMATICĂ APLICATĂ

Aplicație informatică pentru comunicarea online intre mai mulți utilizatori

CORDONATOR ȘTINȚIFIC: ABSOLVENT: [anonimizat]. Univ. Dr. [anonimizat]

2019

CUPRINS

INTRODUCERE 2 pg

CONCEPTE SI TEHNOLOGII INFORMATICE UTILIZATE 21 pg

Limbajul de marcare HTML

Conținutul unui fisier HTML

HTML versiunea 5

Cascade style sheets

Limbajul Java Server Pages

2.3.1. [anonimizat]-finally

SGBD Oracle si legatura ei cu Limbajul Java.

[anonimizat].

Clasa ServerSocket

Clasa Socket

Securizarea datelor prin criptare DES

Studiul de caz. Aplicație informatică pentru comunicarea online intre mai mulți utilizatori 21p

3.1. Descrierea generala a aplicatiei informatice

3.2. Descrierea detaliata a modulelor aplicatiei informatice

3.2.1. Diagrame UML

3.2.2. Crearea utilizatorulu și structura bazei de date

3.2.3. Modulele din partea serverului

3.2.4. Front-end

3.2.5. Back-end

3.2.6. Modulele din partea clientului

Concluzii și contributii 3 paginii

Prezentarea succinta a celor 3 capitole

Contribuții

Bibliografie

Anexe 20 [anonimizat], având un impact major în funcționarea unor instituții și servicii.

Securitatea cibernetică joacă un rol esențial pentru transmiterea informațiilor. Securitatea cibernetica este o protecție a sistemului, rețelei si programelor de atacuri digitale. [anonimizat], schimbarea sau chiar si distrugerea conținuturilor de informație; extragerea de bani de la utilizatori; ori intreruperea proceselor unei companii de afaceri.

[anonimizat]. Acestea pot fi sisteme de gestiune a documentelor, [anonimizat] a proceselor tehnologice etc. [anonimizat], [anonimizat], [anonimizat].

Majoritatea sistemelor de baze de date existente sunt relaționale și asupra lor se pot efectua diferite categorii de operații:

• introducerea de date (insert);

• ștergerea unor date din baza de date (delete);

• actualizarea datelor (update);

• interogarea bazei de date (query) [anonimizat].

Multe amenințări online vin sub forma de a da click pe un anumit link sau de a deschide atașamentul unui mesaj primit prin intermediul poștei electronice. [anonimizat] prin care scanează sistemul de operare dupa un program de securitate(exemplu antivirus) sau prin instalarea unui coder ori a unui player pentru a vedea continutul fisierului.

Deoarece această temă este complexă, am ales această aplicatie din mai multe motive care o să încerc sa le prezint cat mai scurt.

Primul motiv al alegerii temei il constituie posibilitatea realizării și dezvoltării unei aplicații software care sa permită utilizatorilor să își trimită mesaje in timp real, intr-un mod simplu și rapid. Mesajele trimise cat și conținutul bazei de date sunt securizate cu ajutorul criptării. Administratorul nu are acces la mesajele utilizatorilor cat si la informațiile care le cuprinde baza de date.

Al doi-lea motiv il reprezintă companiile. Multe companii naționale și internaționale au restrictionate website-urile de socializare, prin care angajații pot sa comunice intre ei.

Aplicația informatică de comunicare online dispune si de un sistem de logare unde utilizatorii îsi completează un formular cu datele lor personale. Datele cu caracter personal ai utilizatorilor sunt trecute intr-o baza de date unde este realizată etapa de criptare.

Înregistrarea utilizatorilor poate să fie facută in două moduri:

aplicatie

website

CONCEPTE SI TEHNOLOGII INFORMATICE UTILIZATE

În acest capitol sunt descrise conceptele si tehnologiile care au stat la baza realizarii aplicației software “APLICAȚIE INFORMATICA PENTRU COMUNICARE ONLINE INTRE MAI MULȚI UTILIZATORI”.

Limbajul de marcare HTML

HTML (Hypertext Markup Language) este un limbaj de marcare care sta la baza dezvoltarii oricarei pagini Web. Limbajul HTML consta intr-o serie de etichete numite si tag-uri care permit formatarea modului de afisare a informatiei din pagina Web (folosirea unor anumite font-uri, culori si stiluri pentru text, inserarea unor imagini sau a unor tabele, utilizarea listelor si a formularelor etc.) [7].

Tag-urile HTML sunt incluse intre paranteze ascuțite < >, majoritatea dintre ele fiind in pereche, tag-ul de inceput avand sintaxa < > iar tag-ul de sfarsit </ >. Unele dintre tag-urile HTML permit precizarea unor caracteristici ale elementului pe care il introduc, sub forma caracteristica=valoare, aceste caracteristici fiind numite atribute. O etichetă poate avea unul sau mai multe atribute.

Conținutul unui document HTML nu este case-sensitive, nu se face diferența intre litere mari si mici la nivelul etichetelor si atributelor, insă valoarea unui atribut poate fi case-sensitive, cum este cazul locațiilor fisierelor si adreselor URL.

Doua dintre trăsăturile de bază ale unui document HTML sunt independenta fată de platforma utilizată si legaturile hypertext.

Independența fată de platformă este o trasatură care permite documentulul HTML sa fie afișat in mod asemanator pe diferite calculatoare din punct de vedere al graficii, fontului, culorii, lucru extrem de esențial pentru un număr mare de vizitatori. Totuși, interpretarea codului HTML poate sa fie diferită in funcție de tipul de browser Web utilizat. Astfel un document HTML poate fi afisat de catre un browser intr-un anumit fel, iar de catre alt browser in alt fel.

2.1.1. Conținutul unui fisier HTML

Hyperlink-urile au o importantă majora in cadrul unui Website, intrucat permit ca orice cuvânt, frază, imagine sau element al unei pagini Web sa facă referire la o alta pagină Web sau chiar la paragrafe din interiorul aceleiași pagini, realizandu-se astfel navigarea cu ușurintă intre paginile unui site Web sau intre parțile componente ale aceleiași pagini.

Pentru crearea unei simple pagini în cod HTML sintaxa completă este următoarea:

<!DOCTYPE html> declarare HTML5

<html> începutul documentului

<head> începutul antetului

<title>Titlu</title> titlu paginii

</head> sfârșitul antetului

<body> începutul corpului

</body> sfârșit corpului

</html> sfârșitul documentului

După cum se poate vedea mai sus, un document HTML este incadrat intre tag-urile <HTML> și </HTML> (care indică începutul si finalul documentului) si conține:

zonă de antet este cuprinsã între tag-urile: <HEAD> … </HEAD>

un corp care este delimitat de tag-urile: <BODY> … </BODY>

Zona de antet poate fi utilizată pentru specificarea unor cuvinte cheie si informații care descriu pagina, indexabile de catre motoarele de cautare Web (pentru regasirea site-ului), utilizând suplimentar in această sectiune etichete de tip meta. In cadrul zonei de antet, se poate specifica, titlul paginii Web, intre etichetele <TITLE>…</TITLE>, acesta fiind afișat pe bara de titlu a ferestrei browserului. Secțiunea body conține conținutul propriu-zis al paginii Web: text, tabele, liste, imagini, formulare etc. Acest format al documentului nu este obligatoriu, putand lipsi atat sectiunea <HEAD>, cât si tag-urile <HTML> și <BODY>, ramanând doar conținutul paginii Web. Totuși, se recomanda utilizarea structurii de baza a unui document HTML, conținutul său fiind mai bine organizat si mai usor de urmarit in aceasta situatie. Întotdeauna ar fi sugerat sa se adauge și eticheta <!DOCTYPE html> pentru a recunoaște browserul pagina ca fiind HTML 5.

2.1.2. HTML versiunea 5

HTML 5 este ultima versiune folosită care vine cu o serie de facilitați care îmbunătățesc performanțele multimedia ale aplicațiilor Web. Astfel, dinamica unei pagini este mult mai crescută prin introducerea unor noi etichete vizând partea audio, video și grafică, tratarea erorilor este mai simplă și eficientă, iar pentru o serie de etichete HTML anterioare sunt modificate și atributele.

Limbajul HTML dă autorilor posibilitatea[15]:

să publice documente cu headere, texte, tabele, liste, fotografii, etc…

să regăsească on-line informații prin intermediul hiperlink-urilor accesate printr-un simplu click de mouse

să proiecteze formulare pentru realizarea tranzacțiilor cu servere aflate la distanță, pentru căutari de informație sau pentru activități specifice comerțului

să includă foi de calcul tabelar, clipuri video, sunete și alte aplicații direct în document

HTML 5 implică o utilizare intensivă a altor tehnologii bazate pe CSS având o deschidere, capacitate mult mai mare de integrare cu noi tehnologii, ceea ce îl plasează ca potențial câștigător în confruntarea cu tehnologia. De menționat totuși că în acest moment se pare ca nici un browser Web nu suporta în totalitate HTML 5, pe cele mai bune browsere Web sunt Google Chrome, Safari și Firefox.

2.2.1. Cascading style sheets

O pagină Web scrisă în CSS poate fi interpretată mai ușor de către diferite browsere. Principalele acțiuni sunt: mărirea sau micșorarea dimensiunii textului, transformarea conținutului paginii Web în fișiere audio sau fișiere interpretabile de către un dispozitiv Braille.

CSS este folosit pentru stilul paginilor web, acestea inglobeaza, sub un anumit nume, atribute de formatare care se aplica asupra unui element individual din pagina, asupra unui grup de elemente sau la nivelul intregului document.

Prin utilizarea unui element individual din interiorul său, poate fi controlat mai ușor. Stilurile pot fi aplicate asupra unui element, a unui document sau chiar asupra unui intreg website. Un dezavantaj ar fi ca unele navigatoare nu sunt compatibile CSS, astfel ca documentele HTML sunt afisate ca si cum CSS n-ar exista, dar cele mai cunoscute si utilizate browsere, cum ar fi: Mozilla Firefox, Internet Explorer, Opera, si altele, sunt compatibile CSS.

Pentru a interpreta cât mai corect conținutul unor pagini Web, trebuie să poată fi "văzut" simplu, neformatat, toate formatările să fie făcute cu ajutorul CSS-urilor.

CSS functioneaza cu HTML, insa nu este HTML. El extinde functionalitatile HTML, permițând redefinirea etichetelor HTML existente.

Legătura dintre HTML și CSS se realizează prin intermediul tag-ului <style>…</style> care trebuie așezat între antetul <head> și </head>.

Avantajele utilizării CSS[8]:

paginile se încarcă mai repede;

se poate modifica foarte ușor aspectul unui întreg site;

avem mult mai puțin cod de scris pentru o pagină Web;

site-ul are mai multe șanse să fie interpretat corect de către cât mai multe browsere.

Stilurile definesc modul de dispunere a elementelor într-unul sau mai multe documente HTML.

Etichetele stilurilor HTML[8]:

<style> -definește stilul unui document HTML;

<link> -definește o resursă ca referință;

<div> -definește o secțiune dintr-un document (element de nivel bloc generic);

<span> -definește atașarea CSS la o mică porțiune a unui rând dintr-un document (element inline generic);

<font> -definește dimensiunea, culoarea, tipul textului;

<basefont> -definește fontul de bază dintr-un document;

<center> -centrează textul dintr-un document.

În limbajul HTML există două tipuri de elemente:➢elemente de nivel bloccaresunt afișate cu începere de pe un rând nou;➢elemente inlinecare sunt afișate pe același rând.

Întreaga structură este denumita set de reguli (dar adesea este prescurtată „regulă”).

Selector – numele elementului HTML la începutul setului de reguli. Acesta selectează elementul (elementele) care trebuie stilizate (în acest caz, elementele p). Pentru a stiliza un element diferit, doar schimbă selectorul.

Declarația – o singură regulă precum color:red; care precisează care dintre proprietățile elementului vor fi stilizate

Proprietăți – moduri în care poți stiliza un element HTML dat.(În acest caz, color este o proprietate a elementelor). În CSS, alegi proprietățile care vrei să le modifici folosindu-te de regula ta.

Limbajul Java Server Pages

Java Server Pages (JSP) reprezintă una dintre cele mai puternice tehnologii Web si este ușor de folosit. JSP combină HTML si XML cu servleturile ai tehnologia JavaBeans pentru a crea un mediu destul de productiv pentru dezvoltarea de situri Web independente de platformă și de o inaltă performanță[2].

Tehnologia JSP facilitează crearea conținutului dinamic pe partea de server a paginiilor Web. Este asemanatoare cu ASP (Active Server Pages) de pe platforma Microsoft Windows si cu PHP (PHP: Hypertext Preprocessor), care este independent de platformă. JSP reprezintă o soluție Java pentru programarea pe partea de server, fiind o alternativă la CGI-urile clasice. JSP integrează numeroase tehnologii Java cum ar fi servleturile, JavaBeans și JDBC[2].

JSP extinde limbajul HTML oferind posibilitatea inserării de secvențe de cod Java prin intermediul unor marcaje speciale. Programatorul are posibilitatea de a crea noi marcaje și componente JavaBeans cu semnificațiile indicate de acesta. Astfel, se pot crea noi facilități pentru cei care se ocupă de partea de Web design[2].

În același timp, JSP este o extensie a servleturilor. Îm loc să scriem cod Java care să genereze pagini Web, vom crea pagini Web care vor conține elemente dinamice. Atunci cand se primește prima cerere pentru o pagină JSP, se creează un servlet din respectiva pagină și acesta este executat; apoi rezultatul este trimis ca răspuns la cererea primită[2].

Un avantaj important al JSP-ului față de servleturi este faptul că se separă conținutul HTML static de cel dinamic. În cazul servleturilor, orice modificare minora asupra designului paginii Web implica recompilarea respectivului servlet. La JSP-uri, partea de generare a conținutului dinamic este păstrată separat de cea statică prin utilizarea componentelor JavaBeans externe. Orice modificare a părții statice va fi vizibilă celor ce accesează respectivul JSP, întrucât la primirea cererii se recompilează automat și foarte repede pagina JSP, apoi se execută ș rezultatul este trimis ca răspuns la cererea primită[2].

Odata scrisă, o pagina JSP poate fi stocată pe orice server Web (care trebuie să aibă suport pentru JSP), oricare ar fi platforma pe care se află acesta; pagina JSP nu va suferi modificări[2].

Nu exista limitări referitoare la tipul conținutului generat de părțile dinamice ale JSP-urilor. Acesta poate fi text obișnuit, (X)HTML, XML, WML, SVG, X3D etc[2].

Fig. 3.1.1 Pagini JSP rulate pe un server Web[…..]

JSP-urile sunt mai ușor de creat și pot avea functionalitatea a aproape oricărui servlet. Servleturile sunt utilizate pentru a extinde funcționalitatea serverului Web (servicii de autentificare, validarea bazelor de date etc.) și pentru comunicarea cu aplleturi sau alte aplicații Web[2].

Deoarece paginile JSP sunt executate pe partea de server, avem nevoie de un server Web. Pentru afișare vom utiliza serverul Tomcat[2].

Paginile JSP au extensia .jsp. Orice pagină HTML poate fi pagina jsp[2].

2.3.1 Elemente JSP

Declararea unui bloc de instructiuni in JSP se face cu ajutorul tagurilor: <% .. %>.Atunci când dorim să importăm o biblioteca din JSP vom folosi urmatoarea declarație: <%@ page import=”Java.util.Date“>[2].

Există trei tipuri de comentarii care se pot utiliza în paginile JSP: comentarii HTML, comentarii JSP și comentarii Java[2].

Comentariile HTML încep cu simbolurile <!– și se termină cu –>;. Exemplu de comentariu HTML <!–Comentariu HTML –>

Comentariile JSP apar între <%– și –%>. Exemplu de comentariu:

<%–Comentariu JSP –%>

Limbajul Java standard

Java este o tehnologie inovatoare lansată de compania Sun Microsystems în 1995, care a avut un impact remarcabil asupra întregii comunități a dezvoltatorilor de software, impunându-se prin calităt i deosebite cum ar fi simplitate, robustețe ̧și nu în ultimul rând portabilitate. Denumită inițial OAK, tehnologia Java este formată dintr-un limbaj de programare de nivel înalt pe baza căruia sunt construite o serie de platforme destinate implementării de aplicații pentru toate segmentele industriei software.

Inainte de a prezenta în detaliu aspectele tehnice ale limbajului Java, să amintim caracteristicile sale principale, care l-au transformat într-un interval detimp atât de scurt într-una din cele mai pupulare opțiuni pentru dezvoltarea de aplicații, indiferent de domeniu sau de complexitatea lor.

Simplitate – elimină supraîncărcarea operatorilor, moștenirea multiplă și toate ”facilitățile” ce pot provoca scrierea unui cod confuz.

Ușurința în crearea de aplicații complexe ce folosesc programarea în rețea, fire de execuție, interfată grafică, baze de date, etc.

Robustețe – elimină sursele frecvente de erori ce apar în programare prin renunțarea la pointeri, administrarea automată a memoriei ̧si eliminarea pierderilor de memorie printr-o procedură de colectare a obiectelor care nu mai sunt referite, ce rulează în fundal (”garbage collector”).

Complet orientat pe obiecte – elimină complet stilul de programare procedurală

Securitate – este un limbaj de programare foarte sigur, furnizând mecanisme stricte de securitate a programelor concretizate prin: verificarea dinamică a codului pentru detectarea secvențelor periculoase,impunerea unor reguli stricte pentru rularea proceselor la distantă, etc.

Limbajul de programare Java a fost folosit la dezvoltarea unor tehnologii dedicate rezolvării unor probleme din cele mai diverse domenii. Aceste tehnologii au fost grupate în așa numitele platforme de lucru, ce reprezintă seturi de librării scrise în limbajul Java, precum și diverse programe utilitare, folosite pentru dezvoltarea de aplicații sau componente destinate unei anume categorii de utilizatori.

J2SE(Standard Edition) – este platforma standard de lucru ce oferă suport pentru crearea de aplicații independente și appleturi.De asemenea, aici este inclusă și tehnologia Java Web Start ce furnizează o modalitate extrem de facilă pentru lansarea ̧si instalarea locală a programelor scrise în Java direct de pe Web, oferind cea mai comodă soluție pentru distribuția ̧si actualizarea aplicațiilor Java.

J2ME(Micro Edition) – folosind Java, programarea dispozitivelor mobile este extrem de simplă, platforma de lucru J2ME oferind suportul necesar scrierii de programe dedicate acestui scop.

J2EE(Enterprise Edition) – această platformă oferă API-ul necesar dezvoltării de aplicații complexe, formate din componente ce trebuie să ruleze în sisteme eterogene, cu informațiile memorate în baze de date distribuite, etc.Tot aici găsim ̧și suportul necesar pentru crearea deaplicații ̧si servicii Web, bazate pe componente cum ar fi servleturi, pagini JSP, etc.

In funcție de modul de execuție a aplicațiilor, limbajele de programare se împart în două categorii:

Interpretate: instrucțiunile sunt citite linie cu linie de un program numit interpretor ̧si traduse în instrucțiuni mașină. Avantajul acestei soluții este simplitatea și faptul că fiind interpretată direct sursa programului obținem portabilitatea. Dezavantajul evident este viteza de execuție redusă. Probabil cel mai cunoscute limbaj interpretat este limbajul Basic.

Compilate: codul sursă al programelor este transformat de compilator într-un cod ce poate fi executat direct de procesor, numit cod mașină. Avantajul este execuția extrem de rapidă, dezavantajul fiind lipsa portabilității, codul compilat într-un format de nivel scăzut nu poate fi rulat decât pe platforma de lucru pe care a fost compilat.

2.4.1 Biblioteca Swing

Biblioteca Swing este partea JFC (Java Foundation Classes) care oferă componentele necesare programatorilor pentru crearea de interfețe grafice moderne, complexe și într-adevăr prietenoase aplicațiilor Java. Swing aduce îmbunătățiri calitative față de vechiul pachet AWT (Abstrat Window Tollkit), folosit îîn trecut pentru realizarea interfeței grafice, completându-i neajunsurile. Spre exemplu, în distribuția AWT pentru Java 1.9, programatorul avea la dipoziție numai patru fonturi cu care putea sa opereze și un număr restrâns de tipuri de componente, insuficiente pentru crearea de interfețe cu n grad ridicat de complexitate. Totuși pachetul Swing nu este total separat de AWT cum s-ar putea crede, ci se poate spune că este construit peste acesta, așa cum se va observa din cuprinsul acestui capitol , AWT fiind folosit mai mult pe post de intermediar intre Swing și sistemul de operare peste care este instalată platforma Java.

Printre îmbunatățirile aduse de Swing, în afară de noile componente adăugate, putem enumera modul de prezentare și comportare pentru interfață independentă de platformă, posibilitatea de a avea componente cu forme nerectangulare, accesibilitate pentru persoanele cu dificiențe etc. Acest pachet a fost astfel gândit, încât pntru lucruri simple este nevoie de scrierea de cod puțim, iar pentru lucruri mai complexe, mărimea codului crește proporțional. De asemenea, se folosesc convenții logice pentru denumirea claselor, metodelor etc. Care, odată înțelese și învățate, determină creșterea vitezei de lucru.

Prin sintagma’Look and Feel’ (L&F)vom înțelege modul în care sunt desenate componentele Swing ̧si felul în care acestea interacționează cu utilizatorul. Posibilitatea de a alege între diferite moduri L&F are avantajul de a oferi prezentarea unei aplicapții într-o formă grafică care să corespundă preferințelor utilizatorilor. In principiu, variantele originale de L&F furnizate în distribuția standard ofereau modalitatea ca o interfată Swing fie să se încadreze în ansamblul grafic al sistemului de operare folosit, fie s ̆a aib ̆a unaspect specific Java. Orice L&F este descris de o clasă derivată dinLookAndFeel. Distribută standard Java include următoarele clase ce pot fi utilizate pentru selectarea unui L&F:

javax.swing.plaf.metal.MetalLookAndFeel Este varianta implicită de L&F și are un aspect specific Java.

com.sun.java.swing.plaf.windows.WindowsLookAndFeel Varianta specifică sistemelor de operare Windows. Incepând cu versiunea 1.4.2 există și implementarea pentru Windows XP.

com.sun.java.swing.plaf.mac.MacLookAndFeelVarianta specifică sistemelor de operare Mac.

com.sun.java.swing.plaf.motif.MotifLookAndFeel Specifică interfața CDE/Motif.

Componentele din AWT sunt numite componente grele, în timp ce acelea din Swing (îm afară de containerele derivate direct din clasa AWT corespondente) sunt numite componente ușoare. Desenarea componentelor grele se face prin intermediul unor componente asociate sistemului de operare, fiind astfel depentă de sistemul peste care este instalată platforma Java. Aceste componente corespunzătoare din AWT și de aceea intefețele realizate in AWT au întotdeauna look-and-feel-ul sistemului de operare.

Dincauza acestor diferențe între aplicații, atunci când adăugăm o componentă grea într-un container, acesta va acoperi toate componentele ușoare deja existe acolo. De asemenea, componentele grele nu permt transparența. De aceea, trebuie săavem grijă atunci când utilizăm într-o aceeași aplicație componentele AWT și Swing.

Componentele folosite pentru crearea interfețelor grafice Swing pot fi grupate astfel:

Fig.2.4.1.1 Schema componentelor Swing [Google image]

Componente atomice – JLabel, JButton, JCheckBox, JRadioButton, JToggleButton, JScrollBar,JSlider, JProgressBar, JSeparator.

Componente complexe – JTable, JTree, JComboBox, JSpinner, JList, JFileChooser, JColorChooser, JOptionPane.

Componente pentru editare de text – JTextField, JFormattedTextField, JPasswordField, JTextArea, JEditorPane, JTextPane.

Meniuri – JMenuBar, JMenu, JPopupMenu, JMenuItem, JCheckboxMenuItem, JRadioButtonMenuItem.

Containere intermediare – JPanel, JScrollPane, JSplitPane, JTabbedPane, JDesktopPane,JToolBar.

Containere de nivel înalt – JFrame, JDialog, JWindow, JInternalFrame, JApplet.

2.4.2 Fire de execuție

Limbajul java suportă multithreading prin clase disponibile in pachetul java în pachetul java.lang, care este pachetul fundamental al limbajului Java.

În pachetul java.lang există două clase și o interfață cu care se pot dezvolta programe multithread: clase Thread și ThreadGroup și interfața Runnable.

Clasa Thread și interfața Runnable oferă suport pentru lucru cu thread-uri ca entități separate, iar clasa ThreadGroup, pentru crearea unor grupuri de thread-uri în vederea tratării acestora într-un mod unitar.

Clasa Thread implementează interfața Runnable, iar obiectele de tip ThreadGroup conțin mai multe obiecte de tip Thread.

Există două metode pentru crearea unui thread:

creăm o clasă derivată din clasa Thread;

creăm o clasă care implementează interfața Runnable.

2.4.3. Instrucțiunea try-catch-finally

Excepțiile sunt indicate prin aruncarea lor, prin utilizarea instrucțiunii throw și sunt detectate prin prinderea lor, prin intermediul instrucțiunii try-catch-finally. Sintaxa generala a acestei instrucțiuni este:

try { // Instructiuni care pot genera exceptii }

catch (TipExceptie1 variabila) {// Tratarea exceptiilor de tipul 1 }

catch (TipExceptie2 variabila) { // Tratarea exceptiilor de tipul 2 }

finally { // Cod care se executa indiferent// daca apar sau nu exceptii }

Întotdeauna trebuie să existe o clauza catch sau finally (adică nu pot lipsi amâdoua). Dacă este aruncată o valoare și instrucțiunea try are mai multe clauze catch care o pot prinde, atunci controlul se transferă primei clauze catch cu care se unifică. Din acest motiv, în Java, blocul catch mai specific trebuie să producă inainte de cele mai generale, în caz contrar se obține eroare la compilare.

SGBD Oracle si legatura ei cu Limbajul Java

2.5.1 Baza de date

Baza de date se defineșteca ca fiind o colecție de informații organizate sub forma de tabele, împreună cu descrierea lor, care răspunde calităților de centralizare, coordonare integrare și difuzie a informațiilor și care asigură satisfacerea tuturor necesităților de prelucrare ale tuturor utilizatorilor dintr-un sistem.

Baza de date poate fi privită ca o colecție de fișiere interconectate care conțin nucleul de date necesare unui sistem informatic. Astfel, poate fi considerată drept un model al unor aspecte ale realității unei unități economice, modelată prin intermediul datelor. Diferitele obiecte din cadrul realității, ce prezintă interes, sunt denumite clase sau entități. Pentru aceste obiecte sunt achiziționate și memorate date referitoare la diferite caracteristici (atribute). Baza de date se constituie ca un ansamblu intercorelat de colecții de date, prin care se realizează reprezentarea unei realități [11].

O bază de date trebuie să asigure[11]:

• abstractizarea datelor(baza de date fiind un model al realității);

• integrarea datelor(baza de date este un ansamblu de colecții de date intercorelate, cu redundanță controlată);

• integritatea datelor(se referă la corectitudinea datelor încărcate și manipulate astfel încât să se respecte restricțiile de integritate);

• securitatea datelor(limitarea accesului la baza de date);

• partajarea datelor (datele pot fi accesate de mai mulți utilizatori, eventual în același timp);

• independența datelor(organizarea datelor să fie transparentă pentru utilizatori, modificările în baza de date să nu afecteze programele de aplicații).

2.5.2. SGBD (Sisteme de Gestiune a Bazelor de Date)

Un SGBD trebuie să asigure următoarele funcții[11]:

funcția de descriere a datelor–realizează descrierea atributelor din cadrul structurii bazei de date, legăturile dintre entitățile bazei de date, se definesc eventualele criterii de validare a datelor, metode de acces la date, integritatea datelor. Concretizarea acestei funcții este schema bazei de date.

funcția de manipulare–este cea mai complexă și realizează actualizarea și regăsirea datelor.

funcția de utilizare–asigură mulțimea interfețelor necesare pentru comunicare a tuturor utilizatorilor cu baza de date.

Fig. 2.5.2.1 Oracle SQL Developer

Oracle SQL Developer este un mediu de dezvoltare gratuit, care ușurează dezvoltarea și gestionarea Oracle Database în ambele implementări tradiționale și Cloud. SQL Developer oferă o dezvoltare completă a aplicațiilor PL / SQL, o foaie de lucru pentru rularea interogărilor și scripturilor, o consolă DBA pentru gestionarea bazei de date, o interfață de rapoarte, o soluție completă de modelare a datelor și o platformă de migrare pentru mutarea dvs. Baze de date terțe părți către Oracle.

2.5.3. Accesul la baze de date folosind JDBC

JDBC (Java DataBase Connectivity) reprezintă API-ul (Application Programming Interface) dezvoltat de Sun Microsystems, în colaborare cu diverși parteneri, pentru a oferi aplicațiilor Java acces la bazele de date gestionate diverse SGBD. Într-o arhitectură client-server, bazele de date se pot afla pe aceeași mașină sau pe o altă mașină cu care clientul este conectat dint-un intranet sau chiar internet. Cele mai importante fascilități ale JDBC-ului sunt posibilitatea lucrului cu instructiuni SQL ( Structural Query Language) și procesarea eventualelor rezultate obținute, în urma interogărilor într-o manieră independentă și consistentă. Putem privi API-ul JDBC ca o interfață standard între aplicații și diverse DBMS-uri, creatorii aplicațiilor programând, conform acestui API, într-un mod uniform și independent de SGBD.

Prin introducerea JDBC, pentru a ne conecta la un alt SGBD, este de ajuns să schimbăm driverul, operație care se poate realiza dinamic, chiar in timpul rulării aplicației, nemaifiind necesară recompilarea acesteia. Acestă facilitate , împreună cu portabilitatea limbajului Java, permite interogarea oricărei baze de date de sub orice platformă fara recompilări de cod.

Maniera în care driverele trebuie construite este standardizat prin intermediul specificațiilor JDBC care precizează interfețele standard ce trebuie implementate de dezvoltatorii driverelor.

Începând cu specificația JDBC 2.0, API-ul este împarțit in două părți: JDBC 2.1 API, care reprezintă nucleul API-ului JDBC, cuprins în pachetul java.sql, și JDBC 2.0 Optional Package, care oferă capabilități pe partea de server, cum ar fi tranzacții distribuite și conexiuni multiple, fiind conținut in pachetul java.sql.

Pentru început putem spune că JDBC furnizează acces orietat pe obiecte la bazele de date, prin definirea de clase și interfețe care înfășoară diverse concepte abstracte , precum cele prezentate în tabelul următor:

Tabel 2.5.3.1 Prezentarea claselor din java.sql

Procesul pentru a obține informații din baza de date folosind driverul JDBCimplică cinci pași:

Înregistrarea driverului JDBC folosind driverul DriverManager;

Stabilește o conexiune cu baza de date

Execută instruțiuni SQL

Procesează rezultatele

Închide conexiunea cu baza de date

După ce conexiunea a fost realizată metoda DriverManager.getConection, se poate folosi obiectul Connection rezultat pentru a se crea obiecte de tip Statement,PreparedStatement s ajutorul cărora putem trimite secvențe SQL către baza de date. Cele mai uzuale comenziSQL sunt cele folosite pentru:

Interogarea bazei de date: SELECT

Actualizarea datelor din baza de date: INSERT, UPDATE, DELETE

Actualizarea tabelului cu instrucțiunile: CREATE, ALTER, DROP – aceste instrucțiuni poartă numrele DDL (Data Definition Language)

Utilizarea de comunicatie client-server prin socket

Programarea rețelelor de calculatoare este de obbicei descrisă folosind conceptele de cliet

și server. Un server este o aplicație care rulează pe un calculator gazdă (host) c furnizează o conexiune și informații utile din momentul stabilirii acelei conexiuni. Uneori, prin extrapolare, se utilizează termenul de server atât pentru aplicația care rulează, cât și pentru calculatorul gazdă pe care rulează aplicatia. Un client este o aplicație care rulează pe un calculator din rețea, căutând să stabilească o conexiune cu un server. De regulă, se pot conecta mai mulți clieți simultan pe un server.

Serverul este un furnizor de informații, iar clietul este un condumator. Clientul are nevoie de informații, se conectează la un server căruia îi adresează o cerere. Respectivul server trimite înapoi un răspuns care poate conține informația cerută sau indică faptul că nu posedă respectiva informație. Clientul poate să continue emiterea de cereri, eventul altor servere.

Pentru a se putea realiza o comunicare între clienți și server, aceștia vor trebui să respecte un set de reguli (protocol). De exemplu, clientul trimite mai întâi cererea, după care i se trimite un răspuns. Mesajele trimise terbuie să fie înțelese de cei doi parteneri.

Un calculator este unic identificat într-o rețea prin adresa IP (Internet Protocol). Acesta este formată din patru numere cuprinse între 0 și 255, separate prin simbolul punct (de exemplu: 193.231.30.255). Identificarea unui calculator din rețea se mai poate realiza prin numele asociat. De exemplu, thor.info.uaic.ro este numele calculatorului cu adresa IP mai sus menționată.

Într-un calculator, mecanismul utilizat pentru stabilirea unei întâniri se numește port. Porturile sunt numere întregi cuprinse intre 0 și 655535. De regulă, valorile mai mici de 1024 sunt rezervate pentru servicii predefinite (de exemplu: poșta electronică, ftp – transfer de fișiere, htp – trsnsfer de documente hipertext). Programatorii pot utiliza propriile aplicații porturile mai mari de 1024.

Combinația dintre adresa IP si numărul de port este întrebuințată pentru crearea unui termen abstrat, numit socket. Aceasta se mai numește in literatura de specialitatecanal de comunicațiie sau conexiune. Un client caută serverul, stabilește o conexiune prin care informația poate fi trimisă, iar la final se va deconecta lăsând liber socketul pentru o utilizare ulterioară. Un socket furnizează fascilități pentru crearea de fluxuri de intrare și ieșire, care permit datelor sa fie schimbate între client si server.

Pentru un socket, numarul de port poate fi specificat prin program sau asignat de către sistemul de operare. Când un socket trimite un pachet, acestuia trebuie să ii adaugă, informații despre destinația pachetului, cum ar fi[2]:

Adresa mașinii din rețea care trebuie să primească pachetul;

Port pentru indicarea socketului corespunzător care va primii date.

Atunci când se stabilește o conexiune, atât clientul cât și serverul, vor avea câte un socket. Comunicarea efectivă se va realiza intre socketuri[2].

Fig. 2.6.1 Schema Socketului[Google image]

Când se folosesc socketuri, trebuie sa decidem ce tip de protocol dorim sa utilizăm pentru transportul datelor in rețea[2]:

Protocol orientat pe conexiune;

Protocol neorientat pe conexiune;

În cazul protocolului orietat pe conexiune, un client stabilește o conexiune cu un server via socketuri. Odată stabilită conexiunea, un protocolorietat pe conexiune asigură ca datele s-au trimis sigur, adică[2]:

Fiecare pachet trimis este și primit. De fiecare dată când printr-un socket se trimite un pachet, acesta așteaptă o confirmare că pachetul s-a primit cu succes. Dacă nu se primește confirmarea într-un timp prcizat, se trimite din nou pachetul. Se continuă să se trimită pachetul până când transmisia are succes sau până cand se decide că transmisia pachetului este imposibilă;

Pachetele sunt citite de socketul-destinație în aceeași ordine, în care au fost trimise. Datorită modului în care funcționează rețelele, pachetele pot ajnge intr-o ordine diferită fată de cea în care au fost trimise. Protocolul orientat pe conexiune va permite socketului-destinație să stabilească ordinea in care au fost pachetele trimise.

Un protocol neorietat pe conexiune permite cea mai rapidă trimitere a pachetelor. Aceasta nu garantează că pachetele care sunt trimise sunt citite în aceeași ordine de programul destinatar. Mai mult, programul destinatarnu trebuie neapărat să fie disponibil pentru recepționarea datelor. Expeditorul trimite informațiile, iar destinatarul le va citi eventual mai târziu, după care va răspunde. În schimb, este garantată primirea pachetelor[2].

2.6.1 Clasa ServerSocket

Pentru a implementa un server orientat conexiune, trebuie să urmăm pașii[2]:

Se construiește o instanță a clasei ServerSocket pentru a crea un socket ce va aștepta la un port precizat, cu scopul stabilirii conexiunilor;

Când se va accepta o conexiune, se va crea un obiect Socket care încapsulează conexiunea;

Se va utiliza obiectul Socket creat anterior pentru a obține un flux de intrare și de tip InputStream, respectiv unul de ieșire OutputStream, în vederea citirii și scrieii informațiilor către, respectiv de la clint. Comunicarea cu clientuls se va realiza prin intermediul fluxurilor;

Opțional, se vor putea crea noi fire de execuție pentru fiecare conexiune nouă, astfel încât se se poată accepta în coninuare noi conexiuni în timp ce sunt deservite celelalte cereri.

Pentru construirea obiectelor ServerSocket trebuie să alegem un port pe mașina locală, cuprins între 1 și 65535. Dacă se selectează numarul de port 0, atunci sistemul de operare va atribui un port liber și valid de fiecare dată când rulează aplicația. Numărul de prt ales trebuie apoi comunicat clienților pentru a se putea conecta la server[2].

După ce a fost creat un obiect ServerSocket se vor putea accepta conexiuni cu clienții. Dacă apar mai multe cereri de conexiune din partea clienților, acestea vor fi depuse intr-o coadă de asteptare și eliminată una câte una de îndată ce serverul apelează metoda accept(). Prin intermediul constructorului clasei ServerSocket se permite specificarea numarului de conexiune care pot fi în coada de asteptare; sistemul de operare va respinge orice cerere de conexiune ulterioară care apare în cazul în care coada este plină[2].

Constructorul clasei ServerSocket este următoarea: ServerSocket(int port) ;

2.6.2. Clasa Socket

Un obiect Socket corespunde unei conexiuni de rețea TCP. Utilizând această clasă, un client poate stabili un canal de comunicație bazat pe fluxuri cu o mașină de la distanță.

Structura generală a unui client care stabileșste o conexiune este foarte simplă. Acesat crează un obect socket care deschide o conexiune catre un server apoi, prin intermediul aceluiași obiect, se reailzează comunicarea cu serverul. Programul-client trebuie să cunoască adresa serverului, precum și portul acestuia. Daca la adresa și portul indicat nu există nici un server activ, atunci stabilirea conexiunii va eșua și va fi aruncatăo exceptie IOException

Clasa Socket este utilizată și de server pentru comunicarea cu clienții. Pentru fiecare client va exista un obiect de acest tip (obținut în urma apelului metodei accept() din clasa ServerSocket), iar trimiterea, respectiv recepționarea mesajelor sunt identice cu cele pentru client.

Crearea unui obiect Socket va realiza conexiunea cu serverul. Prezentam cei mai semnificativi constructori:

Socket() – crează un obiect Socket neconectat;

Socket(String gazdă, int port) throws Exception – crează un obiect Socket conectat la portul indicatal adresei gazdă specificate (gazda poate să conțină numele serverului sau adresa IP iar portul trebuie să fie cuprins intre valorile q și 65535 ).

Socket (InetAddress adresa, int port) throws Exception – față de constructorul precedent, se specifică adresa IP a serverului prin intermediul unui obiect de tip InetAdress.

Metodele clasei Socket permit identificarea gazdei de la distanță, a portului local și a celui de la distanță, precum și extragerea de fluxuri în vederea comunicării bidirecționale.

Pentru comunicarea într-o conexiune TCP, trebuie mai întâi stabilită conexiunea (crearea unui obiect de tip Socket), apoi apelarea metodelor getInputStream() si getOutputStream() pentru obținerea fluxurilor de intrare, respectiv ieșire, cu ajutorul cărora se realizează comunicarea la distanță. Așadar, atât clientul cât și serverul vor avea câte un obiect InputStream și OutputStream, în scopul comunicării.

Securizarea datelor prin criptare DES

Criptare este un proces de conversie a datelor (fișiere, imagini, semnale), într-un format neinteligibil pentru persoane neautorizate. Ca urmare a acestui tip de prelucrare un mesaj în (M –plaintext) este transformat într-un mesaj criptat (C-ciphertext) cu ajutorul unei chei de criptare și cu ajutorul unui algoritm criptografic.

Standardul de Criptare a Datelor (DES) este o metodă de criptare a informațiilor, selectat ca standard federal de procesare a informațiilor in Statele Unite in 1976, care s-a bucurat ulterior de o largă utilizare pe plan international. Algoritmul a fost controversat inițial, avand elemente secrete, lungimea cheii scurtă si fiind banuit că ascunde de fapt o portiță pentru NSA. DES a fost analizat intens de catre profesionaliști in domeniu și a motivat ințelegerea cifrurilor bloc și criptanaliza lor.

În zilele noastre DES este considerat nesigur pentru aplicații. Acest lucru se datorează în principiu cheii de 56 de biți, considerată prea scurtă; cheile DES au fost sparte în mai puțin de 24 de ore. De asemenea, există unele rezultate analitice care demonstrează slăbiciunile teoretice ale cifrului, deși nu este fezabilă aplicarea lor. Se crede că algoritmul este practic sigur în forma Triplu DES, deși există atacuri asupra acestuia.

Structura generală a algoritmului apare în sunt 16 pași identici de procesare, care poartă numele de runde. Există și câte o permutare inițială și finală, numite PI and PF, care sunt funcții inverse (PI acțiunea lui PF și vice versa). PI și PF nu au aproape nici o importanță criptografică, dar au fost incluse pentru a facilita încărcarea și descărcarea blocurilor folosind hardware-ul din anii 1970.

Înaintea rundelor principale, blocul era împărțit în două jumătăți, de câte 32 de biți, și procesate alternativ; această alternare este cunoscută drept Schema Feistel. Structura Feistel asigură că criptarea și decriptarea sunt procese foarte asemănătoare, singura diferență este ordinea aplicării subcheilor, invers la decriptare. Restul algoritmului este identic. Acest lucru simplifică implementarea deoarece nu e nevoie de algoritmi separați.

Funcția feistel operează pe o jumătate de bloc și este formată din următorii pași:

Expansiune reprezintă jumătatea de bloc de 32 de biți este extinsă la 48 de biți folosind funcția de expansiune, notată E în diagramă, prin duplicarea unor biți.

Amestecarea este rezultatul combinat cu o subcheie folosind operația XOR. Șa subchei de 48 de biți, una pentru fiecare rundă , sunt derivate din cheia principală folosind diversificarea cheilor.

Substituție după amestecarea cu subcheia, blocul este divizat în opt bucăți de 6 biți fiecare înainte de procesarea folosind cutiilor S, sau cutii de substituție. Fiecare din cele opt cutii S înlocuiește cei șase biți de intrare cu patru biți conform unei transformări neliniare, oferită sub forma unui tabel de căutare. Cutiile S reprezintă securitatea lui DES — fără ele, cifrul ar fi liniar și ușor de spart.

Permutare — în final, cele 32 de ieșiri din matricile S sunt rearanjate conform permutării fixe P.

DES este un algoritm de criptare ce lucrează pe blocuri (numite și block cipher) ce acționează asupra grupurilor de 64 de biți utilizănd chei de 64 de biți.

3.Studiu de caz. Aplicație informatică pentru comunicarea online intre mai mulți utilizatori

3.1. Descrierea generală a aplicației informatice

Sistemul software a fost creat pentru a ușura timpul de lucru intr-o firmă și intr-un mod securizat fără ca informațiile sa fie accesate de altcine înafară de utilizatorii care participă la dialog.

Fig. 3.1 Prezentarea generală a aplicației informatice

Aplicație informatică pentru comunicarea online intre mai mulți utilizatori se imparte în doua module: modulul din partea serverului și modulul din partea clientului.

Clientul inainte să intre in aplicație este nevoit să își creeze un cont. Dacă acesta are un cont și nu iși mai amintește parola poate să o recupereze. Pentru a ușura procesul de instalare am facut o pagină web unde utilizatorul se poate inregistra și descărca aplicația.

Sistemul pe care l-am creat are nevoie de un administrator ca să supraveghe activitatea serverului, a bazei de date și este responsabil cu funcționalitatea cât mai corectă a acestuia.

Descrierea detaliată a modulelor aplicației informatice

Se pune accent pe securitatea bazei de date și a mesajelor pe care administratorul nu are voie sa le acceseze. Întrucât funcționalitatea serverului trebuie intreținută fără ca acesta să intampine dificultăți in trimiterea mesajelor.

Avantaje sistemului software sunt:

Securitate ridica a bazelor de date prin criptare DES

Optimizarea aplicației pentru o functionare bună

Eliberarea bandei de internet dupa ce un utilizator a depasit durata de 15 minute de inactivitate inactivității

Mesajele nu pot fi citite de administrator deoarece sunt securizate cu ajutorul criptării

3.2.1 Diagrama UML

Pe diagrame sunt prezentate acțiunile dintre variantele posibile de utilizare. Diagrama reflectă cerințele către sistem din punct de vedere al utilizatorului.

În așa mod variantele de utilizare sunt funcțiile efectuate de sistem, iar persoanele sunt persoane cointeresate de sistemele elaborate. Diagrama arată că persoana inițiază diagrama variantelor de utilizare. La fel din ea se vede că persoanele cointeresate primesc datele de la variantele de utilizare. Din diagramele variantelor de utilizare se poate afla multe informații referitor la sistem. Acest tip de diagramă descrie funcționarea sistemei la general. Utilizatorii managerii proiectării, analiticii, specialiștii și toți cei care sunt cointeresați în sistemul dat pot să înțeleagă ce poate să facă sistema cauză.

Interfețele sunt folosite pentru specificarea parametrilor unui model. În limbajul UML interfețele sunt clasificatoare ce caracterizează numai unele părți de comportare a modelului. În diagrama variantelor de utilizare interfețele reprezintă o entitate de operații, ce garantează un grup de servicii sau funcționalități pentru actori. Interfețele nu pot conține atribute, stări sau asociații cu direcții. Ele conțin numai operații fără indicarea realizării lor, formal interfețele sunt echivalente unui clas abstract cu prezența numai operațiilor abstracte.

In urma descrierilor facute in studiul cerintelor se contureaza urmatoarele cazuri de utilizare:

Mentenanta server-ului

Siguranța că mesajele utilizatorilor sunt criptate

Siguranța că sistemul de logare/ inregistrare functionează rapid

Informatiile despre utilizator sunt criptate si nu are nimeni acces.

Actorii care  interacționeaza cu sistemul sunt urmatorii:

Administratorul – acesta are datoria să mentină server-ul activ

Clientii – utilizatorii care folosesc sistemul software

Fig 3.2 Diagrama UML generală a administratorului

Fig. 3.3 Diagrama UML generală a clientului

Diagramele de secven ilustreaz interaciunile dintre obiecte sau actori si obiecte din punct de vedere temporal. Un obiect este reprezentat printr-un dreptunghi i o bar vertical numit linia de via a obiectului. Mesajele sunt reprezentate prin sgei orizontale orientate de la emitorul mesajului ctre destinatar. Ordinea de trimitere este dat de poziia pe axa vertical. Timpul se scurge de sus n jos. Axa vertical poate fi gradat n scopul exprimrii mai exacte a constrngerilor temporale n cazul modelrii unui sistem de timp real.

Fig. 3.4 Diagrama de secvență a inregistrării

Diagrama de activitati Se folosește pentru modelarea aspectelor dinamice ale unui sistem, la diferite nivele: incepand de la nivelul „business process”, pana la nivel de operatie a unei clase. Din acest motiv, in diagramele de activitate se folosesc un numar mare de simboluri.

O diagrama de activitate poate reda pasii unui proces de calcul, fluxul controlului intr-o operatie, executia secventiala sau paralela a unor actiuni.

O actiune reprezinta un singur pas intr-o activitate: un calcul, gasirea unor date, verificarea unor date, etc. O actiune se reprezinta printr-un dreptunghi rotunjit in care este inscris text (numele actiunii) in format liber.

Actiunile redate intr-o diagrama de activitate pot fi executate de diferite obiecte, care sunt active in acelasi timp.

Astfel, o diagrama de activitate poate reda, la un nivel de detaliu mai ridicat, interactiunea dintre obiecte reprezentata printr-o diagrama de secventa.

FIG

3.2.2. Crearea userului și structura bazei de date Oracle

Contul SYSTEM este unul dintre conturile administrative predefinite generate automat când este instalat Oracle. SYSTEM este capabil de cele mai multe sarcini administrative, dar sarcina cu care suntem interesați este gestionarea contului.

Pentru a creea un nou user in baza de date Oracle, trebuie să ne logăm ca administrator pe contul de SYSTEM. După ce am intrat ca administrator in SGBD Oracle SQL DEVELOPER, am creat un user cu click dreapta pe folderul Other User și am apăsat pe Create User.

FIg

Pentru crearea unui cont de user nou , trebuie să introducem numele de user și parola

Baza de date a sistemului software cuprinde urmatoarele tabele:

EMAILFROMUSERNAME

MONITORIZARE

MULTICHAT_VERS2

MESAJ

MONITORIZARE_CONVORBIRI

Fig. 3.4 Stuctura bazei de date

Fig. 3.12 Tabelul MONITORIZARE din Oracle

Tabelul MONITORIZARE conține:

ID care este de tip integer și este cheie primară;

EMAIL care este de tip varchar2 care poate să conțină 50 de caractere;

DATA care este de tip varchar2 care poate să conțină 50 de caractere;

TIME care este de tip varchar2 care poate să conțină 50 de caractere;

Fig. 3.13 Conținutul bazei de date a tabelului MONITORIZARE

Fig. 3.14 Tabelul MONITORIZARE_CONVORBIRI din Oracle

Tabelul MONITORIZARE_CONVORBIRI conține:

ID care este de tip integer și este cheie primară;

DATA_START care este de tip varchar2 care poate să conțină 50 de caractere;

DATA_STOP care este de tip varchar2 care poate să conțină 50 de caractere;

MESAJ care este de tip varchar2 care poate să conțină 50 de caractere;

Fig 3.15 Conținutul bazei de date a tabelului MONITORIZARE_CONVORBIRI

Fig. 3.16 Tabelul MESAJ din Oracle

DATA_ care este de tip varchar2 care poate să conțină 50 de caractere cheie primară;

MESAGGE care este de tip varchar2 care poate să conțină 180 de caractere;

Fig. 3.17 Conținutul bazei de date a tabelului MESAJ

Fig. 3.18 Tabelul EMAILFROMUSERNAME din Oracle

Tabelul MONITORIZARE_CONVORBIRI conține:

ID care este de tip integer și este cheie primară;

EMAIL care este de tip varchar2 care poate să conțină 50 de caractere;

USERNAME care este de tip varchar2 care poate să conțină 50 de caractere;

Fig. 3.19 Tabelul Conținutul bazei de date a tabelului EMAILFRONUSERNAME

Fig. 3.9 Tabelul MULTICHAT_VERS2 in Oracle

Tabelul MULTICHAT_VERS2 conține:

IDMULTICHAT care este de tip integer și este cheie primară;

EMAIL care este de tip varchar2 care poate să conțină 50 de caractere;

PASSWORD care este de tip varchar2 care poate să conțină 15 de caractere;

QUESTION care este de tip varchar2 care poate să conțină 100 de caractere;

ANSWER care este de tip varchar2 care poate să conțină 50 de caractere;

Fig. 3.10 Conținutul bazei de date a tabelului cu inregistrări

Modulul server

Fig. 3.11 Interfața grafică a serverului

În primul rând, pentru a realiza interfața grafică (GUI) am folosit un Jframe form din NetBeans. Am adaugat Jbutton pentru fiecare modul pe care o să-l prezint il voi prezenta. Chenarul de jos dreapta sunt afișate numarul de mesaje care au fost trimise și primte de către server atunci cand este pornit, iar cand el este oprit numai primeste sau transmite nimic.

Butonul „START SERVER” este făcut pentru a porni ServerSocket

Fig. 3.12 Pornirea serverului

După ce serverul a fost pornit, se va afisa mesajul pe care il puteți vedea in figura 3.4 pe ecran iar în chenarul acela din dreapta jos Server Status din OFFLINE se va schimba in ONLINE pentru a cofirma că serverul a fost pornit

Fig. 3.13 Confirmarea serverului

Butonul STOP SERVER oprește ServerSocketul cu un delay de 5 secunde.În acest interval de timp serverul deconectează toți utilizatorii și oprește conexiunile cu bazele de date, afișând mesajul pe care il puteți vedea in figura 3.6.

Fig. 3.14 Oprirea serverului

Când un utilizator se conectează la server se va afișa pe ecran data, ora când s-a conectat. Deoarece mesajele sunt securizate cu DES, administrator nu poate vedea ce mesaje trimit utilizatorii către server. Cu fiecare mesaj trimis de catre utilizatori, în chenarul de jos dreapta este un contor cu numele Message pe care acesta este gândit pentru a ajuta administratorul să supravegheze activitatea serverului mai ușor.

Fig. 3.15 Funcționarea serverului

Butonul Status are rolul de a returna numele utilizatorilor care sunt online in chenarul unde este Online users:

Butonul History trimite administratorul intr-o nouă ferestră a serverului, în care este salvată toate convorbirile de la primile mesaje până în prezent. Aceste mesaje se salveaza criptate cu ajutorul algoritmului DES si bineînțeles administratorul nu le poate accesa continutul.

Fig. 3.16 Fereastra mesajelor

Ca să întocmesc această fereastră am folosit fișiere și fluxuri de ieșire respectiv de intrare. Clasa BufferedWriter se gasește in biblioteca java.io si este folosită ca să creeze un flux de scriere asociat de ieșire și cu contructorul clasei FileWriter care permite acestuia ca un șir de caractere să salveze conținutul mesajelor intr-un fișier de tip text. Pentru a deschide fișierul in fereastra am folosit fluxul de intrare adică de citire BufferedReader și am folosit clasa FileReader pentru a citii din fișier. Mesajele utilizatorilor sunt salvate in fisierul Save.txt și este citit tot din același fișier.

După ce am terminat de citit sau de scris in fișier, trebuie să îl închidem cu metoda .close().

Buttonul de Accounts panel este baza de date cu toate conturile existente.

Fig. 3.17 Fereastra Control Panel Java

În această fereastră este afișat continutul bazei de date din Oracle din tabelul cu inregistrări. Baza de date este securizata iar administratorul nu poate sa vadă datele utilizatorilor.

Pentru a tranfera conținutul câmpurilor am folosit driverul JDBC pentru a conecta aplicația in Java.

Administratorul poate doar să adauge conturi, completând campurile Email si Password, iar in informatiile privind Secret Question si Answer se introduc automat valoare default! in ambele cazuri. Când adăugarea este facută această se criptează si este introdusă in tabel in baza de date,.

Ștergerea poate sa fie facută atunci cand administratorul știe parola utilizatorului, iar modificarea in baza de date se realizează doar la nivel de parolă, trebuie să completaze câmpul old password cu parola pe care o are utilizatorul și new password cu parola nouă pe care o modifică.

Pentru a transmite informații din Java in baza de date am folosit API-ul JDBC ojdbc1 4.jar. Realizarea conexiunea in Java cu fisierul ojdbc14.jar trebuie sa îl integrăm in fișierul aplicației apăsând click dreapta pe fișierul aplicației in Netbeans, Proprieties.

Click pe categoria Libraries și Add JAR/Folder

Adăugați fișierul ojdbc14.jar

Confirmați apăsând butonul OK

Butonul Monitorization deschide o fereastră în care administratorul poate sa vadă timpul și data când un utilizator s-a conectat la server, pragul când serverul a atins cele mai multe mesaje intr-un timp, data și ora cu conținutul mesajelor și monitorizarea traficului după numele utilizatorilor.

Fig. 3.18 Fereastră monitorization

Front-end

Front-end-ul este parte care se ocupa cu designul paginii web pe care utilizatorul o vede. Datoria Front-endului este de a implementa template-uri pentru email, să se asigure o corectitudine a conținutului paginii, să implemente o cele mai bune optimizări SEO pentru a câștiga utilizatorii prin motoarele de căutare a unui Website și alte elemente ce țin de interacțiunea Website-ului.

În primul rând utilizatorul trebuie sa intre pe pagina principală de Web pentru a își descarca aplicația. Crearea contului poate să fie facută prin două moduri: prin intermediul paginii Web sau direct in aplicație.

Pagina Web pricipală a sistemului software de unde utilizatorul poate să își descarce aplicația în calculator. În cazut in care utilizatorul nu are cont, el poate să își creeze unu de pe pagină fără sa mai fie nevoit să il creeze din aplicație.

Fig. 3.19 Pagina principală

Dacă utilizatorul nu a completat un câmp sau a introdus datele greșite apare un mesaj de avertisment, iar inregistrarea nu poate sa fie facută cu succes.

După ce inregistrarea a fost facută cu succes, apăsând butonul Register, utilizatorul este trimis pe o nouă pagină de confirmare de unde poate să își descarce aplicația.

Fig

Aplicația are 135 de megabytes și conține toată aplicația Java.

Când aplicația a fost descărcată, utilizatorul poate sa o instaleze apăsând buttonul install.

După finalizarea instalației în dosarul dorit, fișierele, o să fie structurate în forma prezentată mai jos:

În pagina de website, dacă utilizatorul apaspă pe butonul versiune, o să il trimită pe o pagină in care o să vizualizeze toate imbunătățirile aplicației Java până în momentul actual.

Back-end

Dacă front-endul se ocupa cu partea vizuală a Websiteului, back-endul se ocupa cu partea din spatele lui, adică cu partea de afișare si de citire a bazei de date, partea de configurație a serverului și partea de interfață a aplicațiilor.

Ca server este folosit Apache Tomcat deoarece se combină cu baza de date Oracle. Apache Tomcat este un web server open source și container servlet dezvoltat de Apache Software Foundation scris in Java.

Pentru a conecta driverul JDBC cu Apache Tomcat, el trebuie copiat in dosarul lib, în interiorul dosarului Tomcat. Conexiune dintre pagina Web și baza de date Oracle este identică cu cea din Java.

Pentru a lucra cu libajul de server JSP, fișierele, trebuies să fie salvate cu extensia .jsp și în dosarul webapps a aplcației Tomcat, index.jsp fiind pagina de start.

Modulul client

În aplicație , utilizatorul, are posbilitatea să se conecteze la server prin IP și Socket, să transmită sau să primească mesaje de la ceilalți utilizatori care participă la conversație , poate sa își curețe ecranul de mesaje, iar în ultimul rând poate să parăsească conversația după ce și-a terminat dialogul, astfel eliberând lățimea benzii de rețea.

În câmpul IP trebuie să fie completat cu IP serverului, dar daca acesta nu este completat atunci se conectează automat in localhost (IP de localhost fiind 127.0.0.1). Portul TCP este 6666 care permite utilizatorului conectarea distanță.

Port 6666 utilizeaza Protocolul Datagram, un protocol de comunicații pentru categoria de rețea Internet.

Pentru conectarea la server, utilizatorul, este nevoit să confirme un IP și să își completeze câmpul cu numele lui.

Când apare această eroare de avertisment, serverul, nu e pornit.

După ce utilizatorul apasă pe connect, serverul verifică conexiunea prin socket și transmite inapoi numele utizatorului in lista din dreapta și afișează mesajul de conectare.

Forma de înregistrare transmite datele in baza de date cu API-ul JDBC, datele fiind criptate,

Dacă emailul nu este corect scris (dacă nu conține @yahoo.com sau @gmail.com la sfârșit) apare un mesaj de eroare care puteți vedea in figura de mai jos.

Dacă parolele nu corespund intre ele atunci apare eroarea pe care o puteți vedea

În formularul de login, utilizatorul își introduce emailul și parola. Datele introduse sunt cautate în baza de date a inregistrarilor. Dacă datele nu corespund cu cele din baza de date se va afișa un mesaj de eroare.

Bibliografie

I. Lucrare de specialitate.

[1]. Autor Dubois,P.,MySQL, Editura Teora, București, 2001.

[2]. Stefan Tanase & Stefan Andrei, Cristiam Olaru, Editura Polirom, Java de la 0 la expert, 2011.

[6] Filip,I., Tehnologii de programare a aplicațiilor Internet cu baze de date,Editura Orizonturi Universitare, Timișoara, 2003.

[7] Gheorghe, M., Tătărâm, M., Achinca, C., Pestrițu, I.,Informatică, Editura Corint, București, 2007.

[8] Diaconu, D.E., Pagini Web cu JavaScript,Editura EduSoft,Bacău, 2006.

[10] Panțiru, M., Panțiru, I., Panțiru, I.I,Informatică. Varianta Visual FoxPro, Editura L&S INFOMAT, București, 2002

[11] Trandafir, R., Nistorescu, N., Mierluș-Mazilu, I., Bazele informaticii și Limbaje deprogramare -Baze de date relaționale, Note de curs, București, 2007

II. Surse internet

[9].https://docs.oracle.com/javase/7/docs/api/java/net/Socket.html.

[10].https://www.youtube.com/watch?v=bpBLxwWNskM.

[11]. https://www.udemy.com/jsp-tutorial/

[12]. https://www.udemy.com/design-and-develop-a-killer-website-with-html5-and-css3/

[13]. https://www.w3schools.com/

[14]. https://www.udemy.com/jsp-servlet-free-course/

[15]. http://www.aut.upt.ro/~andreea.robu/Lab1_PAI.pdf

[16]. http://gmgmedia.tripod.com/Learn/html.html

[17].https://profs.info.uaic.ro/~acf/java/Cristian_Frasinaru-Curs_practic_de_Java.pdf

Anexe

<%@ page import = "java.sql.*" %>

<%

int primaryKey = 1;

try{

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myCon = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myCon.createStatement();

ResultSet myRs = myStat.executeQuery("SELECT idMultichat FROM multichat_vers2");

while(myRs.next()) {

if(myRs.getInt("idMultichat") > primaryKey)

primaryKey = myRs.getInt("idMultichat");

primaryKey++;

}

}

catch(Exception E){

}

%>

<!doctype html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

<title>chat</title>

<link rel="stylesheet" type="text/css" href="cssHelper.css" />

<link rel="stylesheet" type="text/css" href="style.css">

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

</head>

<style>

.container {

width:40%;

height:400px;

margin:20px 20px 20px 20px;

margin-left:450px;

margin-top:100px;

border-radius:8px;

box-shadow:3px 3px 30px rgba(0,0,0,0.3);

text-align: center;

padding-top:200px;

background-color: rgba();

}

.progress {

margin: 10px;

width: 99%;

}

.opacity-black-succed {

background: rgba(0, 0, 0, 0.5);

}

.progress-bar {

background-color: black;

}

a.blackButton {

width:50%;

height: 40px;

font-size:28px;

color:black;

border:1px solid black;

border-radius:8px;

margin-left: 5%;

background-color: white;

cursor: pointer;

margin-top:20px;

padding:30px 30px 30px 30px;

}

a.blackButton:hover {

text-decoration: none;

border:2px solid black;

box-shadow: 3.0px 3.0px 30px rbga(0,0,0,0.3);

}

</style>

<body>

<div id="navbar">

<a href="versiune.jsp" target="_blank" rel="noopener">Versiune</a>

</div>

<div class="full-grid">

<div class="container opacity-black-succed">

<a href="chat.exe"class="blackButton" download>Download</a>

<%

try{

String question =(String)request.getParameter("Question");

String email = request.getParameter("email");

String password1 = request.getParameter("password1");

String password2 = request.getParameter("password2");

String answer = request.getParameter("answer");

boolean ok= true;

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

ResultSet myRs = myStat.executeQuery("SELECT email FROM multichat_vers2");

if(!password1.equals(password2)) {

ok = false;

out.print("<h2> Parola nu corespunde</h2>");

}

while (myRs.next()) {

if(email.equals(myRs.getString("email"))){

ok = false; break;

}

}

if (ok == true) {

PreparedStatement pss = myConn.prepareStatement("INSERT INTO MULTICHAT_vers2 (idMultichat,email,password,Question,Answer) values ('"+primaryKey+"','"+email+"','"+password1+"','"+question+"','"+answer+"')");

pss.executeUpdate();

out.print("<h1>Contul tau a fost creat cu succes</h1> "+ myRs.getString("email"));

}

else

out.print("<h1>Contul tau nu a putut fi creat sau exista deja !</h1>");

}

catch(Exception e){

}

%>

</div>

</div>

</div>

<script>

$(function() {

var current_progress = 0;

var interval = setInterval(function() {

current_progress += 10;

$("#dynamic")

.css("width", current_progress + "%")

.attr("aria-valuenow", current_progress)

if (current_progress >= 100)

clearInterval(interval);

}, 500);

});

</script>

</body>

</html>

<!DOCTYPE HTML>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />

<meta http-equiv="X-UA-Compatible" content="IE=edge" />

<title>chat</title>

<link rel="stylesheet" type="text/css" href="cssHelper.css" />

<link rel="stylesheet" type="text/css" href="style.css">

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

</head>

<body>

<div id="navbar">

<a href="versiune.jsp" target="_blank" rel="noopener">Versiune</a>

<a href="chat.exe" download=>Download</a>

</div>

<div class="hero">

<div class="full-column">

<div class="half-column-hero left border opacity-black spacer spacer">

<form action="succed.jsp" method="POST">

<input type="email" name="email" placeholder="E-mail" required>

<input type="password" name="password1" placeholder="Password" required>

<input type="password" name="password2" placeholder="Password" required>

<div class="custom-select">

<select name="Question">

<option>How old are you?</option>

</select>

</div>

<input type="text" name="answer" placeholder="answer" required>

<input type="submit" value="Register">

</form>

</div>

<div class="half-column-wrapper left ">

<img src="image/serverChat.png" width="500px" height="450px ">

</div>

</div>

</div>

<script src="JavaScript.js"></script>

</body>

</html>

btnSearch.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

String emailC = email.getText();

int rowCount = model.getRowCount();

for(int i = rowCount – 1 ; i >=0 ; i–) {

model.removeRow(i);

}

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myCon = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myCon.createStatement();

ResultSet myRs = myStat.executeQuery("SELECT idMultichat,email,password,Question,Answer FROM MULTICHAT_VERS2 where email LIKE'"+ email.getText()+"%'");

while(myRs.next()){

row[0] = (myRs.getInt("idMultichat"));

row[1] = base64encode(myRs.getString("email"));

row[2] = base64encode(myRs.getString("password"));

row[3] = base64encode(myRs.getString("Question"));

row[4] = base64encode(myRs.getString("Answer"));

model.addRow(row);

}

}

catch(Exception IO){

System.out.println(IO.getMessage());}

}

});

btnAdd.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

KeyGenerator keygenerator = KeyGenerator.getInstance("DES");

SecretKey myDesKey = keygenerator.generateKey();

Cipher desCipher ;

desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);

String sql = "Insert into MULTICHAT_VERS2 (idMultichat,email,password,Question,Answer) values (?,?,?,?,?)";

PreparedStatement pst = myConn.prepareStatement(sql);

pst.setInt(1, primaryKey);

pst.setString(2, email.getText());

pst.setString(3, password.getText());

pst.setString(4, "default!");

pst.setString(5, "default!");

byte[] emailEncrypted = desCipher.doFinal(email.getText().getBytes());

byte[] passwordEncrypted = desCipher.doFinal(password.getText().getBytes());

byte[] questionEncrypted = desCipher.doFinal("default!".getBytes());

byte[] answerEncrypted = desCipher.doFinal("default!".getBytes());

row[0] = primaryKey;

row[1] = emailEncrypted;

row[2] = passwordEncrypted;

row[3] = questionEncrypted;

row[4] = answerEncrypted;

model.addRow(row);

password.setText("");

email.setText("");

pst.executeUpdate();

primaryKey++;

JOptionPane.showMessageDialog(null, "Add Succesfull");

} catch (Exception IO) {

System.out.println("Error!" + IO.getMessage());

}

}

});

btnUpd.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

KeyGenerator keygenerator = KeyGenerator.getInstance("DES");

SecretKey myDesKey = keygenerator.generateKey();

Cipher desCipher ;

desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

if(oldPassword.getText().equals(password.getText())){

String sql = "Update multichat_vers2 set password='" + newPassword.getText() +"'" + "WHERE email='" + email.getText() + "'";

PreparedStatement pst = myConn.prepareStatement(sql);

int i = table.getSelectedRow();

byte[] emailEncrypted = desCipher.doFinal(email.getText().getBytes());

byte[] passwordEncrypted = desCipher.doFinal(password.getText().getBytes());

model.removeRow(i);

row[1] = emailEncrypted;

row[2] = passwordEncrypted;

model.addRow(row);

pst.executeUpdate();

myConn.close();

JOptionPane.showMessageDialog(null, "Your password is changed!");

}

else

{

JOptionPane.showMessageDialog(null, "Your password is wrong!");

}

} catch (Exception IO) {

System.out.println(IO.getMessage());

}

}

});

btnDel.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

String sql = "Delete from multichat_vers2 where email = ?";

PreparedStatement pst = myConn.prepareStatement(sql);

pst.setString(1, email.getText());

row[0] = email.getText();

row[1] = password.getText();

password.setText("");

email.setText("");

int i = table.getSelectedRow();

model.removeRow(i);

JOptionPane.showMessageDialog(null, "Delete Succesfull!");

pst.executeUpdate();

} catch (Exception IO) {

IO.getMessage();

}

}

});

try {

KeyGenerator keygenerator = KeyGenerator.getInstance("DES");

SecretKey myDesKey = keygenerator.generateKey();

Cipher desCipher ;

desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey); Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myCon = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myCon.createStatement();

ResultSet myRs = myStat.executeQuery("SELECT * FROM MULTICHAT_VERS2");

while (myRs.next()) {

byte[] emailEncrypted = desCipher.doFinal(myRs.getString("email").getBytes());

byte[] passwordEncrypted = desCipher.doFinal(myRs.getString("password").getBytes());

byte[] questionEncrypted = desCipher.doFinal(myRs.getString("Question").getBytes());

byte[] answerEncrypted = desCipher.doFinal(myRs.getString("Answer").getBytes());

row[0] = (myRs.getInt("idMultichat"));

row[1] = emailEncrypted;

row[2] = passwordEncrypted;

row[3] = questionEncrypted;

row[4] = answerEncrypted;

model.addRow(row);

}

btnDel.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

String sql = "Delete from multichat_vers2 where email = ?";

PreparedStatement pst = myConn.prepareStatement(sql);

pst.setString(1, email.getText());

row[0] = email.getText();

row[1] = password.getText();

password.setText("");

email.setText("");

int i = table.getSelectedRow();

model.removeRow(i);

JOptionPane.showMessageDialog(null, "Delete Succesfull!");

pst.executeUpdate();

} catch (Exception IO) {

IO.getMessage();

}

}

});

btnUpd.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

KeyGenerator keygenerator = KeyGenerator.getInstance("DES");

SecretKey myDesKey = keygenerator.generateKey();

Cipher desCipher ;

desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

if(oldPassword.getText().equals(password.getText())){

String sql = "Update multichat_vers2 set password='" + newPassword.getText() +"'" + "WHERE email='" + email.getText() + "'";

PreparedStatement pst = myConn.prepareStatement(sql);

int i = table.getSelectedRow();

byte[] emailEncrypted = desCipher.doFinal(email.getText().getBytes());

byte[] passwordEncrypted = desCipher.doFinal(password.getText().getBytes());

model.removeRow(i);

row[1] = emailEncrypted;

row[2] = passwordEncrypted;

model.addRow(row);

pst.executeUpdate();

myConn.close();

JOptionPane.showMessageDialog(null, "Your password is changed!");

}

else

{

JOptionPane.showMessageDialog(null, "Your password is wrong!");

}

} catch (Exception IO) {

System.out.println(IO.getMessage());

}

}

});

btnAdd.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

Connection myConn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ADMIN","pivot","Sad1996");

Statement myStat = myConn.createStatement();

KeyGenerator keygenerator = KeyGenerator.getInstance("DES");

SecretKey myDesKey = keygenerator.generateKey();

Cipher desCipher ;

desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);

String sql = "Insert into MULTICHAT_VERS2 (idMultichat,email,password,Question,Answer) values (?,?,?,?,?)";

PreparedStatement pst = myConn.prepareStatement(sql);

pst.setInt(1, primaryKey);

pst.setString(2, email.getText());

pst.setString(3, password.getText());

pst.setString(4, "default!");

pst.setString(5, "default!");

byte[] emailEncrypted = desCipher.doFinal(email.getText().getBytes());

byte[] passwordEncrypted = desCipher.doFinal(password.getText().getBytes());

byte[] questionEncrypted = desCipher.doFinal("default!".getBytes());

byte[] answerEncrypted = desCipher.doFinal("default!".getBytes());

row[0] = primaryKey;

row[1] = emailEncrypted;

row[2] = passwordEncrypted;

Similar Posts