`

JSP & Java 实现 Token (without use Struct)--控制刷新(F5) 和 回格(Backspace)

    博客分类:
  • Java
 
阅读更多

1. JSP Setting as below:

  <body>

  <form id ="fromName" ...>

  ...

  <input type="hidden" id="htmlTOKEN" name="htmlTOKEN" value="${htmlTOKEN}"/>

  ....

 </form>

 ....

  

2. Java (Constants) -- CommonConstants.java

public class CommonConstants {
    .....
    public static final String TRANSACTION_TOKEN_KEY = "actionTOKEN";
    public static final String TOKEN_KEY = "htmlTOKEN";
   ......
}

  

 

  3. Java (Token method) -- Named as TokenProcessor.java

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import com.requestprocessing.WorkContext;
import com.requestprocessing.servlet.ServletWorkContext;
import com.common.module.CommonConstants;

public class TokenProcessor
{

    private static TokenProcessor instance = new TokenProcessor();
    private long previous;
    protected TokenProcessor()
    {
    }

    public static TokenProcessor getInstance()
    {
        return instance;
    }

    public synchronized boolean isTokenValid(WorkContext oCTX, String action)
    {
    	if(action == null){
    		return isTokenValid(oCTX, false);
    	}else{
    		return isTokenValid(oCTX, action, false);
    	}
    }

    public synchronized boolean isTokenValid(WorkContext oCTX, boolean reset)
    {
    	if(oCTX == null){
    		return false;
    	}
    	    	
    	String saved = (String)oCTX.getUserData(CommonConstants.TRANSACTION_TOKEN_KEY);
    	if(saved == null){
    		return false;
    	}
    	if(reset){
    		resetToken(oCTX);
    	}
    	
    	String token = (String) oCTX.getRequestParameter(CommonConstants.TOKEN_KEY);
    	if( token == null || ("").equals(token)){
    		//return false;
    		return true;
    	}else{
    		return saved.equals(token);
    	}       
    }

    public synchronized boolean isTokenValid(WorkContext oCTX, String action, boolean reset)
    {
    	if(oCTX == null){
    		return false;
    	}
    	    	
    	String saved = (String)oCTX.getUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY);
    	if(saved == null){
    		return false;
    	}
    	if(reset){
    		resetToken(oCTX, action);
    	}
    	
    	String token = (String) oCTX.getRequestParameter(CommonConstants.TOKEN_KEY);
    	if( token == null || ("").equals(token)){
    		//return false;
    		return true;
    	}else{
    		return saved.equals(token);
    	}       
    }
    
    public synchronized void resetToken(WorkContext oCTX)
    {
    	if(oCTX == null){
    		return;
    	}else{
    		oCTX.removeUserData(CommonConstants.TRANSACTION_TOKEN_KEY);
    		return;
    	}
    }
    
    public synchronized void resetToken(WorkContext oCTX, String action)
    {
    	if(oCTX == null){
    		return;
    	}else{
    		if(action == null){
    			oCTX.removeUserData(CommonConstants.TRANSACTION_TOKEN_KEY);
    		}else{
    			oCTX.removeUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY);
    		}
    		return;
    	}
    }

    public synchronized void saveToken(WorkContext oCTX)
    {    	
        String token = generateToken(oCTX);
        if(token != null){
            oCTX.putUserData(CommonConstants.TRANSACTION_TOKEN_KEY, token);
        	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(CommonConstants.TRANSACTION_TOKEN_KEY));
        }  
    }
        
    public synchronized void saveToken(WorkContext oCTX, String action)
    {    	
        String token = generateToken(oCTX);
        
        if(token != null && action == null){
        	oCTX.putUserData( CommonConstants.TRANSACTION_TOKEN_KEY, token);
        	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(CommonConstants.TRANSACTION_TOKEN_KEY));
        }else{
            oCTX.putUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY, token);
        	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY));
        }
    }


    public synchronized String generateToken(WorkContext oCTX)
    {
    	HttpServletRequest request = ((ServletWorkContext)oCTX).getHttpServletRequest();
        HttpSession session = request.getSession();
        return generateToken(session.getId());
    }

    public synchronized String generateToken(String id)
    {
        MessageDigest md;
        long current = System.currentTimeMillis();
        try{
        	if(current == previous)
        		current++;
        	previous = current;
        	byte now[] = (new Long(current)).toString().getBytes();
        	md = MessageDigest.getInstance("MD5");
        	md.update(id.getBytes());
        	md.update(now);
        	return toHex(md.digest());

        } catch (IllegalStateException e) { 
            return (null); 
        } catch (NoSuchAlgorithmException e) { 
            return (null); 
        } 
    }

    private String toHex(byte buffer[])
    {
        StringBuffer sb = new StringBuffer(buffer.length * 2);
        for(int i = 0; i < buffer.length; i++)
        {
            sb.append(Character.forDigit((buffer[i] & 0xf0) >> 4, 16));
            sb.append(Character.forDigit(buffer[i] & 0xf, 16));
        }

        return sb.toString();
    }
}

 

  4. Java BaseProcessor (BaseProcessor.java)

public class BaseProjectRoomProcessor {
   ......
   public String process(WorkContext oCTX){
   ......
   }


    protected boolean validateToken(WorkContext oCTX, String action){
        TokenProcessor token = TokenProcessor.getInstance();
        if(!token.isTokenValid(oCTX, action)){
        	token.resetToken(oCTX, action);
        	return false;
        } else {
        	token.saveToken(oCTX, action);
        	return true;
        }
    }
}

 5. Java BaseResponseProcessor (BaseResponseProcessor.java)

public class BaseProjectRoomResponseProcessor{
   ......
   public String process(WorkContext oCTX){
   ......
   }
    protected void initToken(WorkContext oCTX, String action){
    	String tokenId = null;
    	TokenProcessor token = TokenProcessor.getInstance();
    	if(action == null){
    		tokenId = (String)oCTX.getUserData(CommonConstants.TRANSACTION_TOKEN_KEY);
            if(tokenId == null){
            	token = TokenProcessor.getInstance();
            	token.saveToken(oCTX);
            	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(CommonConstants.TRANSACTION_TOKEN_KEY));
            }else{
            	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(CommonConstants.TRANSACTION_TOKEN_KEY));
            }
    	}else{
    		tokenId = (String)oCTX.getUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY);
            if(tokenId == null){
            	token = TokenProcessor.getInstance();
            	token.saveToken(oCTX, action);
            	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY));
            }else{
            	oCTX.putRequestData(CommonConstants.TOKEN_KEY, oCTX.getUserData(action + CommonConstants.TRANSACTION_TOKEN_KEY));
            }
    	}
    	
    }
}

 

6. Java YourResponseProcessor (YourResponseProcessor.java)

public class XXXXResponseProcessor extends BaseResponseProcessor {
......
......
protected String doAction(WorkContext oCTX) throws Exception {
......


        if (xxxx) {        	
              	this.initToken(oCTX, "Your Action Name");
        }
......


}

 

 

7. Java YourActionProcessor(YourActionProcessor.java)

public class XXXXProcessor extends BaseProcessor{
......

......

protected String doAction(WorkContext oCTX) throws Exception {
.....
        String action = (String)oCTX.getRequestParameter(ProgressSummaryConstants.ACTION);
        if(!this.validateToken(oCTX, action)){ 
        	return ProgressSummaryConstants.DONE;
        }

......
}

 

分享到:
评论

相关推荐

    Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档.rar

    Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档.rar Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档.rar Java开发案例-springboot-34-整合Sa-Token实现权限认证-源代码+文档....

    Java开发案例-springboot-整合Sa-Token-Quick-Login插件实现快速登录认证-源代码+文档.rar

    Java开发案例-springboot-整合Sa-Token-Quick-Login插件实现快速登录认证-源代码+文档.rar Java开发案例-springboot-整合Sa-Token-Quick-Login插件实现快速登录认证-源代码+文档.rar Java开发案例-springboot-整合Sa...

    token-provider-1.0.1-API文档-中英对照版.zip

    标签:apache、kerby、token、provider、中英对照文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明...

    springboot整和jwt、shiro、redis实现token自动刷新

    下面将详细介绍如何在Spring Boot中整合JWT、Shiro和Redis实现Token自动刷新。 JWT是一种轻量级的身份验证机制,它通过在客户端存储一个包含用户信息的令牌,每次请求时都将这个令牌发送到服务器进行验证。JWT由三...

    spark-token-provider-kafka-0-10_2.12-3.0.0.jar

    spark3.0.0版本对接kafka数据源需要的jar包,最新的版本导致maven的阿里云仓库不能直接下载下来,所以需要手动导入jar包进行操作,有需要的朋友可以免费下载

    Android OkHttp实现全局过期token自动刷新示例

    Android OkHttp实现全局过期token自动刷新示例 本篇文章主要介绍了Android OkHttp实现全局过期token自动刷新示例,解决了在Android开发中常见的问题,即如何在请求某个接口时自动刷新token。 首先,我们需要了解...

    Java如何做到无感知刷新token含示例代码(值得珍藏)

    【Java实现无感知刷新Token详解】 在Web应用中,用户身份验证通常依赖于Token机制,如JWT(JSON Web Tokens)。然而,Token具有有效期限制,过期后可能导致用户被迫重新登录,影响用户体验。为了解决这一问题,我们...

    异步&同步加载树节点----zTree(一)

    3. `callback`: 包含各种回调函数,如`beforeAsync`(异步加载前的回调)、`onAsyncSuccess`(加载成功后的回调)和`onAsyncError`(加载失败的回调)。 例如,一个基本的zTree异步加载配置可能如下所示: ```...

    java token验证和注解方式放行

    文件列表中的"token"可能包含的是实现这些功能的Java类和配置文件。在实际应用中,这些类可能包括Token解析器、验证器,以及与Spring Security集成的配置类。用户只需将这些文件导入项目并正确配置Maven依赖,即可...

    token-provider-1.0.1-API文档-中文版.zip

    标签:apache、kerby、token、provider、中文文档、jar包、java; 使用方法:解压翻译后的API文档,用浏览器打开“index.html”文件,即可纵览文档内容。 人性化翻译,文档中的代码和结构保持不变,注释和说明精准...

    4.3鉴权&授权-Token1

    使用这些packages,可以轻松地生成和验证Token,从而实现鉴权和授权。 在Startup.cs文件中,需要将JWTService注入到服务中,以便生成和验证Token。然后,在Controller中,使用JWTService来生成Token,并将其返回给...

    java后台获取小程序用户信息和生成自定义token,并使用filter过滤header的token源码

    本主题将详细讲解如何实现“java后台获取小程序用户信息”、“生成自定义token”以及“使用filter过滤header的token”的核心技术点。 首先,我们要理解小程序与后台交互的基本流程。小程序通常会通过调用微信提供的...

    APP使用token和refreshToken实现接口身份认证,保持登录状态.vsdx

    APP使用token和refreshToken实现接口身份认证,保持登录状态

    vue中前端利用refreshToken结合axios拦截器实现token的无感刷新

    内容概要: ...3、同时多个请求返回401,需要刷新token。 阅读建议:此资源以简单的demo演示了RefreshToken使用的全过程,介绍了基本的思路,所以在学习的过程要结合这些内容一起来实践,并调试对应的代码。

    Android token过期刷新处理的方法示例

    Android Token 过期刷新处理可以通过两种解决方案来实现:第一种解决方案是通过 OkHttp 提供的 Authenticator 接口来实现 Token 的刷新,第二种解决方案是根据与后端协商好的返回码处理刷新 Token 步骤。两种解决...

    sentinel-envoy-rls-token-server-1.7.2.jar

    随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

    java开发jwt认证 令牌,jwt.jar包 jwt 实现token认证,支持jdk1.7版本 java令牌

    jwt.jar包 jwt所需jar包集合 使用commons-codec.jar + java-jwt.jar进行token认证,支持jdk1.7及以上版本,目前大多数jwt支持至少需要1.8及以上,资源不好找,且行且珍惜。 如果需要源码以及功能实现方式,请联系...

    token-encoder-main-源码.rar

    本篇文章将深入探讨名为“token-encoder-main”的源码,揭示其在处理Token编码过程中的核心原理和实现细节。 首先,我们需要理解什么是Token。在Web应用中,Token通常是一种安全凭证,用于证明用户的身份或权限。...

    struts2_token控制刷新重复提交

    Struts2是一个非常流行的Java Web框架,用于构建和维护可扩展且易于管理的企业级应用程序。在Web开发中,处理用户提交的数据时,防止重复提交是一个常见的需求,特别是对于那些可能会改变系统状态的操作,如添加、...

    基于token的身份验证-2.0版本

    2. **双重Token机制**:引入了两种类型的Token——access_token和refresh_token,前者用于日常操作的身份验证,后者用于刷新access_token,以应对Token过期的情况。 #### 三、防止Token伪造的技术细节 **1. 服务端...

Global site tag (gtag.js) - Google Analytics