View on GitHub

ITMO-PE

My study notes about Program Engineering at University ITMO

MainPage/SOA/Rubiesh 1

Вариант 1

1. Все про SOAP
关于 SOAP 的一切

SOAP - формат обмена сообщениями
SOAP——消息交换格式

Структура документа WSDL:
WSDL文档结构:

SOAP всегда содержит 3 уровня в структуре (+1 дополнительный):
SOAP 在其结构中始终包含 3 个级别(+1 个额外级别):

SOAP: Позволяет специфицировать интерфейсы веб-сервисов.
SOAP:允许 Web 服务接口规范。 Особенности:
特点:

WSDL: Web Services Description Language – язык спецификации SOAP веб-сервисов.
WSDL:Web 服务描述语言 – SOAP Web 服务规范语言。

Пример запроса и ответа:

POST /Quotation HTTP/1.0
Host: www.xyz.org
Content-Type: text/xml; charset = utf-8
Content-Length: nnn

<?xml version = "1.0"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
    SOAP-ENV:encodingstyle = "http://wvzw.w3.org/2O01/12/soap-encoding">

    <SOAP-ENV:Body xmlns:m = "http://www.xyz.org/quotations">
        <m:GetQuotation>
            <m:QuotationsName>MiscroSoft</m:QuotationsName>
        </m:GetQuotation>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>
HTTP/1.0 200 OK
Content-Type: text/xml; charset = utf-8
Content-Length: nnn

<?xml version ="1.0"?>
<SOAP-ENV:Envelope
    xmlns:SOAP-ENV = "http://www.w3.org/2001/12/soap-envelope"
    SOAP - ENV  encodingStyle = " http ://\vw. w3.org/20Ol/12/soap-encoding ">

    <SOAP-ENV:Body xmlns:m = "http://www.xyz.org/quotation">
        <m:GetQuotationResponse>
            <m:Quotation>Here is the quotation</m:Quotation>
        </m:GetQuotationResponse>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Преимущества: 优点:

Отличие от REST: SOAP ограничивает структуры ваших сообщений, тогда как REST — это архитектурный подход, ориентированный на использование HTTP в качестве транспортного протокола.
与 REST 的区别:SOAP 限制消息的结构,而 REST 是一种专注于使用 HTTP 作为传输协议的架构方法。

2. Все про самоподписанные сертификаты
关于自签名证书的所有信息

В криптографии под самоподписанным SSL сертификатом понимают сертификат открытого ключа, изданный и подписанный тем же лицом, которое он идентифицирует. Проще говоря, если Вы сами для своего домена или IP-адреса создали SSL сертификат он будет называться самоподписанным. Также существуют другие названия: «самоизданный» или «самозаверенный», что является одним и тем же.
在密码学中,自签名 SSL 证书是由其所标识的同一个人颁发和签名的公钥证书。简单地说,如果您自己为域名或 IP 地址创建了 SSL 证书,则该证书被称为自签名证书。还有其他名称:“自出版”或“自我认证”,它们是同一件事。

3. Реализовать rest сервис на jaxrs для работы с корзиной покупок. Формат данных - xml
在 jaxrs 上实现REST服务以与购物车配合使用。数据格式-xml

@Data 
@XmlRootElement(name="products")
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {
    @XmlElement(required=true)
    protected int id;
    @XmlElement(required=true)
    protected String name;
    @XmlElement(required=true)
    protected String description;
    @XmlElement(required=true)
    protected int price;
}

@Data
@XmlRootElement(name="basket")
@XmlAccessorType(XmlAccessType.FIELD)
public class Basket {

    @XmlElement(required=true)
    protected int id;

    @XmlElement(required=true)
    protected List<Product> products;
}

@Path("/baskets")
public class BasketService {
    private Repository rep = new Repository();

    @POST
    @Consumes("application/xml")
    public Basket createBasket() { 
        return Mapper.mapBasket(rep.createBasket());;
    }

    @GET
    @Consumes("application/xml")
    public Basket getBasket() {
        return Mapper.mapBasket(rep.getBasket());
    }

    @PUT
    @Path("/{id}") @Consumes("application/xml")
    public Basket addProduct(@PathParam("id") Long id, Product prod) {
        rep.addProduct(id, Mapper.mapToEntityProduct(prod)); 
        return getProduct();
    }

    @POST
    @Path("{id}/products/{prodId}") @Consumes("application/xml")
    public void addProduct(@PathParam("id") Long id, @PathParam("prodId") Long prodId) {
        rep.addProduct(id, prodId);
    }
    @DELETE
    @Path("{id}/products/{prodId}") @Consumes("application/xml")
    public void deleteProduct(@PathParam("id") Long id, @PathParam("prodId") Long prodId) {
        rep.deleteProduct(id, prodId);
    }
    @DELETE
    @Path("{id}") @Consumes("application/xml")
    public void deleteBasket(@PathParam("id") Long id) {
        rep.deleteBasket(id);
    }
}

Вариант 2

1. Правила именования RESTful ресурсов
RESTful资源的命名规则

Требований нет, есть рекомендации.
没有要求,只有建议。

2. TLS/SSL в иерархии протоколов
协议层次结构中的 TLS/SSL

SSL (Secure Sockets Layer) и TLS (Transport Level Security)
SSL(安全套接字层)和 TLS(传输层安全性)

Протокол SSL размещается между двумя протоколами (работает фильтром, защищая данные):
SSL 协议位于两种协议之间(它充当过滤器,保护 数据):

  1. протоколом, который использует программа-клиент (напр., HTTP) и транспортным протоколом TCP/IP
    1. 客户端程序使用的协议(例如HTTP)和TCP/IP传输协议

Работу протокола SSL можно разделить на два уровня:
SSL协议的运行可以分为两个层次:

3. Открыть из репозитория спринг дата рест все не публичные методы
从 Spring Data Rest 存储库中打开所有非公共方法

/*
* spring.data.rest.detection-strategy=annotation
*/
@Repository
public interface UserRepository extends Repository<User, Long> {
    @RestResource(exported = false)
    public User save(User user);
    @RestResource(exported = false)
    public Optional<User> findById(Long id);
    @RestResource
    Optional<User> findByUsername(String username);
    @RestResource
    void deleteByCityName(String cityName);
}

Вариант 3

1. Монолитная архитектура: особенности, достоинства, недостатки
单体架构:特点、优点、缺点

Монолитное приложение состоит из базы данных, клиентского пользовательского интерфейса, серверного приложения
单体架构应用程序由数据库、客户端用户界面和服务器应用程序组成。

Плюсы:
优点:

Минусы:
缺点:

С течением времени большинство продуктов продолжают разрабатываться и увеличиваются в объеме, а их структура становится размытой. В этот момент и масштабирование становится сложным (так как нельзя масштабировать отдельные части вашей системы)
随着时间的推移,大多数产品会不断开发并变得更加庞大,其结构也会逐渐变得模糊。在这种情况下,扩展系统变得困难(因为无法对系统的各个部分单独进行扩展)。

Добавление новой технологии означает переписывание всего приложения, что является дорогостоящим и требует много времени.
添加新技术意味着需要重写整个应用程序,这既昂贵又耗时。

+/- по SOA по сравнению с монолитной архитектурой:
SOA与单体架构对比的优劣势:

Достоинства:
优点:

Недостатки:

2. Стратегии экспорта в репозиториях Spring Data Rest.
Spring Data Rest 存储库中的导出策略。

Наименование Описание
DEFAULT Открывает наружу все публичные интерфейсы репозитория, но учитывает флаг exported в аннотациях @(Repository)RestResource.
对外开放存储库的所有公共接口,但会考虑注解 @(Repository) RestResource 中的 exported 标志。
ALL Открывает наружу все интерфейсы репозитория без учёта модификаторов доступа и аннотаций.
对外开放存储库的所有接口,不考虑访问修饰符和注解。
ANNOTATION Открывает наружу только ресурсы, помеченные аннотациями @(Repository) RestResource с учётом значения флага exported.
仅对外开放带有注解 @(Repository) RestResource 的资源,并且考虑 exported 标志的值。
VISIBILITY Открывает наружу только публичные аннотированные ресурсы.
仅对外开放带有注解的公共资源。

Для Spring Boot:
对于 Spring Boot: Настройка происходит путём добавления строчки в application.properties:
可以通过在 application.properties 文件中添加以下行进行配置:

spring.data.rest.detection-strategy=visibility

P.S. флаг exported ставится в аннотации @RestResource над методом репозитория:
附注:exported 标志通过在存储库方法上使用注解 @RestResource 设置:

@RestResource(exported = false)
void deleteById(Long aLong);

Или над самим репозиторием, если необходимо скрыть все его методы:

@RepositoryRestResource(exported = false) was
interface PersonRepository extends CrudRepository<Person, Long> {}

3. Дан Spring Data репозиторий с одним методом. Превратить его в Spring Data Rest и сделать так, чтобы в интернеты торчал только этот метод
给定一个带有单一方法的 Spring Data 存储库,将其转换为 Spring Data Rest,并确保只有该方法对外暴露:

Добавляем в application.properties:

spring.data.rest.detection-strategy=visibility

Далее пишем репозиторий:

@RepositoryRestResource(collectionResourceRel = "car", path = "cars")
public interface CarRepository extends Repository<Car, Long> { 
    public Car save(Car car);
}

Вариант 4

1. Особенности разработки RESTful на Spring
Spring RESTful开发的特点

ключевых фреймворка:
框架的关键组成部分:

Spring Web MVC:

Состав приложения:
应用组成部分:

По определению HandlerMapping — интерфейс, который реализуется объектами, которые определяют отображение между запросами и объектами обработчиков.
根据定义 HandlerMapping 是一个接口,由确定请求与处理对象之间映射的对象实现。

Dispatcher Servlet 调度器Servlet:

Обработка запроса:
请求处理流程:

  1. DispatcherServlet получает запрос.
    DispatcherServlet 接收请求。
  2. DispatcherServlet отправляет задачу выбора подходящего контроллера в HandlerMapping.
    HandlerMapping выбирает контроллер, который сопоставляется с URL-адресом входящего запроса, и возвращает (выбранный обработчик) и контроллер в DispatcherServlet.
    DispatcherServlet 将选择合适控制器的任务委派给 HandlerMapping。HandlerMapping 根据请求URL选择控制器,并返回所选处理器和控制器给 DispatcherServlet。

  3. DispatcherServlet отправляет задачу выполнения бизнес-логики Controller на HandlerAdapter.
    DispatcherServlet 将业务逻辑的执行任务交给 HandlerAdapter。
  4. HandlerAdapter вызывает процесс бизнес-логики контроллера.
    HandlerAdapter 调用控制器中的业务逻辑处理流程。
  5. Controller выполняет бизнес-логику, устанавливает результат обработки в Модель и возвращает логическое имя представления в HandlerAdapter.
    Controller 执行业务逻辑,将处理结果存储到模型中,并将逻辑视图名称返回给 HandlerAdapter。
  6. DispatcherServlet отправляет задачу разрешения представления, соответствующего имени представления, в ViewResolver. ViewResolver возвращает представление, сопоставленное с именем представления.
    DispatcherServlet 将解析视图名称的任务交给 ViewResolver。ViewResolver 返回与视图名称匹配的视图。
  7. DispatcherServlet отправляет процесс рендеринга в возвращенное представление.
    DispatcherServlet 将渲染任务交给返回的视图。
  8. Представление отображает данные модели и возвращает ответ.
    视图 显示模型数据并返回响应。

Контроллер:

@Controller
@RequestMapping("/hello")
public class HelloController {
    @RequestMapping(method = RequestMethod.GET)
    public String printHello(ModelMap model) {
        model.addAttribute("message", "Hello Spring MVC Framework!"); 
        // Атрибуты модели
        return "hello";
        //Возвращаемое представление
    }
}
@Controller
@RequestMapping("/post")
public class ExamplePostController {
    @Autowired
    ExampleService exampleService;

    @PostMapping("/response")
    @ResponseBody
    // ResponseTransfer будет сериализован в JSON
    public ResponseTransfer postResponseController (@RequestBody LoginForm loginForm) { //LoginForm будет десериализован из JSON
        return new ResponseTransfer("Thanks for Posting!!!");
    }
}
@GetMapping("/books")
public void book() {
    //
}

@RequestMapping(value = "/books", method = RequestMethod.GET)
public void book2() {

}

Есть аналогичные аннотации для Post, Put, Delete и Patch
Post、Put、Delete 和 Patch 有类似的注释

@PostMapping("/users") 
/* First Param is optional */ 
public User createUser(
    @RequestParam(required = false) 
    Integer age, 
    @RequestParam String name) {
    // does not matter
}

@PostMapping("/users")
/* Spring преобразует userDto  автоматически, если в классе есть getters and setters */ 
public User createUser (UserDto userDto) {
    //
}

@GetMapping(/users/{userid}) 
public User getUser (@PathVariable(required = false) String userid) {
    //
    return user;
}

@GetMapping("/users / {userid} /{userName}") 
public User getUser(UserDto userDto) {
    /* Will set "userid" & "userName" properties Automatically */ 
    return user;
}

Отображение методов на URL
将方法映射到 URL

@RestController 
@RequestMapping("/api/usars") 
public class Usercontroller {
    @GetMapping (params = {"user_id"})
    public ResponseEntity<?> getUserById(@RequestParam(name = "user_id") String userId) {
        // Doesn't matter 
        return new ResponseEntity<> (user, HttpStatus.OK);
    }
    
    @GetMapping(params = {"email"})
    public ResponseEntity<?> getUserByEmail(@RequestParam(name = "email") String email) {
        // Doesn't matter 
        return new ResponseEntityO(dtos, HttpStatus.OK);
    }
}

Controlller + ResponseBody = RestController

@Controller
@RequestMapping("books")
public class SimpleBookController {
    @GetMapping("/{id}", produces = "application/json")
    public @ResponseBody Book getBook(@PathVariable int id) {
        return findBookById(id);
    }

    private Book findBookById(int id) {
        // ...
    }
}

->

@RestController
@RequestMapping("books-rest")
public class SimpleBookController {
    @GetMapping("/{id}", produces = "application/json")
    public Book getBook(@PathVariable int id) {
        return findBookById(id);
    }

    private Book findBookById(int id) {
        // ...
    }
}

HttpMessageConverter Http消息转换器:

Spring Data REST Spring Data REST:

Автоматически создаёт контроллеры, “открывая наружу” методы определённых репозиториев (учитывая стратегии экспорта).
通过“公开”某些存储库的方法(考虑到导出策略)自动创建控制器。

2. keytool, основные команды
keytool,基本命令

Keytool - это утилита командной строки, для управления ключами или сертификатами, а также хранилищами ключей.
Keytool 是一个命令行工具,用于管理密钥或证书以及密钥库。

Создать ключи вместе с keystore:
创建密钥并生成 keystore:

keytool -genkey -alias example.com -keyalg RSA -keystore keystore.jks -keysize 2048

Создать запрос сертификата (CSR) для существующего Java keystore:
为现有 Java keystore 创建证书请求 (CSR):

keytool -certreq -alias example.com -keystore keystore.jks -file example.com.csr

Загрузить корневой или промежуточный CA сертификат:
导入根或中间 CA 证书:

keytool -import -trustcacerts -alias root -file Thawte.crt -keystore keystore.jks

Импортировать доверенный сертификат:
导入受信任的证书:

keytool -import -trustcacerts -alias example.com -file example.com.crt -keystore keystore.jks 

Экспортировать сертификат из keystore:
从 keystore 中导出证书:

keytool -export -alias example.com -file example.com.crt -keystore keystore.jks

Сгенерировать самоподписанный сертификат и keystore:
生成自签名证书和 keystore:

keytool -genkey -alias selfsigned -keyalg RSA -keystore keystore.jks -storepass password -validity 360 -keysize 2048 

Посмотреть сертификат:
查看证书:

keytool -printcert -v -file example.com.crt 

Посмотреть список сертификатов:
查看证书列表:

keytool -list -v -keystore keystore.jks

Проверить конкретный сертификат по алиасу:
按别名检查特定证书:

keytool -list -v -keystore keystore.jks -alias example.com

Удалить сертификат:
删除证书:

keytool -delete -alias example.com -keystore keystore.jks

Изменить пароль keystore:
更改 keystore 的密码:

keytool -storepasswd -new new_storepass -keystore keystore.jks

3. На основе сервлетов сервис для создания резиновых уточек по 3д модели с управлением заказами, возможностью указать размеры утки и партии
基于 Servlet 的服务,用于从 3D 模型创建橡皮鸭,具有订单管理功能,能够指定鸭子和批量大小

@WebServlet(name = "DuckServlet", urlPatterns = "/duck")
public class DuckServlet extends HttpServlet {
    private DuckService duckService = new DuckService();
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) { 
        List<Duck> ducks = duckService.getDucks();
    }
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        long width = request.getParameter("width");
        long height = request.getParameter("height");
        long length = request.getParameter("length"); 
        duckService.addDuck(width, height, length);
    }
    @Override 
    protected void doPut(HttpServletRequest request, HttpServletResponse response) {
        long id = request.getParameter("id");
        duckService.updateDuck(id);
    }

    @Override 
    protected void doDelete(HttpServletRequest request, HttpServletResponse response) {
        long id = request.getParameter("id");
        duckService.deleteDuck(id);
    }
}

Вариант 5

1. основные принципы soa
soa的基本原理

2. spring data rest - конфигурация, основные аннотации
spring data Rest - 配置、基本注释

  1. Добавляем зависимость в Maven / Gradle.
    在 Maven / Gradle 中添加依赖项.

    Зависимость в Maven:
    在 Maven 中添加依赖项:

    <dependency>
    <groupld>org.springframework.data</groupld>
    <artifactId>spring-data-rest-webmvc</artifactId>
    <version>3.3.4.RELEASE</version>
    </dependency>
    
  2. Конфигурируем.
    配置.

    • Не требуется, если используем Spring Boot.
      如果使用 Spring Boot,则无需配置.
    • Задается в классе RepositoryRestMvcConfiguration, который необходимо импортировать в конфигурацию приложения.
      如果不使用,则需要在应用程序配置中导入 RepositoryRestMvcConfiguration 类
    • Изменяется путем регистрации своего конфигуратора RepositoryRestConfigurer или наследования от класса адаптера RepositoryRestConfigurerAdapter.
      通过注册自定义的 RepositoryRestConfigurer 或继承 RepositoryRestConfigurerAdapter 类来更改.
  3. Выбираем стратегию экспорта репозитория.
    选择存储库导出的策略.

    Добавляем в application.properties:
    在 application.properties 文件中添加以下配置:

    spring.data.rest.detection-strategy=visibility/all/default/annotatiion
    
  4. Выбираем базовый URI.
    选择基础 URI.

    • Задаётся в application.properties: spring.data.rest.basePath=/api
      在 application.properties 文件中设置:spring.data.rest.basePath=/api.
    • Может быть задано в RepositoryRestConfigurer:
      或者可以在 RepositoryRestConfigurer 中设置:
    @Component 
    public class CustomizedRestMvcConfiguration extends RepositoryRestConfigurerAdapter { 
        @Override public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {   
            config.setBasePath("/api");
        }
    }
    

3. спецификация (url’ы) веб-сервиса, реализующего домофон
实现对讲的 Web 服务的规范(url)

paths:
    /code:
        get:
            description: Get current code
            responses:
                '200':
                        description: Current code
                        content:
                            application/json:
                                schema:
                                    $ref: '#/components/schemas/code'
                '500':
                        description: Server error, try again later.
        put:
            description: update current code (add new digit or execute symbol)
            parameters:
            - name: newDigit
                in: query
                description: new digit
                schema:
                    type: integer
                    format: int64
            - name: executeCode
                in: query
                description: symbol to start code execution
                schema:
                    type: char
            responses:
                '201':
                        description: Successful  command execution
                '404':
                        description: Unsuccessful command execution (command does not exist)
                '500':
                        description: Server error, try again later.
                delete:
                    description: delete last digit in code
                    responses:
                        '200':
                                description: Successful  deletion
                        '500':
                                description: Server error, try again later.

Вариант 6

1. что-то про soa
关于 soa 的一些事情

SOA— это стиль архитектуры программного обеспечения, который предполагает модульное приложение, состоящее из дискретных и слабосвязанных программных агентов, которые выполняют конкретные функции.
SOA(面向服务架构)是一种软件架构风格,强调将应用程序模块化为独立且低耦合的软件代理,这些代理执行特定功能。

Концепция SOA заключается в следующем: приложение может быть спроектировано и построено таким образом, что его модули легко интегрируются и могут быть легко использованы повторно.
SOA的理念在于:应用程序可以以一种易于集成和重用模块的方式设计和构建。

Сервис-ориентированная архитектура (SOA) – это метод разработки программного обеспечения, который использует программные компоненты, называемые сервисами, для создания бизнес-приложений. Каждый сервис предоставляет бизнес-возможности, и сервисы также могут взаимодействовать друг с другом на разных платформах и языках. Разработчики применяют SOA для многократного использования сервисов в различных системах или объединения нескольких независимых сервисов для выполнения сложных задач.
面向服务架构(SOA)是一种软件开发方法,通过使用称为服务的软件组件来创建业务应用程序。每个服务都提供业务功能,并且服务之间可以在不同的平台和语言上交互。开发人员使用SOA来在各种系统中重复利用服务,或者将多个独立服务组合以完成复杂任务。

Плюсы SOA
SOA的优点

Минусы:

2. Особенности, схожесть и отличие ssl и tls
ssl和tls的特点、异同

SSL:

TLS:

Безопасность транспортного уровня (TLS) является преемником протокола SSL. TLS — это улучшенная версия SSL. Он работает почти так же, как SSL, используя шифрование для защиты передачи данных и информации. Эти два термина часто взаимозаменяемы в отрасли, хотя SSL по-прежнему широко используется.
传输层安全协议(TLS)是SSL协议的继任者。TLS是SSL的改进版本,其工作原理几乎与SSL相同,利用加密技术保护数据和信息的传输。这两个术语在行业中经常被互换使用,尽管SSL仍被广泛使用。

Самое фундаментальное различие между этими протоколами заключается в том, как они устанавливают соединения.
这两个协议之间最根本的区别在于它们如何建立连接。

TLS-сертификат SSL-сертификат
Сертификаты TLS также известны как «безопасность уровня передачи».
TLS证书也称为“传输层安全”。
SSL-сертификаты также известны как Secure Sockets Layer.
SSL证书也称为“安全套接层”。
По сравнению с SSL, TLS — более простой протокол.
与SSL相比,TLS是一种更简单的协议。
SSL — более сложный для реализации протокол, чем TLS.
SSL是一种比TLS实现更复杂的协议。
TLS имеет четыре версии, из которых версия TLS 1.3 является последней.
TLS有四个版本,其中TLS 1.3是最新版本。
Принимая во внимание, что SSL имеет три версии, из которых SSL 3 0 является последней.
SSL有三个版本,其中SSL 3.0是最后一个版本。
Протокол TLS обеспечивает более высокий уровень безопасности, чем SSL.
TLS协议提供比SSL更高的安全级别。
Все версии протокола SSL сравнительно подвержены уязвимостям.
SSL的所有版本相比之下都更容易受到漏洞攻击。
Протокол TLS был выпущен в 1999 году.
TLS协议发布于1999年。
Между тем, SSL v2.0 был выпущен в 1995 году и v3.0 в 1996 году.
而SSL v2.0发布于1995年,SSL v3.0发布于1996年。
TLS поддерживает Fortezza (алгоритм)
TLS支持Fortezza算法。
SSL не поддерживает алгоритм Fortezza.
SSL不支持Fortezza算法。
Сертификаты TLS имеют сложный процесс проверки
TLS证书具有复杂的验证过程。
Сертификаты SSL предлагают простой процесс проверки.
SSL证书的验证过程较为简单。

TLS лучше, чем SSL.
TLS优于SSL。

В значительной степени из-за известных уязвимостей безопасности протокол SSL устарел.
由于已知的安全漏洞,SSL协议已被废弃。

Самые последние версии TLS также обеспечивают повышение производительности и другие улучшения.
TLS的最新版本还提供了性能提升和其他改进。

TLS не только более безопасен и производителен, но и поддерживается большинством современных веб-браузеров. Например, Google Chrome давно прекратил поддержку SSL 3.0, а большинство основных браузеров планируют прекратить поддержку TLS 1.0 и TLS 1.1 к 2020 году.
TLS不仅更加安全和高效,还得到了大多数现代网页浏览器的支持。例如,Google Chrome早已停止支持SSL 3.0,而大多数主流浏览器计划于2020年前后停止支持TLS 1.0和TLS 1.1。

3. spring data rest сервис к репозиторию
spring data Rest服务到存储库

@Entity
@Data
public class WebsiteUser {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private String email;
}

Репозиторий для доступа к бд:

@RepositoryRestResource(collectionResourceRel = "users", path = "users")
public interface UserRepository extends PagingAndSortingRepository<WebsiteUser, Long> {
    List<WebsiteUser> findByName(@Param("name") String name);
}

Класс запуска приложения:

@SpringBootApplication
public class SpringDataRestApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringDataRestApplication.class, args);
    }
}

4. (Alternative) Дан Spring Data Rest репозиторий с 1 методом public, который наследует crudrepository. Сделать так, чтобы все методы паблик стали доступны
(替代方案)给定一个带有 1 个公共方法的 Spring Data Rest 存储库,该存储库继承 crudrepository。使所有公共方法可用

Добавляем в application.properties:
添加到application.properties:

spring.data.rest.detected-stratagy=annotation

Далее навешиваем на все public методы аннотацию @RestResource
接下来,我们将@RestResource注释添加到所有公共方法。

@Repository
public interface CarRepository extends Repository<Car, Long> {
    @RestResource(exported = false)
    public Car save(Car car);
}

Или же можно просто в application.properties указать:
或者您可以简单地在 application.properties 中指定:

spring.data.rest.detected-stratagy=default

Вариант 7

1. Создание контроллера в спринг
在 Spring 中创建控制器

См. Вариант 4 Особенности разработки RESTful на Spring

2. Криптография в веб приложениях
Web 应用程序中的密码学

Сертификаты - Используются для проверки принадлежности открытого ключа его реальному владельцу.
证书——用于验证公钥是否属于其真实所有者。

Сначала клиент устанавливает соединение с сервером и настраивает ключи для шифрования передаваемых данных. Он отправляет информацию о себе, какие поддерживает шифрования и случайное число.
首先,客户端与服务器建立连接,并设置用于加密传输数据的密钥。客户端会发送自己的信息,包括支持的加密方式和一个随机数。

После чего сервер делает то же самое, только выбирает какое шифрование использовать.
接着,服务器执行类似操作,但选择将要使用的加密方式。

Вся суть в том что это работает на открытом и закрытом ключе. Закрытый ключ хранится у клиента и сервера. А открытый доступен всем, даже злоумышленнику, если он его украдет. Через открытый ключ происходит шифрование, а через закрытый дешифровка.
整个过程的核心在于使用公钥和私钥。私钥由客户端和服务器各自保管,而公钥是公开的,甚至可能被恶意攻击者获取。加密通过公钥进行,而解密则通过私钥完成。

То есть, как только Клиент и Сервер обмениваются своими ключами - это происходит не зашифровано. А уже данные, когда начинают обмениваться - уже происходит шифрование их.
也就是说,当客户端和服务器交换各自的密钥时,这一过程并未加密。而之后开始交换的数据则会通过加密保护。

Так работает SSL/TSL поверх обычно http протокола. -> https
这就是SSL/TSL在普通HTTP协议(http)上的工作方式 -> https

3. Jax-rs казино Jax-rs Jax-rs 赌场 Jax-rs

@Data
public class SlotMachine {
    private Long id;
    private Double winChanse;
    private Double getMany;
    private Double priceOneGame;
    private Double jackpot;
}
@Data
public class ResultGame {
    private Long id;
    private Long slotMachineId;
    private Boolean win;
    private Boolean jackpot;
    private Double bet;
    private Double winSum;
}

@Path("/slots")
public class SlotMachineService {
    
    private Repository rep = new Repository();
    
    private SlotMachineGameService game = new SlotMachineGameService();
    
    @POST
    @Consumes("application/json")
    public SlotMachine createSlotMachine(SlotMachine slotMachine) {
        return Mapper.mapSlotMachine(rep.createSlotMachine(Mapper.mapSlotMachineEntity(slotMachine)));
    }

    @GET
    @Produces("application/json")
    public List<SlotMachine> getSlotMachines() {
        return rep.getSlotMachines().stream().map(Mapper::mapSlotMachine).collect(Clollection.toList());
    }
    
    @GET
    @Path("{id}")
    @Produces("application/json")
    public SlotMachine getSlotMachine(@PathParam("id") Long id) {
        return Mapper.mapSlotMachine(rep.getSlotMachine(id));
    }

    @PUT
    @Path("{id}")
    @Consumes("application/json")
    public ResultGame betSlotMachine(@PathParam("id") Long id, @QueryParam("bet") Double bet) {
        return game.initGame(id, bet);
    }

    @GET
    @Path("{id}/games/{gameId}")
    @Produces("application/json")
    public ResultGame getSlotMachine(@PathParam("id") Long id, @PathParam("gameId") Long gameId) {
        return game.getGameInSlotMachine(id, gameId);
    }

    @DELETE
    @Path("{id}")
    @Consumes("application/json")
    public void deleteSlotMachine(@PathParam("id") Long id) {
        rep.deleteSlotMachine(id);
    }
}

Вариант 8

1. Jax-rs ключевые моменты
Jax-rs 要点

Jax-rs - Спецификация API для разработки веб сервисов Особенности:
Jax-rs——Web 服务开发 API 规范特点:

Основные аннотации:
重点说明:

Вспомогательные аннотации:
辅助注解:

Порядок разработки сервиса на JAX-RS:
在JAX-RS上开发服务的顺序:

Описание представления ресурса.
资源呈现的描述。

2. Spring data rest особенности отличия от spring mvc rest
Spring Data Rest 与 Spring MVC Rest 的区别

Основные особенности Spring Data Rest:

Отличия от Spring MVC REST:
与 Spring MVC REST 的区别:

3. Управление банкоматом на сервлетах
使用 servlet 管理 ATM

@WebServlet(name = "AtmServlet", urlPatterns = "/atm")
public class AtmServlet extends HttpServlet {

    private AtmService atmService = new AtmService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        long user_id = request.getParameter("user_id");
        long balance = atmService.getBalance(user_id); // узнать баланс
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        long user_id = request.getParameter("user_id");
        long sum = request.getParameter("sum");
        atmService.addBanknotes(user_id, sum); // положить наличные
    }

    @Override
    protected void doDelete(HttpServletRequest request, HttpServletResponse response) {
        long user_id = request.getParameter("user_id");
        long sum = request.getParameter("sum");
        atmService.getCash(user_id); // снять наличные
    } 
}

Вариант 9

1. Понятие ресурса в RESTful. Виды ресурсов
RESTful 中资源的概念。资源类型

Ресурс — это ключевая абстракция, на которой концентрируется протокол HTTP: это объект с типом, связанными данными, отношениями с другими ресурсами и набором методов, которые с ним работают.
资源是HTTP协议的关键抽象:它是一个具有类型、相关数据、与其他资源的关系以及一组操作这些资源的方法的对象。

Он похож на экземпляр объекта в ООП языке, с той разницей, что для ресурса определено только несколько стандартных методов (соответствующих стандартным методам HTTP: GET, POST, PUT и DELETE), а экземпляр объекта обычно имеет много методов.
它类似于面向对象编程语言中的对象实例,区别在于资源只定义了少数几个标准方法(对应于HTTP的标准方法:GET、POST、PUT和DELETE),而对象实例通常有许多方法。

На ресурс указывает URI.
资源由URI标识。

Два вида ресурсов:
资源有两种类型:

Метод
方法
Ресурс, манипулирующий данными
操作数据的资源
https://api.example.com/collection
Ресурс, выполняющий операции
执行操作的资源
https://api.example.com/clusters/1234/create-vm
POST   Вызывает операцию, интерфейс к которой предоставляет ресурс
调用由资源提供的操作接口
GET Возвращает объект в теле ответа
返回响应体中的对象
Возвращает статус асинхронной операции в теле ответа
返回响应体中的异步操作状态
PUT Загружает объект из тела запроса на ресурс
从请求体中加载对象到资源
 
PATCH Обновляет какую-либо часть содержимого ресурса в соответствии с данными в теле запроса
根据请求体中的数据更新资源的部分内容
 
DELETE Удаляет содержимое ресурса.
删除资源的内容
Отменяет асинхронную операцию
取消异步操作
  Последующий запрос GET вернёт HTTP 404.
后续的GET请求将返回HTTP 404错误
 

2. KeyStore и TrustStore в Java. Утилита keytool
Java 中的 KeyStore 和 TrustStore。密钥工具实用程序

Keystore Truststore
Хранятся приватные ключи и сертификаты (клиентские или серверные)
存储私钥和证书(客户端或服务器端)
Хранятся доверенные сертификаты (корневые самоподписанные СА root)
存储信任的证书(根自签名的根证书颁发机构)
Необходим для настройки SSL на сервере
用于配置服务器上的SSL
Необходим для успешного подключения к серверу на клиентской стороне
用于客户端成功连接到服务器
Клиент будет хранить свой приватный ключ и сертификат в keystore
客户端将把私钥和证书存储在keystore中
Сервер будет валидировать клиента при двусторонней аутентификации на основании сертификатов в truststore
服务器将在双向认证时根据truststore中的证书验证客户端
Используется API 使用API
javax.net.ssl.keyStore
Используется API 使用API
javax.net.ssl.trustStore

Keytool - утилита предназначена для работы с хранилищами JKS (Java KeyStore): может генерировать пары открытый ключ / закрытый ключ и сохранять их в хранилище ключей. Позволяет:
Keytool是一个用于操作JKS(Java KeyStore)存储库的工具:可以生成公钥/私钥对并将其保存在密钥库中。它可以:

И многое другое (см -help)
以及更多功能(请参见 -help)。

3. Написать веб-сервис на JAX-RS, который управляет шлагбаумом
在 JAX-RS 中编写一个控制屏障的 Web 服务

@Data
public class Barrier {
    private String address;
    private Boolean status;
}

@Path("/barriers")
public class BarrierService {

    private Repository rep = new Repository();
    
    @POST
    @Consumes("application/json")
    public Barrier createBarrier(Barrier barrier) {
        return Mapper.mapBarrier(rep.createBarrier(Mapper.mapBarrierEntity(barrier)));
    }

    @GET
    @Produces("application/json")
    public List<Barrier> getBarriers() {
        return rep.getBarriers().stream().map(Mapper::mapBarrier).collect(Clollection.toList());
    }

    @GET
    @Path("{id}")
    @Produces("application/json")
    public Barrier getBarrier(@PathParam("id") Long id) {
        return Mapper.mapBarrier(rep.getBarrier(id));
    }

    @PUT
    @Path("{id}/open")
    @Consumes("application/json")
    public void open(@PathParam("id") Long id) {
        rep.openBarrier(id);
    }

    @PUT
    @Path("{id}/close")
    @Consumes("application/json")
    public void close(@PathParam("id") Long id) {
        rep.closeBarrier(id);
    }

    @DELETE
    @Path("{id}")
    @Consumes("application/json")
    public void deleteBarrier(@PathParam("id") Long id) {
        rep.deleteBarrier(id);
    }

Вариант 10

1. Языки спецификации веб-сервисов
Web 服务规范语言

WSDL (англ. Web Services Description Language) — язык описания веб-сервисов и доступа к ним, основанный на языке XML.
WSDL(Web Services Description Language,Web服务描述语言)是基于XML语言的Web服务描述和访问语言。

Каждый документ WSDL 1.1 можно разбить на следующие логические части:
每个WSDL 1.1文档可以分为以下逻辑部分:

  1. определение типов данных (types) — определение вида отправляемых и получаемых сервисом XML-сообщений
    数据类型定义(types)— 定义Web服务发送和接收的XML消息的类型。
  2. элементы данных (message) — сообщения, используемые web-сервисом
    数据元素(message)— Web服务使用的消息。
  3. абстрактные операции (portType) — список операций, которые могут быть выполнены с сообщениями
    抽象操作(portType)— 列出可以对消息执行的操作。
  4. связывание сервисов (binding) — способ, которым сообщение будет доставлено
    服务绑定(binding)— 消息传递的方式。

Пример:

<mesaage name- ExecuteDeliveryRequestResponse">
    <part name-"parameters" element-"tns:ExecuteDeliveryRequestReaponse"/> 
  </message><portType name-"TurtlebotPublishersInterface"><operation name-"ExecuteCoffeeRequest">...</operation><operation name-"ExecuteDeliveryRequest">
    <input
    waam:Action-"https//soap.turtlebot.mybot.org/TurtlebotPublishereInterface/Ex
    message-"tns:Exec uteDeliveryRequest"/>
    <output
    vsam:Action-"http://soap.turtlebot.mybot.org/TurtlebotPublishersInterface/Ex
    message-"tns:ExecuteDeliveryRequestReaponse"/>
    </operation>
  </portType><binding name-"TurtlebotPublishersWebServicePortBinding"
  type-"tns : TurtlebotPublishersinterface">...</binding><service name-"TurtlebotPublishers<eb8ervice8ervice"><port name-"TurtlebotPublishersWebServicePort”
    binding-"tns:TurtlebotPublishersWebServicePortBinding">
      <soap:address location-"http://192.168.100.11:5555/turtlesim_publisher_ws"/>
    </port>
  </service>

Также см. 2 часть Варианта 1. Всё про SOAP

2. Архитектура spring web mvc
Spring Web MVC架构

MVC

3. Последовательность команд для конфигурации двунаправленного взаимодействия двух серверов приложений WildFly путём взаимного вызова Restful веб-сервисов
通过相互调用 Restful Web 服务来配置两个 WildFly 应用程序服务器之间双向交互的命令序列

Вариант 11

1. Структура SOA приложения
构建 SOA 应用程序

Любая SOA-система состоит из трёх видов “блоков”:
任何 SOA 系统都由三种类型的“块”组成:

2. Виды ресурсов в Spring Data REST
Spring Data REST 中的资源类型

3. Написать спецификацию (url’ы) сервиса по записи студентов на курсы.
为学生注册课程的服务编写规范 (url)。

paths:
    /students/{student-id}/courses:
        get:
            description: Get all available courses for student with id ={student-id}
            responses:
                '200':
                        description: List of courses
                        content:
                            application/json:
                                schema:
                                    $ref: '#/components/schemas/courses'
                '500':
                        description: Server error, try again later.
    /students/{student-id}/courses/{course-id}:
        post:
            description: enroll a student with id = {student-id} in the course with id = {course-id}
            responses:
                 '201':
                        description: Successful  enrollment
                 '404':
                        description: Unsuccessful  enrollment (bad id)
                 '500':
                        description: Server error, try again later.
        delete:
            Description: remove a student with id = {student-id} from the course with id = {course-id}
            parameters:
            - name: reason
                in: query
                description: reason for unsubscription
                schema:
                    type: string
            responses:
                 '200':
                        description: Successful  unsubscription
                 '404':
                        description: Unsuccessful  unsubscription (bad id)
                 '500':
                        description: Server error, try again later.

Вариант 12

1. Описание представления ресурса JAX-RS
JAX-RS 资源视图的描述

Путь (URL) к ресурсу (или к методу) задается с помощью аннотации @Path
使用 @Path 注释指定资源(或方法)的路径(URL)。

Описание представления ресурса:
资源呈现说明:

Например:

(...)
@XmlRootElement(name = "student")
@XmlAccessorType(XmlAccessType.FIELD)
public class Student {
    @XmlAttribute
    private Integer id;

    @XmlElement
    private String name;
    (...)
}
(...)
@XmlRootElement(name = "student")
@XmlAccessorType(XmlAccessType.FIELD)
public class Configuration {
    @XmlAttribute
    private Integer size;

    @XmlElement
    private List<Student> students;
    (...)
}

2. Криптография в приложениях на Java: особенности, стандарты, протоколы
Java 应用程序中的密码学:特性、标准、协议

Есть спецификация Java Cryptography Architecture (JCA, не путать с Java Connector Architecture!).
有一个称为 Java 加密架构(JCA,不要与 Java 连接器架构混淆!)的规范。

Протоколы – TLS / SSL.
协议——TLS/SSL。

См. 9.2

3. Restful-сервис на базе сервлета, реализующий механизм управления номеронабирателем телефонного аппарата. Номеронабиратель должен поддерживать функции локальных, междугородних и международных звонков, а также автодозвон
基于 Servlet 的 Restful 服务,实现管理电话拨号器的机制。拨号器必须支持本地、长途、国际电话以及自动拨号功能

public class PhoneServlet extends HttpServlet {
    static final long serialVersionUID = 1L;

    private Phones phones; // back-end bean
    
    // Executed when servlet is first loaded into container.

    @Override
    public void init() {
        this.phones = new Phones();
        novels.setSevletContext(this.getServletContext());
    }

    // GET /phones
    // GET /phones?id=1
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        //...
        sendResponse(response, phones.toXml(novel));
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse
    response) {
        String phone = request.getParameter("phone");
        //...
    }
}

Вариант 13

1. СОА - особенности, плюсы и минусы
SOA——特点、优点和缺点

2. SSL/TLS - особенности, отличия и сходства
SSL/TLS - 特性、差异和相似之处

3. Дан Spring Data Rest репозиторий с 1 методом public, который наследует crudrepository. Сделать так, чтобы все методы паблик стали доступны
给定一个带有 1 个公共方法的 Spring Data Rest 存储库,该方法继承 crudrepository。使所有公共方法可用