打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Token实现防重放

本文主要内容是使用token防重放的代码实现。

1. Token类

  1. package com.bean;  
  2.   
  3. public class Token {  
  4.     public static final String DEFAULT_TOKEN_NAME = "token";  
  5.       
  6.     private final String tokenName;  
  7.   
  8.     private final String tokenValue;  
  9.   
  10.     public Token(String tokenName,String tokenValue){  
  11.         this.tokenName = tokenName;  
  12.         this.tokenValue = tokenValue;  
  13.     }  
  14.     public String getTokenName() {  
  15.         return tokenName;  
  16.     }  
  17.   
  18.     public String getTokenValue() {  
  19.         return tokenValue;  
  20.     }  
  21. }  

2. TokenManager

  1. package com.util;  
  2.   
  3. import java.util.UUID;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpSession;  
  7.   
  8. import org.apache.commons.lang.StringUtils;  
  9.   
  10. import com.bean.Token;  
  11.   
  12. public class TokenManager {  
  13.   
  14.     public static final String SESSION_TOKEN_KEY = "$SESSIONTOKEN";  
  15.        
  16.     public static String generateToken(){  
  17.         return UUID.randomUUID().toString();  
  18.     }  
  19.       
  20.     public static boolean validToken(HttpServletRequest httpServletRequest){  
  21.         HttpSession httpSession = httpServletRequest.getSession();  
  22.         Token token = (Token) httpSession.getAttribute(SESSION_TOKEN_KEY);  
  23.         httpSession.removeAttribute(SESSION_TOKEN_KEY);  
  24.         if(token==null){  
  25.             return false;  
  26.         }  
  27.         String reqToken = httpServletRequest.getParameter(token.getTokenName());  
  28.         if(StringUtils.isNotEmpty(reqToken)&&reqToken.equals(token.getTokenValue())){  
  29.             return true;  
  30.         }  
  31.         return false;  
  32.     }  
  33. }  

3. TokenTag

  1. package com.tag;  
  2.   
  3.   
  4. import java.io.IOException;  
  5.   
  6. import javax.servlet.jsp.JspException;  
  7. import javax.servlet.jsp.tagext.TagSupport;  
  8.   
  9. import org.apache.commons.lang.StringUtils;  
  10.   
  11. import com.bean.Token;  
  12. import com.util.TokenManager;  
  13.   
  14. public class TokenTag extends TagSupport {  
  15.     private static final long serialVersionUID = 4596553712387968686L;  
  16.   
  17.     private String tokenName;  
  18.       
  19.     public String getTokenName() {  
  20.         return tokenName;  
  21.     }  
  22.   
  23.     public void setTokenName(String tokenName) {  
  24.         this.tokenName = tokenName;  
  25.     }  
  26.   
  27.     @Override  
  28.     public int doStartTag() throws JspException {  
  29.         try {  
  30.             pageContext.getOut().write(getTagBody());  
  31.         } catch (IOException e) {  
  32.             e.printStackTrace();  
  33.             throw new JspException(e.getMessage());  
  34.         }  
  35.         return SKIP_BODY;  
  36.     }  
  37.       
  38.     private String getTagBody() {  
  39.         String tokenValue = getToken();  
  40.         if(StringUtils.isEmpty(tokenName)){  
  41.             tokenName=Token.DEFAULT_TOKEN_NAME;  
  42.         }  
  43.         pageContext.getSession().setAttribute(TokenManager.SESSION_TOKEN_KEY,  
  44.                 new Token(tokenName, tokenValue));  
  45.         String inputToken = "<input type=\"hidden\" name = \""+tokenName+"\" value=\""+tokenValue+"\" />";  
  46.         return inputToken;  
  47.     }  
  48.   
  49.     private String getToken() {  
  50.         return TokenManager.generateToken();  
  51.     }  
  52.   
  53.     @Override  
  54.     public int doEndTag() throws JspException {  
  55.         return EVAL_PAGE;  
  56.     }  
  57. }  
4.base.tld
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://java.sun.com/xml/ns/jsee/web-jsptagLibrary_2_0.xsd"  
  4.     version="2.0">  
  5.     <tlibversion>1.0</tlibversion>  
  6.     <shortname>Base Tag</shortname>  
  7.   
  8.     <tag>  
  9.         <name>token</name>  
  10.         <tagclass>com.tag.TokenTag</tagclass>  
  11.   
  12.         <bodycontent>empty</bodycontent>  
  13.         <attribute>  
  14.             <name>tokenName</name>  
  15.             <required>false</required>  
  16.             <rtexprvalue>true</rtexprvalue>  
  17.         </attribute>  
  18.     </tag>  
  19. </taglib>  

5.在jsp页面中使用:

  1. <form action="test" method="post">  
  2. t;%--<base:token/>  
  3.   <base:token tokenName="testToken" /> --%>  
  4.   <base:token tokenName="<%=UUID.randomUUID().toString() %>" />  
  5.   <input type="submit" value="提交" />  
  6. </form>   

6. 后台逻辑校验Token

  1. package com.servlet;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. import com.util.TokenManager;  
  11.   
  12. public class TestServlet  extends HttpServlet{  
  13.     private static final long serialVersionUID = 8421484630895424911L;  
  14.   
  15.     @Override  
  16.     protected void doPost(HttpServletRequest req, HttpServletResponse resp)  
  17.             throws ServletException, IOException {  
  18.         System.out.println(TokenManager.validToken(req));  
  19.     }  
  20. }  

该实现支持在jsp页面中不指定tokenName,指定tokenName,随机生成tokenName;

业务逻辑无需关心token的存储方式,如需校验,只需要把req传给TokenManager即可。








本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Apache Shiro实现单点登录SSO | 沐风
Spring MVC防御CSRF、XSS和SQL注入攻击
表单重复提交的处理方案(其中服务器处理 模拟struts)
在服务器端避免表单的重复提交
防止表单重复提交
SpringBoot 整合 Spring Security 实现安全认证【SpringBoot系列9】
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服