informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
RMI (Remote Method Invocation) adalah pemanggilan metode jarak jauh, yang merupakan ide dasar dalam pemrograman terdistribusi. Ada banyak teknologi untuk mengimplementasikan pemanggilan metode jarak jauh, seperti CORBA dan WebService, keduanya tidak bergantung pada setiap bahasa pemrograman. Java RMI adalah mekanisme pemanggilan metode jarak jauh yang dirancang khusus untuk lingkungan Java. Ini adalah Java API yang digunakan untuk mengimplementasikan panggilan prosedur jarak jauh (RPC) yang dapat secara langsung mengirimkan objek Java berseri dan mengumpulkan pengumpulan sampah. Implementasinya bergantung pada JVM, sehingga mendukung panggilan dari satu JVM ke JVM lainnya. Di Java RMI, server jarak jauh mengimplementasikan metode Java tertentu dan menyediakan antarmuka. Klien hanya perlu menyediakan parameter yang sesuai sesuai dengan definisi kelas antarmuka untuk memanggil metode jarak jauh. Objek dikodekan dan ditransmisikan melalui serialisasi. Jadi eksploitasi kerentanan deserialisasi yang biasa sering kali melibatkan RMI, dan itulah maksudnya. Protokol komunikasi yang diandalkan RMI adalah JRMP (Java Remote Message Protocol, Java Remote Message Exchange Protocol). Protokol ini disesuaikan untuk Java dan mengharuskan server dan klien harus ditulis dalam Java.
Proses interaksi dapat diringkas secara singkat sebagai:
Bereksperimenlah dengan layanan rmi sederhana dan panggil melalui klien
Ini adalah proyek sisi server yang terutama menyediakan antarmuka layanan rmi
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>rmi</artifactId>
- <groupId>com.et</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>rmi-server</artifactId>
-
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-data-jpa</artifactId>
- </dependency>
- <dependency>
- <groupId>com.et</groupId>
- <artifactId>rmi-common</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>com.h2database</groupId>
- <artifactId>h2</artifactId>
- <version>1.4.200</version>
- </dependency>
- </dependencies>
- </project>
- package com.et.rmi.server.config;
-
- import com.et.rmi.server.dao.CustomerRepository;
-
- import com.et.rmi.server.model.Customer;
- import com.et.rmi.server.service.CustomerServiceImpl;
- import om.et.rmi.common.CustomerService;
- import org.springframework.boot.ApplicationArguments;
- import org.springframework.boot.ApplicationRunner;
- import org.springframework.context.annotation.Bean;
- import org.springframework.remoting.rmi.RmiServiceExporter;
- import org.springframework.stereotype.Component;
-
- import java.util.logging.Logger;
-
- @Component
- public class RmiServerApplicationRunner implements ApplicationRunner {
-
- private CustomerRepository repository;
- private CustomerServiceImpl customerService;
- private final Logger log = Logger.getLogger(this.getClass().getName());
-
- public RmiServerApplicationRunner(CustomerServiceImpl customerService) {
- this.customerService = customerService;
- }
-
- @Override
- public void run(ApplicationArguments args) throws Exception {
- Customer customer1 = new Customer("John", "Smith", "123-456-7890");
- customerService.saveCustomer(customer1);
- customerService.getCustomers().forEach(System.out::println);
- }
-
- @Bean
- public RmiServiceExporter customerServiceExporter() {
- RmiServiceExporter customerServiceExporter = new RmiServiceExporter();
- customerServiceExporter.setRegistryPort(1199);
- customerServiceExporter.setServiceName("customerService");
- customerServiceExporter.setServiceInterface(CustomerService.class);
- customerServiceExporter.setService(customerService);
- log.info("Started RMI Server");
- return customerServiceExporter;
- }
- }
- package com.et.rmi.server.service;
-
- import com.et.rmi.server.dao.CustomerRepository;
-
- import com.et.rmi.server.mapper.CustomerMapper;
- import com.et.rmi.server.model.Customer;
- import om.et.rmi.common.CustomerDTO;
- import om.et.rmi.common.CustomerService;
- import org.springframework.stereotype.Service;
-
- import java.util.List;
-
- @Service
- public class CustomerServiceImpl implements CustomerService {
-
- private CustomerRepository repository;
-
- public CustomerServiceImpl(CustomerRepository repository) {
- this.repository = repository;
- }
-
- @Override
- public CustomerDTO getCustomer(long id) {
- Customer customer = repository.findById(id).orElseThrow(IllegalArgumentException::new);
- CustomerMapper mapper = new CustomerMapper();
- CustomerDTO dto = mapper.mapToDTO(customer);
- System.out.println(dto);
- return dto;
- }
-
- public List<Customer> getCustomers() {
- return (List<Customer>)repository.findAll();
- }
- public void saveCustomer(Customer customer) {
- repository.save(customer);
- }
- }
- package com.et.rmi.server.dao;
-
- import com.et.rmi.server.model.Customer;
- import org.springframework.data.repository.CrudRepository;
- import org.springframework.stereotype.Repository;
-
- import java.util.Optional;
-
- @Repository
- public interface CustomerRepository extends CrudRepository<Customer, Long> {
- Optional<Customer> findById(long id);
- }
- package com.et.rmi.server.mapper;
-
- import com.et.rmi.server.model.Customer;
-
- import om.et.rmi.common.CustomerDTO;
-
- public class CustomerMapper {
-
- public CustomerMapper() {
- }
-
- public CustomerDTO mapToDTO(Customer customer){
- CustomerDTO dto = new CustomerDTO();
- dto.setFirstName(customer.getFirstName());
- dto.setLastName(customer.getLastName());
- dto.setSocialSecurityCode(customer.getSocialSecurityCode());
- return dto;
- }
- }
- package com.et.rmi.server.model;
-
-
- import javax.persistence.*;
-
- @Entity
- @SequenceGenerator(name = "CUST_SEQ", initialValue = 1_000_001)
- public class Customer {
-
- @Id
- @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "CUST_SEQ")
- private long id;
- private String firstName;
- private String lastName;
- private String socialSecurityCode;
-
- public Customer() {
- }
-
- public Customer(String firstName, String lastName, String socialSecurityCode) {
- this.firstName = firstName;
- this.lastName = lastName;
- this.socialSecurityCode = socialSecurityCode;
- }
-
- public long getId() {
- return id;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getSocialSecurityCode() {
- return socialSecurityCode;
- }
-
- public void setSocialSecurityCode(String socialSecurityCode) {
- this.socialSecurityCode = socialSecurityCode;
- }
-
- @Override
- public String toString() {
- return "Customer{" +
- "id=" + id +
- ", firstName='" + firstName + ''' +
- ", lastName='" + lastName + ''' +
- ", socialSecurityCode='" + socialSecurityCode + ''' +
- '}';
- }
- }
spring.jpa.show-sql=false spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
Ini adalah proyek klien, yang sebagian besar memanggil layanan rmi jarak jauh.
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <parent>
- <artifactId>rmi</artifactId>
- <groupId>com.et</groupId>
- <version>1.0-SNAPSHOT</version>
- </parent>
- <modelVersion>4.0.0</modelVersion>
-
- <artifactId>rmi-cilent</artifactId>
-
- <properties>
- <maven.compiler.source>8</maven.compiler.source>
- <maven.compiler.target>8</maven.compiler.target>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <dependency>
- <groupId>com.et</groupId>
- <artifactId>rmi-common</artifactId>
- <version>1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
- </project>
- package com.et.rmi.client.controller;
-
-
- import om.et.rmi.common.CustomerDTO;
- import om.et.rmi.common.CustomerService;
- import org.springframework.http.MediaType;
- import org.springframework.http.ResponseEntity;
- import org.springframework.remoting.rmi.RmiProxyFactoryBean;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RequestMethod;
-
- @Controller
- @RequestMapping(value = "customers")
- public class CustomerController {
-
- private RmiProxyFactoryBean proxyFactoryBean;
-
- public CustomerController(RmiProxyFactoryBean proxyFactoryBean) {
- this.proxyFactoryBean = proxyFactoryBean;
- }
-
- @RequestMapping(value = "{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
- public ResponseEntity<CustomerDTO> getCustomer(@PathVariable long id) {
- CustomerService service = (CustomerService) proxyFactoryBean.getObject();
- CustomerDTO dto = service.getCustomer(id);
- return ResponseEntity.ok(dto);
- }
- }
- package com.et.rmi.client.config;
-
- import om.et.rmi.common.CustomerService;
- import org.springframework.context.annotation.Bean;
- import org.springframework.remoting.rmi.RmiProxyFactoryBean;
- import org.springframework.stereotype.Component;
- import org.springframework.util.StringUtils;
-
- import java.util.logging.Logger;
-
- @Component
- public class Config {
-
- public final Logger log = Logger.getLogger(this.getClass().getName());
-
- @Bean
- public RmiProxyFactoryBean proxyFactoryBean() {
- String remoteHost = System.getProperty("RMI_SERVER_HOST");
- if(StringUtils.isEmpty(remoteHost)){
- remoteHost="127.0.0.1";
- }
- String rmiHost = String.format("rmi://%s:1199/customerService", remoteHost);
- log.info("RMI Host name is " + rmiHost);
- RmiProxyFactoryBean proxy = new RmiProxyFactoryBean();
- proxy.setServiceInterface(CustomerService.class);
- proxy.setServiceUrl(rmiHost);
- proxy.afterPropertiesSet();
- return proxy;
- }
- }
server.port=8081
Ini adalah paket publik yang harus dirujuk oleh server dan klien.
- package om.et.rmi.common;
-
- import java.io.Serializable;
-
- public class CustomerDTO implements Serializable {
-
- private String firstName;
- private String lastName;
- private String socialSecurityCode;
-
- public CustomerDTO() {
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getSocialSecurityCode() {
- return socialSecurityCode;
- }
-
- public void setSocialSecurityCode(String socialSecurityCode) {
- this.socialSecurityCode = socialSecurityCode;
- }
-
- @Override
- public String toString() {
- final StringBuffer sb = new StringBuffer("CustomerDTO{");
- sb.append("firstName='").append(firstName).append(''');
- sb.append(", lastName='").append(lastName).append(''');
- sb.append(", socialSecurityCode='").append(socialSecurityCode).append(''');
- sb.append('}');
- return sb.toString();
- }
- }
- package om.et.rmi.common;
-
- public interface CustomerService {
- CustomerDTO getCustomer(long id);
- }
Di atas hanyalah beberapa kode kunci. Untuk semua kode, silakan lihat repositori kode di bawah ini.
{"firstName":"John","lastName":"Smith","socialSecurityCode":"123-456-7890"}