关于使用isTokenValid

一,首先介绍一下struts提供的有关令牌环的相关方法

请求有效性处理,使用令牌可以有效的防止重复提交。
protected String generateToken(HttpServletRequest request) 创建一个令牌.
protected boolean isTokenValid(HttpServletRequest request) 检查令牌是否有效
protected boolean isTokenValid(HttpServletRequest request,Boolean reset) 检查令牌是否有效,并且重置令牌(如果reset 是true)
protected void resetToken(HttpServletRequest request) 重置令牌
protected void saveToken(HttpServletRequest request) 添加令牌

二,利用struts的同步令牌机制

利用同步令牌(Token)机制来解决Web应用中重复提交的问题,Struts也给出了一个参考实现。

基本原理:

服务器端在处理到达的请求之前,会将请求中包含的令牌值与保存在当前用户会话中的令牌值进行比较,
看是否匹配。在处理完该请求后,且在答复发送给客户端之前,将会产生一个新的令牌,该令牌除传给
客户端以外,也会将用户会话中保存的旧的令牌进行替换。这样如果用户回退到刚才的提交页面并再次
提交的话,客户端传过来的令牌就和服务器端的令牌不一致,从而有效地防止了重复提交的发生。

if (isTokenValid(request, true)) { 
    // your code here 
    return mapping.findForward("success"); 
} else { 
    saveToken(request); 
    return mapping.findForward("submitagain"); 
}

Struts根据用户会话ID和当前系统时间来生成一个唯一(对于每个会话)令牌的,具体实现可以参考
TokenProcessor类中的generateToken()方法。

1. //验证事务控制令牌,<html:form >会自动根据session中标识生成一个隐含input代表令牌,防止两次提交
2. 在action中:

       //<input type="hidden" name="org.apache.struts.taglib.html.TOKEN" 
       // value="6aa35341f25184fd996c4c918255c3ae"> 
       if (!isTokenValid(request)) 
           errors.add(ActionErrors.GLOBAL_ERROR, 
                      new ActionError("error.transaction.token")); 
       resetToken(request); //删除session中的令牌

3. action有这样的一个方法生成令牌

   protected String generateToken(HttpServletRequest request) { 
       HttpSession session = request.getSession(); 
       try { 
           byte id[] = session.getId().getBytes(); 
           byte now[] = 
               new Long(System.currentTimeMillis()).toString().getBytes(); 
           MessageDigest md = MessageDigest.getInstance("MD5"); 
           md.update(id); 
           md.update(now); 
           return (toHex(md.digest())); 
       } catch (IllegalStateException e) { 
           return (null); 
       } catch (NoSuchAlgorithmException e) { 
           return (null); 
       } 
   }


在Java中使用JWT并添加白名单可以按以下步骤进行: 1. 创建一个白名单类,用于存储受信任的JWT令牌的有效值。您可以使用任何适合您的数据结构,例如Set、List或Map。 ```java public class Whitelist { private Set<String> tokenSet; public Whitelist() { tokenSet = new HashSet<>(); } public void addToken(String token) { tokenSet.add(token); } public boolean isTokenValid(String token) { return tokenSet.contains(token); } } ``` 2. 在JWT验证过程中,解析JWT令牌并提取其中的信息。您可以使用Java JWT库(例如jjwt)来解析和验证JWT。 ```java import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; public class JwtValidator { private Whitelist whitelist; public JwtValidator(Whitelist whitelist) { this.whitelist = whitelist; } public boolean validateToken(String token) { try { Claims claims = Jwts.parser().setSigningKey("your_secret_key").parseClaimsJws(token).getBody(); // 提取JWT中的信息,例如签发者、接收者等 String issuer = claims.getIssuer(); String audience = claims.getAudience(); // 检查JWT信息是否在白名单中 if (whitelist.isTokenValid(token)) { // JWT受信任,可以继续处理 return true; } else { // JWT不在白名单中,拒绝访问 return false; } } catch (Exception e) { // JWT验证失败,拒绝访问 return false; } } } ``` 3. 在您的应用程序中,创建一个Whitelist实例,并将受信任的JWT令牌添加到白名单中。 ```java Whitelist whitelist = new Whitelist(); whitelist.addToken("trusted_token_1"); whitelist.addToken("trusted_token_2"); JwtValidator validator = new JwtValidator(whitelist); // 要验证的JWT令牌 String token = "your_jwt_token"; // 执行JWT验证 boolean isValid = validator.validateToken(token); if (isValid) { // JWT受信任,进行后续处理 } else { // JWT无效或不在白名单中,拒绝访问 } ``` 请注意,在代码示例中,我们使用了Java JWT库(jjwt)来解析和验证JWT。您需要根据自己的项目依赖关系和需求进行适当的配置和引入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值