存储 Java 个对象以供在使用 REST 的 WebApp 中进一步使用
Storing Java Objects For Further Use in WebApp That Uses REST
我有一个 web 应用程序,它为各自的功能进行 REST 调用。
比如说,我有一个 webapp,用户在其中注册并生成一个 KeyValue 对,这是在 ssh 期间进行身份验证所必需的。
现在这个 KeyValue 对是唯一的。
以及同一应用程序的另一个网页,我希望将这些 KeyValue 对作为 ppk 文件下载到 ssh。 "So that particular object is required"。
那么有没有办法存储对象。
我有一个 Postgres 数据库。
我有哪些可能的选择?
编辑: 我要存储的对象是第三方实现的库 JSch(它是 SSH-2 的完整实现),所以简单的键值对可能不是解决方案 I猜猜!)
如果您只想存储单个 key/value 对,则可以将其存储在会话中。如果你想存储多对,它的工作原理类似,但你会在会话中存储一个 collection 对。查看 HttpServletRequest.getSession() 了解详情。
如果您想在所有会话(其他用户、多个浏览器)之间共享 key/value 对,并且您只有一个网络服务器,只需使用静态变量。
如果你想在所有会话中共享 key/value 对并且你有多个服务器,那么你必须将它存储在数据库中(除非你考虑在服务器之间建立一些数据交换协议,但我怀疑这是你能做的最简单的事情)。
REST 是无状态的,因此无法在服务器端维护它!
您可以在服务器端创建一对密钥、值加密的token发送给客户端(浏览器)。
浏览器负责维护令牌并在需要时将其发送到服务器。
服务器可以解密令牌并检索原始密钥值对。
这将授予您客户端无法访问一对密钥值,因为它以客户端无法读取的方式加密。
注意如果您只需要在有限的时间内保留这些值,您还可以在令牌中加密与创建令牌或上次访问对应的值令牌。
此技术通常用于在客户端维护 "sessions" 仅使用 REST 调用但需要维护与当前用户相关的信息的应用程序。
您应该将键值对存储在数据库中。您可以使用redis 来更快地访问这对类似于缓存并根据您要设置的过期时间自动删除。
这与服务器在会话中缓存数据的方式相同。由于 REST API 是无日期的,因此您有这个替代方案应该可以正常工作。
因为我想要一个用于 ssh 进入我的机器的密钥,它由 JSch 的 KeyPair 对象提供。我确实通过序列化将它存储在我的数据库中,以供将来这样的应用程序使用,
@Entity
@Table(name ="keypairs")
public class KeyPairDomain {
private Long id;
private String username;
private byte[] byteObject;
private KeyPair keypair;
public KeyPairDomain(KeyPair kpair, String username) {
super();
this.setUsername(username);
this.keypair = kpair;
}
@Transient
public KeyPair getKeypair() {
return keypair;
}
public void setKeypair(KeyPair complexObject) {
this.setKeypair(complexObject);
ByteArrayOutputStream baos;
ObjectOutputStream out;
baos = new ByteArrayOutputStream();
try {
out = new ObjectOutputStream(baos);
out.writeObject(complexObject);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
this.byteObject = baos.toByteArray();
}
@Column(columnDefinition = "bytea")
public byte[] getByteObject() {
return byteObject;
}
public void setByteObject(byte[] byteObject) {
ByteArrayInputStream bais;
ObjectInputStream in;
try {
bais = new ByteArrayInputStream(byteObject);
in = new ObjectInputStream(bais);
setKeypair((KeyPair) in.readObject());
in.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
this.byteObject = byteObject;
}
public String getUsername() {
return username;
}
@Column(name = "username")
public void setUsername(String username) {
this.username = username;
}
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
但我在任何机器类型的 tmp 文件夹中存储了一个 ppk 文件。当需要时,我使用该位置来获取该密钥。
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@POST
@Path("/getCredentials")
public Response getCredentials(HashMap<String, String> userDetails) {
String username = userDetails.get("username");
File homedir = new File(System.getProperty("user.home"));
File file = new File(homedir, "credentials/" + username + "/Key.ppk");
System.out.println("File Path: "+file.getAbsolutePath());
System.out.println("File Name: "+file.getName());
return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", "attachment; filename=" +file.getName()).build();
}
我有一个 web 应用程序,它为各自的功能进行 REST 调用。
比如说,我有一个 webapp,用户在其中注册并生成一个 KeyValue 对,这是在 ssh 期间进行身份验证所必需的。
现在这个 KeyValue 对是唯一的。
以及同一应用程序的另一个网页,我希望将这些 KeyValue 对作为 ppk 文件下载到 ssh。 "So that particular object is required"。
那么有没有办法存储对象。
我有一个 Postgres 数据库。
我有哪些可能的选择?
编辑: 我要存储的对象是第三方实现的库 JSch(它是 SSH-2 的完整实现),所以简单的键值对可能不是解决方案 I猜猜!)
如果您只想存储单个 key/value 对,则可以将其存储在会话中。如果你想存储多对,它的工作原理类似,但你会在会话中存储一个 collection 对。查看 HttpServletRequest.getSession() 了解详情。
如果您想在所有会话(其他用户、多个浏览器)之间共享 key/value 对,并且您只有一个网络服务器,只需使用静态变量。
如果你想在所有会话中共享 key/value 对并且你有多个服务器,那么你必须将它存储在数据库中(除非你考虑在服务器之间建立一些数据交换协议,但我怀疑这是你能做的最简单的事情)。
REST 是无状态的,因此无法在服务器端维护它!
您可以在服务器端创建一对密钥、值加密的token发送给客户端(浏览器)。
浏览器负责维护令牌并在需要时将其发送到服务器。
服务器可以解密令牌并检索原始密钥值对。
这将授予您客户端无法访问一对密钥值,因为它以客户端无法读取的方式加密。
注意如果您只需要在有限的时间内保留这些值,您还可以在令牌中加密与创建令牌或上次访问对应的值令牌。
此技术通常用于在客户端维护 "sessions" 仅使用 REST 调用但需要维护与当前用户相关的信息的应用程序。
您应该将键值对存储在数据库中。您可以使用redis 来更快地访问这对类似于缓存并根据您要设置的过期时间自动删除。
这与服务器在会话中缓存数据的方式相同。由于 REST API 是无日期的,因此您有这个替代方案应该可以正常工作。
因为我想要一个用于 ssh 进入我的机器的密钥,它由 JSch 的 KeyPair 对象提供。我确实通过序列化将它存储在我的数据库中,以供将来这样的应用程序使用,
@Entity
@Table(name ="keypairs")
public class KeyPairDomain {
private Long id;
private String username;
private byte[] byteObject;
private KeyPair keypair;
public KeyPairDomain(KeyPair kpair, String username) {
super();
this.setUsername(username);
this.keypair = kpair;
}
@Transient
public KeyPair getKeypair() {
return keypair;
}
public void setKeypair(KeyPair complexObject) {
this.setKeypair(complexObject);
ByteArrayOutputStream baos;
ObjectOutputStream out;
baos = new ByteArrayOutputStream();
try {
out = new ObjectOutputStream(baos);
out.writeObject(complexObject);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
this.byteObject = baos.toByteArray();
}
@Column(columnDefinition = "bytea")
public byte[] getByteObject() {
return byteObject;
}
public void setByteObject(byte[] byteObject) {
ByteArrayInputStream bais;
ObjectInputStream in;
try {
bais = new ByteArrayInputStream(byteObject);
in = new ObjectInputStream(bais);
setKeypair((KeyPair) in.readObject());
in.close();
} catch (IOException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
this.byteObject = byteObject;
}
public String getUsername() {
return username;
}
@Column(name = "username")
public void setUsername(String username) {
this.username = username;
}
@Id
@GeneratedValue
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
但我在任何机器类型的 tmp 文件夹中存储了一个 ppk 文件。当需要时,我使用该位置来获取该密钥。
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_OCTET_STREAM)
@POST
@Path("/getCredentials")
public Response getCredentials(HashMap<String, String> userDetails) {
String username = userDetails.get("username");
File homedir = new File(System.getProperty("user.home"));
File file = new File(homedir, "credentials/" + username + "/Key.ppk");
System.out.println("File Path: "+file.getAbsolutePath());
System.out.println("File Name: "+file.getName());
return Response.ok(file, MediaType.APPLICATION_OCTET_STREAM)
.header("Content-Disposition", "attachment; filename=" +file.getName()).build();
}