diff --git a/src/main/java/com/zhangmeng/tools/controller/HomeController.java b/src/main/java/com/zhangmeng/tools/controller/HomeController.java index 26aa1f2..9ee7533 100644 --- a/src/main/java/com/zhangmeng/tools/controller/HomeController.java +++ b/src/main/java/com/zhangmeng/tools/controller/HomeController.java @@ -162,7 +162,7 @@ public class HomeController implements Serializable { @Override public ListCell call(ListView playerListView) { Label label = new Label(); - label.setPrefWidth(100); + label.setPrefWidth(200); ListCell listCell = new ListCell<>() { @Override protected void updateItem(ResourcesUtils.Menu player, boolean b) { diff --git a/src/main/java/com/zhangmeng/tools/controller/JwtController.java b/src/main/java/com/zhangmeng/tools/controller/JwtController.java index 0bf8342..8d2a9de 100644 --- a/src/main/java/com/zhangmeng/tools/controller/JwtController.java +++ b/src/main/java/com/zhangmeng/tools/controller/JwtController.java @@ -1,47 +1,180 @@ package com.zhangmeng.tools.controller; +import com.zhangmeng.tools.utils.AlertUtils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; +import io.jsonwebtoken.impl.Base64Codec; +import io.jsonwebtoken.impl.crypto.EllipticCurveSigner; +import io.jsonwebtoken.impl.crypto.MacSigner; +import io.jsonwebtoken.impl.crypto.RsaSigner; +import io.jsonwebtoken.impl.crypto.Signer; +import io.jsonwebtoken.lang.Assert; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; -import javafx.scene.control.ComboBox; -import javafx.scene.control.TextField; +import javafx.geometry.Pos; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.util.Callback; +import lombok.extern.slf4j.Slf4j; +import javax.crypto.spec.SecretKeySpec; +import javax.xml.bind.DatatypeConverter; +import java.nio.charset.StandardCharsets; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; import java.util.Date; +import java.util.HashMap; import java.util.Map; +import static io.jsonwebtoken.SignatureAlgorithm.*; + /** * @author : 芊芊墨客 * @version : 1.0 * @date : 2023-02-18 16:21 */ +@Slf4j public class JwtController { + public static ObservableList list = FXCollections.observableArrayList(); + @FXML private TextField secret_key; + @FXML + private TextField key; + + @FXML + private TextField value; + @FXML private TextField expiration_time; @FXML private ComboBox comboBox; + @FXML + private ListView listView; + + @FXML + private TextArea token; + + private volatile Key KEY = null; + @FXML public void initialize() { - ObservableList list = FXCollections.observableArrayList(SignatureAlgorithm.values()); - comboBox.setItems(list); - comboBox.getSelectionModel().select(SignatureAlgorithm.ES256); + ObservableList list_1 = FXCollections.observableArrayList(); + list_1.add(HS256); + list_1.add(HS384); + list_1.add(HS512); + comboBox.setItems(list_1); + comboBox.getSelectionModel().select(HS256); + + listView.setPlaceholder(new Label("没有数据")); + listView.setItems(list); + listView.getSelectionModel().select(0); + listView.setFixedCellSize(40); + listView.setCellFactory(new Callback<>() { + @Override + public ListCell call(ListView dataListView) { + return new ListCell<>() { + @Override + protected void updateItem(Data data, boolean b) { + super.updateItem(data, b); + if (!b) { + HBox hBox = new HBox(15); + hBox.setAlignment(Pos.CENTER_RIGHT); + Label label = new Label(data.key + " -- " + data.value); + Button button = new Button("删除"); + hBox.getChildren().addAll(label, button); + this.setGraphic(hBox); + button.setOnAction(event -> { + log.info("删除...."); + list.remove(data); + }); + } + } + }; + } + }); + + token.setWrapText(true); } - private String generateToken(Map claims,String secret,long expiration,SignatureAlgorithm signatureAlgorithm) { + @FXML + public void add() { + log.info("添加..."); + if (key.getText().length() == 0) { + AlertUtils.alert_warning("key不能为空"); + return; + } + if (value.getText().length() == 0) { + AlertUtils.alert_warning("value不能为空"); + return; + } + Data data = new Data(key.getText(), value.getText()); + list.add(data); + //清空 + clear_input(key); + clear_input(value); + } + + public void clear_input(TextField textField){ + textField.setText(null); + } + + @FXML + public void gen_jwt_token() { + String secret; + if (secret_key.getText().length() == 0) { + if (key.getText().length() == 0) { + AlertUtils.alert_warning("key不能为空"); + return; + } + } + secret = secret_key.getText(); + Map map = new HashMap<>(); + list.forEach(i -> { + map.put(i.key, i.value); + }); + log.info("map:{}", map); + long expiration = 0; + if (expiration_time.getText().length() != 0) { + expiration = System.currentTimeMillis() + Long.parseLong(expiration_time.getText()); + } + SignatureAlgorithm signatureAlgorithm = comboBox.getSelectionModel().getSelectedItem(); + String res = generateToken(map, secret, expiration, signatureAlgorithm); + log.info("token:{}", res); + token.setText(res); + } + + private String generateToken(Map claims, String secret, long expiration, SignatureAlgorithm signatureAlgorithm) { Date expirationDate = new Date(System.currentTimeMillis() + expiration); - return Jwts.builder().setClaims(claims).setExpiration(expirationDate).signWith(signatureAlgorithm, secret).compact(); + return switch (signatureAlgorithm){ + case HS256, HS384, HS512 -> Jwts.builder().setClaims(claims).setExpiration(expirationDate).signWith(signatureAlgorithm, getKeyInstance(secret,signatureAlgorithm)).compact(); + case RS256, RS384, RS512, PS256, PS384, PS512 -> "暂不支持,敬请期待!"; + case ES256, ES384, ES512 -> "暂不支持,敬请期待!"; + default -> throw new IllegalStateException("Unexpected value: " + signatureAlgorithm); + }; } - private Claims getClaimsFromToken(String token,String secret) { + public Key getKeyInstance(String secret,SignatureAlgorithm signatureAlgorithm) { + if (KEY == null) { + synchronized (JwtController.class) { + // 双重锁 + if (KEY == null) { + byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secret); + KEY = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName()); + } + } + } + return KEY; + } + + private Claims getClaimsFromToken(String token, String secret) { Claims claims; try { claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody(); @@ -51,13 +184,43 @@ public class JwtController { return claims; } - public Boolean isTokenExpired(String token,String secret ) { + public Boolean isTokenExpired(String token, String secret) { try { - Claims claims = getClaimsFromToken(token,secret); + Claims claims = getClaimsFromToken(token, secret); Date expiration = claims.getExpiration(); return expiration.before(new Date()); } catch (Exception e) { return false; } } + + static class Data { + + private String key; + private Object value; + + public Data(String key, Object value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } + + public Data() { + } + } } diff --git a/src/main/java/com/zhangmeng/tools/controller/PlayerController.java b/src/main/java/com/zhangmeng/tools/controller/PlayerController.java index 1a83bc9..6974dcb 100644 --- a/src/main/java/com/zhangmeng/tools/controller/PlayerController.java +++ b/src/main/java/com/zhangmeng/tools/controller/PlayerController.java @@ -160,7 +160,7 @@ public class PlayerController { public ListCell call(ListView playerListView) { Label label = new Label(); - label.setPrefWidth(100); + label.setPrefWidth(200); ListCell listCell = new ListCell<>() { @Override protected void updateItem(ResourcesUtils.Player player, boolean b) { diff --git a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java index fecc74e..8d698ee 100644 --- a/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java +++ b/src/main/java/com/zhangmeng/tools/controller/SmallToolsController.java @@ -162,7 +162,7 @@ public class SmallToolsController { public ListCell call(ListView SmallToolsListView) { Label label = new Label(); - label.setPrefWidth(100); + label.setPrefWidth(200); ListCell listCell = new ListCell<>() { @Override protected void updateItem(ResourcesUtils.SmallTools SmallTools, boolean b) { diff --git a/src/main/resources/fxml/jwt.fxml b/src/main/resources/fxml/jwt.fxml index d141e38..e265658 100644 --- a/src/main/resources/fxml/jwt.fxml +++ b/src/main/resources/fxml/jwt.fxml @@ -3,25 +3,30 @@ + + -