Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовой Ульяны.docx
Скачиваний:
11
Добавлен:
25.11.2018
Размер:
96.6 Кб
Скачать

Федеральное государственное образовательное учреждение

высшего профессионального образования

«ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

ПУТЕЙ СООБЩЕНИЯ »

Кафедра «Информационные и вычислительные системы»

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

по дисциплине «Методы программирования»

на тему:

«Разработка Java-апплета и подписывание

архивного JAR-файла электронной цифровой подписью»

Выполнил:

студент группы БТС-909

Любимова У.В.

Руководитель:

к.т.н., доц. Кожомбердиева Г.И.

С.-Петербург

2011

ЗАДАНИЕ

по курсовому проекту

по дисциплине «Методы программирования»

на тему:

«Разработка Java-апплета и подписывание

архивного JAR-файла электронной цифровой подписью»

  • В качестве исходных данных к курсовому проекту используется апплет, являющийся результатом выполнения лабораторной работы № 4 «Разработка апплета с эффектом анимации на основе многопоточности Java».

Вариант задания № 5

  • Необходимо расширить функциональность апплета с эффектом анимации, реализовав обращение к локальной файловой системе.

  • Создать архивный JAR-файл, содержащий апплет.

  • Подписать JAR-файл электронной цифровой подписью (ЭЦП) и задать политику безопасности для подписанного апплета, включив в файл политики соответствующую запись, разрешающую доступ к локальной файловой системе и выполнение операций чтения-записи.

При выполнении курсового проекта использовать утилиты jar, keytool и jarsigner, а также комплект JDK 1.4.x с модулем plug-in для браузера MS IE 5(6).

Аннотация

В курсовом проекте осуществляется разработка Java-апплета, в котором используется механизм многопоточности Java, а также, при предоставлении соответствующих прав доступа, выполняется обращение к локальной файловой системе. Архивный файл апплета подписывается ЭЦП.

Для апплета задается политика безопасности, путём создания пользовательского файла политики безопасности, который позволяет апплету получить доступ к локальной файловой системе и обеспечивающий возможность работы апплета за пределами модели безопасности Sandbox – «Песочница».

Подписанный апплет выполняется в среде MS IE c модулем plug-in из JDK 1.4.x.

Содержание

Введение ….…………………………………………………………............ 5

  1. Апплет с эффектом анимации на основе многопоточности Java и обращением к локальной файловой системе ………….…................ 6

  2. Создание подписанного апплета …………… …......……………... 12

2.1. Создание архивного JAR-файла ………………………………………..…..…..12

2.2. Создание пары ключей и сертификата в хранилище ключей ………….…. 12

2.3. Подписывание JAR-файла цифровой подписью ……………………............. 13

2.4. Задание политики безопасности для подписанного апплета ………............. 14

3. Выполнение подписанного апплета ……………......……………. 15

Список использованных источников ………………………………… 16

Введение

Платформа Java имеет гибкую и развитую системы безопасности. В платформе Java 2 реализована конфигурируемая модель безопасности, согласно которой каждому коду может быть назначена своя конфигурируемая политика безопасности, которая определяет какие права доступа предоставляются программе на основании данных об источниках исходного кода и поставщиков, подписавших код.

Цель работы:

Разработка апплета с возможностью предоставления доступа к важным ресурсам системы, таким как чтение-запись файла. Подписывание архивного файла ЭЦП из цепочки сертификатов. Изучение возможных настроек файлов политик безопасности и запуск апплета с этими настройками.

В результате выполнения курсового проекта апплет, разработанный по заданию для лабораторной работы №4, был функционально расширен. Файлы классов апплета были упакованы в архивный JAR-файл, который был подписан электронной цифровой подписью. Для него был создан файл политики безопасности.

1. Апплет с эффектом анимации на основе многопоточности Java и обращением к локальной файловой системе

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

import java.io.*;

import java.util.Calendar;

public class Draw extends Applet implements AdjustmentListener, ActionListener,

Runnable {

Thread animThread = null; //Поток для рисования анимированного //изображения

Button b1; // кнопка 1

Button b2; // кнопка 2

Button b3; // кнопка 3

Button b4; // кнопка 4

Button st1;

Button st2;

Choice ch; // выпадающий список

Scrollbar sb; // полпоса прокрутки

TextField tf;// текстовое поле

Label lb1; // надпись

Label lb2;

Canvas canvas;// область для рисования

int x = 10;

int y = 60;

int dy = 1; // "шаг" движения изображения

Panel Left;

Panel Right;

Panel Journal; // панель для размещения файла-журнала

int k = 0;

int t = 0;

Color col1, col2, col3, col4, col5, colf1, colf2, colf3;

Button buttj;

TextArea fileText;

// Имя файла-журнала для записи информации о работе апплета

String fileName = "";

// Раделитель строк (признак конца строки)

String ls;

// Буферизированный символьный поток записи в файл

BufferedWriter out;

public void init() {

col1 = new Color(0, 0, 255);

col2 = new Color(0, 150, 0);

col3 = new Color(250, 150, 50);

col4 = new Color(250, 0, 0);

col5 = new Color(0, 0, 0);

colf1 = new Color(255, 150, 255);

colf2 = new Color(100, 200, 255);

colf3 = new Color(255, 255, 150);

setLayout(new GridLayout(1, 3));

Left = new Panel();

Left.setLayout(new GridLayout(2, 1));

Left.setBackground(colf1);

Right = new Panel();

Right.setLayout(new BorderLayout());

Right.setBackground(colf3);

addToPanel();

add(Left);

add(Right);

// Панель для чтения файла-журнала

Journal = new Panel();

Journal.setLayout(new BorderLayout());

fileText = new TextArea();

fileText.setBackground(Color.white);

Journal.add(fileText, BorderLayout.CENTER);

fileName = getParameter("FileName");

if (fileName == null)

fileName = "log.txt";

ls = System.getProperty("line.separator"); // разделитель строк

buttj = new Button("Чтение файла-журнала");

buttj.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

try {

// Сброс данных из буфера потока (запись в файл)

out.flush();

// Чтение из файла

BufferedReader in = new BufferedReader(new FileReader(

fileName));

String s = "", line;

while ((line = in.readLine()) != null)

s += line + "\n";

fileText.setText(s);

in.close();

} catch (IOException ex) {

fileText.setText("Ошибка чтения файла: " + ls);

fileText.append(ex.toString());

}

}

});

Journal.add(buttj, BorderLayout.NORTH);

add(Journal);

try {

out = new BufferedWriter(new FileWriter(fileName));

} catch (IOException ex) {

fileText.setText("Ошибка при создании потока записи: " + ls);

fileText.append(ex.toString() + ls);

} catch (SecurityException ex) {

fileText.setText("Нет разрешения доступа к файлу: " + ls);

fileText.append(ex.toString() + ls);

buttj.setEnabled(false);

}

if (out != null) {

Calendar c = Calendar.getInstance();

String dateMessage = "Дата и время: "

+ c.get(Calendar.DAY_OF_MONTH) + "/"

+ (c.get(Calendar.MONTH) + 1) + " - "

+ c.get(Calendar.YEAR) + " " + c.get(Calendar.HOUR_OF_DAY)

+ ":" + c.get(Calendar.MINUTE);

writeLogMessage(dateMessage);

writeLogMessage("Инициализация апплета завершена");

}

}

// -----------------Блок прослушивание от полосы прокрутки--------

// реализация блока прослушивания

public void adjustmentValueChanged(AdjustmentEvent e) {

Scrollbar sb = (Scrollbar) e.getSource();

int c = e.getValue();

setTextVal(c);

canvas.repaint();

}

Scrollbar getSb() {

return sb;

}

void setSbVal(int value) {

sb.setValue(value);

setTextVal(value);

}

void setTextVal(int value) {

tf.setText(String.valueOf(value));

}

public void addToPanel() {

Panel UpperLeft = new Panel();

UpperLeft.setLayout(new GridLayout(5,1,1,25));

UpperLeft.setBackground(colf2);

lb1 = new Label("Цвет текста:", Label.LEFT); // Создание надписи

ch = new Choice(); // Создание выпадающего списка

ch.addItem("Синий");

ch.addItem("Зеленый");

ch.addItem("Оранжевый");

ch.addItem("Красный");

ch.addItem("Черный");

//------Блок прослушивания событий от выпадающего списка-----

ch.addItemListener(new ItemListener() // регистрация

{

public void itemStateChanged(ItemEvent e) // реализация

{

String colorname = (String) e.getItem();

if ("Синий".equals(colorname)) {

canvas.setForeground(col1);

} else if ("Зеленый".equals(colorname)) {

canvas.setForeground(col2);

} else if ("Оранжевый".equals(colorname)) {

canvas.setForeground(col3);

} else if ("Красный".equals(colorname)) {

canvas.setForeground(col4);

} else if ("Черный".equals(colorname)) {

canvas.setForeground(col5);

}

canvas.repaint();

}

});

sb = new Scrollbar(Scrollbar.HORIZONTAL, k, 1, 0, 251); // полоса прокрутки

sb.addAdjustmentListener(this);// регистрация блока прослушивания

tf = new TextField(String.valueOf(k));

tf.setEditable(false); // делаем текстовое поле недоступным для

// изменения вручную

st1 = new Button("Start");

st1.addActionListener(this);

st2 = new Button("Stop");

st2.addActionListener(this);

canvas = new Canvas() // Создание панели рисования

{

public void paint(Graphics g) {

g.setFont(new Font("Courier", Font.BOLD, 70));

g.drawString(tf.getText(), x, y);

}

};

Panel DownLeft = new Panel();

DownLeft.setLayout(new GridLayout(2, 2, 10, 10));

b1 = new Button("Влево вверх");

b2 = new Button("Вправо вверх");

b3 = new Button("Влево вниз");

b4 = new Button("Вправо вниз");

// ---------------Блоки прослушивания от кнопок--------------

b1.addActionListener(new ActionListener() // регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = 10;

y = 60;

canvas.repaint();

}

});

b2.addActionListener(new ActionListener() // регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = Right.getSize().width - 130;

y = 60;

canvas.repaint();

}

});

b3.addActionListener(new ActionListener() // регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = 10;

y = Right.getSize().height - 10;

canvas.repaint();

}

});

b4.addActionListener(new ActionListener()// регистрация

{

public void actionPerformed(ActionEvent e) // реализация

{

x = Right.getSize().width - 130;

y = Right.getSize().height - 10;

canvas.repaint();

}

});

// -------------- Добавление компонентов на панель----------------

UpperLeft.add(lb1);

UpperLeft.add(ch);

UpperLeft.add(st1);

UpperLeft.add(st2);

UpperLeft.add(sb);

DownLeft.add(b1);

DownLeft.add(b2);

DownLeft.add(b3);

DownLeft.add(b4);

Right.add(canvas, BorderLayout.CENTER);

Left.add(UpperLeft);

Left.add(DownLeft);

add(Right);

}

// ===========================Работа с потоками=========================

public void start() // запуск потока

{

animThread = new Thread(this); // создание потока

animThread.start();// запуск объект потока

st1.setEnabled(false);

st2.setEnabled(true);

if (out != null)

writeLogMessage("Поток апплета запущен");

}

public void stop() // завершение потока

{

animThread = null;

st1.setEnabled(true);

st2.setEnabled(false);

if (out != null)

writeLogMessage("Поток апплета остановлен");

}

// Уничтожение апплета

public void destroy() {

if (out != null) {

writeLogMessage("Выполнение апплета завершено");

try {

out.close();

} catch (IOException ex) {

}

}

}

public void run() {

Thread thisThread = Thread.currentThread();// текущий поток

while ((animThread == thisThread) && (k < 251) && (t < 251))

// пока работает поток, и пока параметры (счетчики) меньше 251

{

canvas.repaint(); // перерисовка панели Right

sb.setValue(k);//полосе прокрутки устанавливается значение k

t = sb.getValue();// в t заносится значение полосы прокрутки

tf = new TextField(String.valueOf(t)); // в текстовое поле //заносится значение t

k++;

if ((k == 251) || (t == 251)) // по достижении 251 счетчик

//обнуляется

{

k = 0;

t = 0;

}

MoveText(); // запуск метода MoveText()

try {

thisThread.sleep(60); // приостановить поток

} catch (InterruptedException e) {

return; // завершить поток

}

}

}

private void MoveText() // метод для движения цифр по вертикали

{

if (y == (Right.getSize().height - 10) && dy == 1) {

dy = -1; // меняем направление движения на противоположное

}

if (y == 60 && dy == -1) {

dy = 1; // меняем направление движения на противоположное

}

y += dy;

}

public void actionPerformed(ActionEvent e) {

String acm = e.getActionCommand();

if ("Start".equals(acm))

start();

if ("Stop".equals(acm))

stop();

}

// Вывод сообщения в буферизированный поток для записи в файл

private void writeLogMessage(String message) {

try {

out.write(message);

out.newLine();

} catch (IOException ex) {

fileText.setText("Ошибка записи в файл:" + ls);

fileText.append(ex.toString() + ls);

}

}

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]