Интернет програмиране с Java – част 5



Дата29.08.2016
Размер165.61 Kb.

Интернет програмиране с Java – част 5


Автори:

Светлин Наков, СУ “Св. Климент Охридски”



Web-site: http://www.nakov.com

Борис Червенков, “Информационно обслужване” АД



E-mail: boris@abv.bg

Последна промяна: 10.07.2002
В предходната част от курса започнахме темата за създаването на Java аплети. В тази част ще довършим изложението по тази тема и ще продължим с темата “Web-приложения”.

JAVA аплети и сигурност


Сигурността на аплетите е важна тяхна черта. Никой потребител не би се съгласил да разглежда сайтове с аплети, ако те могат да пишат свободно по диска му, ако могат да откраднат негова лична информация, да изпращат email-и от негово име или да извършват някаква друга злонамерена дейност. Ето защо по идея аплетите работят с ограничени права. Сигурността в Java е част от самата платформа и се конфигурира от един специален файл с име java.policy. В зависимост от правата, които Web-браузърът иска да даде на аплета, се подготвя съответен файл, който ги описва и виртуалната машина се конфигурира по него. В някои браузъри правата могат да се настройват и се допуска възможност потребителят да дава пълно доверие на определени сайтове, с което аплетите се освобождават от ограниченията си. Ако потребителят не е посочил нещо друго, се използват стандартните настройки за правата на аплетите, които налагат следните ограничения: Аплетите не могат да четат и пишат по диска на машината, на която се изпълняват. Не могат да осъществават достъп до чужда памет, дори в операционни системи, в които няма защита на паметта. Не могат да отварят сокет до произволен сървър в Интернет. Могат да отварят сокет само до хост-а, от който са заредени. Не могат да извикват директно native код. Не могат да предизвикат претоварване или забиване на машината, на която се изпълняват. Последното е възможно да се случи в някои специфични ситуации, но това се дължи на грешки и пропуски в сигурността на съответните браузъри и виртуалните машини, които те използват. Трябва да обърнем специално внимание на сокетите. Свидетели сме на много аплети, които извършват активна мрежова дейност, като например аплети за Chat, аплети за четене на email, аплети за изпращане на email, различни игри и т.н. Всички те използват сокет базирана комуникация и изглежда, че отварят сокет към Интернет. Например при изпращането на поща аплетът комуникира със зададен от потребителя SMTP сървър. Това, обаче, не става директно, както при обикновените програми на Java. Аплетите имат право да се свързват чрез сокет само до сървъра, от който са заредени, т.е. към хост-а върнат от метода getCodeBase().getHost(). Ето защо аплети, които не са заредени от някой Web-сървър, а локално от файловата система, чрез отваряне на локален HTML файл, нямат право да отварят никакви сокети. Това защитава потребителите от атака чрез HTML документи съдържащи аплети със злонамерено действие. Всички аплети, които изглежда, че отварят сокети към Интернет, всъщност отварят сокети към сървъра, от който са заредени и от там получават пренасочване към заявения хост, т.е. използват Web-сървъра като прокси (междинен пренасочващ сървър). Когато се наложи да пишем аплет, който комуникира чрез сокети, е необходимо на Web-съвръра, където се хоства този аплет да пуснем някакъв допълнителен сървър, който осигурява комуникацията на аплета с услугата, до която той трябва да осъществява достъп. Разбира се, това трябва да става след успешна автентикация на потребителя в системата. За целта най-удобно е сървърът, който се грижи за комуникацията на аплета да се интегрира в Web-сървъра, за да може да използва информацията от сесията на потребителя, който е изпълнил аплета. Как точно може да стане това ще изясним по-нататък в нашия курс в частта за Web-приложения.

Нека сега дадем още един пример за аплет, с който да демонстрираме работа с компонентите на AWT и обработката на събитията, възникнали в резултат от действията на потребителя. Да си поставим за задача реализацията на прост калкулатор, който събира числа. Трябват ни две полета за двете събираеми, още едно поле за резултата и един бутон за събиране. За демонстрация на работата със шрифтове ще добавим в нашия аплет-калкулатор заглавен текст със сянка. За демонстрация на работата със събития от мишката при щракване върху аплета цветът му ще се променя, а при отпускане бутона на мишката ще се възстановява обратно. Ето една примерна реализация на аплета:

import java.awt.*;

import java.awt.event.*;

import java.applet.*;
public class SumatorApplet extends Applet {

TextField number1Field = new TextField();

TextField number2Field = new TextField();

Button calcButton = new Button();

TextField sumField = new TextField();

Color lastBackground;


public void init() {

this.setBackground(Color.black);

// Set layout manager to null

this.setLayout(null);

// Create the first text field

number1Field.setBounds(

new Rectangle(20, 50, 60, 25));

number1Field.setBackground(Color.white);

this.add(number1Field, null);

// Create the second text field

number2Field.setBounds(

new Rectangle(95, 50, 60, 25));

number2Field.setBackground(Color.white);

this.add(number2Field, null);

// Create the "calculate sum" button

calcButton.setBounds(

new Rectangle(170, 50, 90, 25));

calcButton.addActionListener(

new ActionListener() {

public void actionPerformed(

ActionEvent e) {

calcSum();

}

});


calcButton.setLabel("calc sum");

this.add(calcButton, null);

// Create the result text field

sumField.setEditable(false);

sumField.setBackground(Color.gray);

sumField.setForeground(Color.white);

sumField.setBounds(

new Rectangle(20, 85, 240, 25));

this.add(sumField, null);

}
public boolean mouseDown(Event evt,

int x, int y) {

lastBackground = this.getBackground();

this.setBackground(Color.red);

return true;

}
public boolean mouseUp(Event evt,

int x, int y) {

this.setBackground(lastBackground);

return true;

}
private void calcSum() {

try {


long s1 = new Long(number1Field.

getText()).longValue();

long s2 = new Long(number2Field.

getText()).longValue();

sumField.setText(s1 + " + " +

s2 + " = " + (s1+s2));

} catch (Exception ex) {

sumField.setText("Error!");

}

}
public void paint(Graphics g) {



super.paint(g);

Font font = new Font(

"Dialog", Font.BOLD, 23);

g.setFont(font);

g.setColor(Color.blue);

g.drawString(

"Nakov sumator applet", 20, 32);

g.setColor(Color.white);

g.drawString(

"Nakov sumator applet", 18, 30);

}
public static void main(String[] args) {

Frame frame = new Frame("Sumator");

frame.setSize(280,160);

SumatorApplet applet =

new SumatorApplet();

applet.init();

frame.add(applet);

frame.setVisible(true);

applet.start();

}

}



В инициализационната част на аплета първо се задава стойност null за Layout Manager. Layout Manager-ът служи за подреждане на AWT компонентите в един AWT контейнер и може да е много полезен при създаване на форми, които могат да променят размерите си. В случая искаме да работим с абсолютни координати и размери на компонентите, а не с размери и координати, определени от Layout Manager-а и затова задаваме за LayoutManager стойност null, понеже по подразбиране тази стойност е друга. След това създаваме компонентите една по една – първото текстово поле, второто текстово поле, бутонът. За да прихванем събитието “натискене на бутона за сумиране”, използваме методът addActionListener, който приема като параметър обект от клас, който имплементира интерфейса ActionListener. За спестяване на някои неудобства използваме дефиниция на място на анонимен клас, който реализира ActionListener интерфейса и в метода за натискане на бутон actionPerformed() извиква метода за изчисляване на сумата calcSum(). За прихващане на събитията от мишката има два начина. Единият, който ние сме използвали е да се припокрият методите MouseDown(), MouseUp() и т.н. на базовия клас, а другият е да се добави MouseListener с метода addMouseListener() по начин подобен на този с добавянето на ActionListener. Процедурата за пресмятане на резултата взима стойностите от двете текстови полета, превръща ги в числа и показва резултата от събирането в полето за резултата. Ако не успее при превръщането тескта от полетата в числа или ако се случи препълване или някаква друга грешка, резултатът е “Error!”. За демонстрация на работата с шрифтове в метода paint() се отпечатва текст със сянка. Важно е методът paint() да извиква paint() метода на базовия си клас (super.paint()), за да могат компонентите, добавени в аплета да се пречертават всеки път, когато аплетът се пречертава. В нашата реализация на paint() метода след извикването на базовия paint() метод, чертането продължава със задаване на шрифта и цвета на текста и отпечатването му. След това цветът се сменя и се отпечатва същия текст, изместен с 2 позиции нагоре и наляво. Така се създава впечатлението за сянка. Нашият аплет има още една интересна възможност – може да работи и като самостоятелна програма. За целта той има main() метод, в който се създават аплета и един обект java.awt.Frame, след което във Frame-а се поставя аплета, задават му се размерите и се показва на екрана. Така аплетът може да бъде стартиран за тестови цели като самостоятелна програма, а когато е готов, може да се тества и в браузера, защото, както знаете аплетите се държат по различен начин в различните среди, в които се стартират. Ето примерен HTML код, с който се стартира аплета:



codebase="." width="280" height="130">







База данных защищена авторским правом ©obuch.info 2016
отнасят до администрацията

    Начална страница