контекст: < /strong>
Я работаю над приложением Spring Boot, и там я использую JWE - Tokens. При создании этих токенов я просматриваю данное DTO. В качестве примера генерация AccessToken выглядит следующим образом: < /p>
public Jwe generateAccessToken(AccessTokenDto dto) throws Exception {
return generateToken(
dto.getId().toString(),
Map.of(
"dto", dto,
"dtoClassName", dto.getClass().getName()
),
config.getAccessTokenExpiration()
);
}
private Jwe generateToken(String subject, Map claims, long expiration) throws Exception {
var claimSetBuilder = new JWTClaimsSet.Builder()
.subject(subject)
.issuer(config.getIssuer())
.issueTime(new Date())
.expirationTime(new Date(System.currentTimeMillis() + 1000 * expiration));
for (Map.Entry claimEntry : claims.entrySet()) {
if (claimEntry.getValue() instanceof String value) {
claimSetBuilder.claim(claimEntry.getKey(), value);
} else {
claimSetBuilder.claim(claimEntry.getKey(), serialise(claimEntry.getValue()));
}
}
return new Jwe(
claimSetBuilder.build(),
config.signingKey(),
config.encryptionKey()
);
}
private String serialise(Object dto) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(dto);
oos.close();
return Base64.getEncoder().encodeToString(baos.toByteArray());
}
< /code>
, в то время как сам accessTokendto выглядит следующим образом: < /p>
@Data
public class AccessTokenDto implements Serializable {
@ValidUserId
private UUID id;
@ValidUserRole
private Role role;
}
< /code>
Когда я позже хочу получить от уже успешно проанализированного JWE Я использую эти три метода: < /p>
public T toDto() throws IOException {
Class type = (Class) getDtoClass();
Object deserializedDto = deserialize();
if (!type.isInstance(deserializedDto)) {
return null;
}
return type.cast(deserializedDto);
}
private Class getDtoClass() throws IOException {
String className = (String) claims.getClaim("dtoClassName");
Class type = null;
try {
type = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new IOException("When deserialzing Token - No Class with Name: " + className);
}
return type;
}
private Object deserialize() {
Object serializedDto = claims.getClaim("dto");
if (!(serializedDto instanceof String)) {
return null;
}
byte[] data = Base64.getDecoder().decode(serializedDto.toString());
try {
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
Object obj = ois.readObject();
ois.close();
return obj;
} catch (Exception e) {
System.out.println("Error while deserializing token");
}
return null;
}
< /code>
Я знаю, что этот код работает, и я также знаю, что не должно быть проблемы, поскольку утверждение «dtoclassname» всегда правильно устанавливается при создании токена. (До тех пор, пока я кодирую метод для сгенерирования токенов.) Но IntelliJ дает мне это предупреждение о неконтролируемом актере, от которого я хотел бы избавиться.public T toDto() throws IOException {
Class type = (Class) getDtoClass();
Object deserializedDto = deserialize();
if (!type.isInstance(deserializedDto)) {
return null;
}
return type.cast(deserializedDto);
}
< /code>
My Trys для решения /обходного пути: < /strong>
я пережил немного с опционами < /p>
public Optional toDto() {
Class targetType = getDtoClass();
Object deserializedDto = deserialize();
if (!targetType.isInstance(deserializedDto)) {
return Optional.empty();
}
return Optional.of(targetType.cast(deserializedDto));
}
< /code>
обойти проблему, но это не очень хорошо, поскольку я хотел иметь возможность получить доступ к методам DTO, и это было невозможно. Также пробовали способы использования ISINSTANCE, но это не привело к ничего.>
Подробнее здесь: https://stackoverflow.com/questions/797 ... -a-generic
Любой способ проверить актерский состав на общий? ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1759507755
Anonymous
контекст: < /strong>
Я работаю над приложением Spring Boot, и там я использую JWE - Tokens. При создании этих токенов я просматриваю данное DTO. В качестве примера генерация AccessToken выглядит следующим образом: < /p>
public Jwe generateAccessToken(AccessTokenDto dto) throws Exception {
return generateToken(
dto.getId().toString(),
Map.of(
"dto", dto,
"dtoClassName", dto.getClass().getName()
),
config.getAccessTokenExpiration()
);
}
private Jwe generateToken(String subject, Map claims, long expiration) throws Exception {
var claimSetBuilder = new JWTClaimsSet.Builder()
.subject(subject)
.issuer(config.getIssuer())
.issueTime(new Date())
.expirationTime(new Date(System.currentTimeMillis() + 1000 * expiration));
for (Map.Entry claimEntry : claims.entrySet()) {
if (claimEntry.getValue() instanceof String value) {
claimSetBuilder.claim(claimEntry.getKey(), value);
} else {
claimSetBuilder.claim(claimEntry.getKey(), serialise(claimEntry.getValue()));
}
}
return new Jwe(
claimSetBuilder.build(),
config.signingKey(),
config.encryptionKey()
);
}
private String serialise(Object dto) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(dto);
oos.close();
return Base64.getEncoder().encodeToString(baos.toByteArray());
}
< /code>
, в то время как сам accessTokendto выглядит следующим образом: < /p>
@Data
public class AccessTokenDto implements Serializable {
@ValidUserId
private UUID id;
@ValidUserRole
private Role role;
}
< /code>
Когда я позже хочу получить от уже успешно проанализированного JWE Я использую эти три метода: < /p>
public T toDto() throws IOException {
Class type = (Class) getDtoClass();
Object deserializedDto = deserialize();
if (!type.isInstance(deserializedDto)) {
return null;
}
return type.cast(deserializedDto);
}
private Class getDtoClass() throws IOException {
String className = (String) claims.getClaim("dtoClassName");
Class type = null;
try {
type = Class.forName(className);
} catch (ClassNotFoundException e) {
throw new IOException("When deserialzing Token - No Class with Name: " + className);
}
return type;
}
private Object deserialize() {
Object serializedDto = claims.getClaim("dto");
if (!(serializedDto instanceof String)) {
return null;
}
byte[] data = Base64.getDecoder().decode(serializedDto.toString());
try {
ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(data));
Object obj = ois.readObject();
ois.close();
return obj;
} catch (Exception e) {
System.out.println("Error while deserializing token");
}
return null;
}
< /code>
Я знаю, что этот код работает, и я также знаю, что не должно быть проблемы, поскольку утверждение «dtoclassname» всегда правильно устанавливается при создании токена. (До тех пор, пока я кодирую метод для сгенерирования токенов.) Но IntelliJ дает мне это предупреждение о неконтролируемом актере, от которого я хотел бы избавиться.public T toDto() throws IOException {
Class type = (Class) getDtoClass();
Object deserializedDto = deserialize();
if (!type.isInstance(deserializedDto)) {
return null;
}
return type.cast(deserializedDto);
}
< /code>
My Trys для решения /обходного пути: < /strong>
я пережил немного с опционами < /p>
public Optional toDto() {
Class targetType = getDtoClass();
Object deserializedDto = deserialize();
if (!targetType.isInstance(deserializedDto)) {
return Optional.empty();
}
return Optional.of(targetType.cast(deserializedDto));
}
< /code>
обойти проблему, но это не очень хорошо, поскольку я хотел иметь возможность получить доступ к методам DTO, и это было невозможно. Также пробовали способы использования ISINSTANCE, но это не привело к ничего.>
Подробнее здесь: [url]https://stackoverflow.com/questions/79781962/any-way-to-check-a-cast-to-a-generic[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия