java令牌算法_令牌对象生成(java+策略模式)

本文介绍了Java中基于策略模式实现的令牌算法,包括策略接口、策略算法类、令牌对象和令牌管理器的详细设计。通过策略接口定义了计算令牌编号的算法和处理令牌与对象的联系,策略算法类实现了具体的生成逻辑,令牌对象用于关联一系列操作数据,而令牌管理器则负责对TOKEN对象的集中管理和信息存储,防止信息被覆盖。
摘要由CSDN通过智能技术生成

1.策略接口

package com.sme.services.validateIntface;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

/**

*

* @author injuer

*

* @see 此接口可根据程序开发人员自定义令牌的编号算法

* 和针对每个不同作用域关联的操作的信息处理

*

*/

public interface ScopeHand{

/**

* 计算令牌的编号的算法实现

* @return 得到令牌计算出的编号

*/

public String nowNumber();

/**

* 处理令牌与对象之间的联系

*/

public void process(Object o);

public void porcess(List list);

public void porcess(HttpServletRequest s);

/**

* 提取已处理的Object

* @return 返回Object

*/

public Object extractObject();

public List extractList();

public HttpServletRequest extractRequest();

/**

* 令牌编号生成策略

*/

public String generate(String str);

}

2.策略算法类

package com.sme.services.validate;

import java.util.List;

import java.util.Random;

import javax.servlet.http.HttpServletRequest;

import com.sme.services.validateIntface.ScopeHand;

/**

*

* @author injuer

*

* @see 此类为令牌算法生成类,令牌的编号,作用域都在此类中生成

*

*/

public class GeneralHand implements ScopeHand {

private Object tagObject=null;

private List tagList=null;

private HttpServletRequest request=null;

private static final String[] model={"e","f"

,"m","x","y","z","A","B","C","D"

,"E","F","G","K","6","8","5"};

private Random random=new Random();

/**

* 提取有关此令牌的信息对象集合

*/

public List extractList() {

return tagList;

}

/**

* 提取有关此令牌的单个信息对象

*/

public Object extractObject() {

return tagObject;

}

/**

* 提取有关此令牌的信息请求

*/

public HttpServletRequest extractRequest() {

return request;

}

/**

* 生成令牌编号,每个令牌对应一个不重复的编号

*/

public String nowNumber() {

String result=new String();

for(int i=0;i<10;i++){

String temp=model[random.nextInt(model.length)];

result+=generate(temp);

}

return result.substring(0, 15);

}

/**

* 获取并处理信息对象信息

*/

public void process(Object o) {

tagObject=o;

System.out.println(tagObject);

}

/**

* 获取并处理信息请求

*/

public void porcess(HttpServletRequest s) {

request=s;

}

/**

* 获取并处理对象集合

*/

public void porcess(List list) {

tagList=list;

}

/**

* 令牌编号生成策略

*/

public String generate(String str) {

String s=null;

char ch=str.charAt(0);

if(ch>'1' && ch

s=String.valueOf(Math.abs(random.nextInt()%10+48));

}else{

s=String.valueOf(Math.abs(random.nextInt()%26+97));

}

return s;

}

}

3.令牌对象

package com.sme.services.validate;

/**

*

* @author injuer

*

* @see 此对象目的是把某一系列的需要操作的数据关系起来,

* 因为在SESSION中,可能存在数据之间被覆盖的情况.

*

*

*/

public class Token {

/**

* 令牌的作用域在用户

*/

public static final int USER=1;

/**

* 令牌的作用域在资源

*/

public static final int RESOURCES=2;

/**

* 令牌作用域在REQUEST

*/

public static final int NONE=0;

}

4.令牌管理器

package com.sme.services.validate;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.sme.services.validateIntface.ScopeHand;

/**

*

* @author injuer

*

* @see 此对象对TOKEN对象集中管理,它的存在是让每个用户都存在一个对应的MAP

* 这个MAP对应了在SESSION中有关某一对象的一系列操作关联的信息,它的存在是防止 SESSION共享的时候,信息被覆盖的情况.

*

*/

public class TokenManager {

private static Map userMap = null;

private static Map> resourcesMap = null;

private static Map requestMap=null;

private String number=null;

/**

* 策略对象

*/

private ScopeHand hand;

/**

* 默认构造

*/

public TokenManager(){

initialization();

}

/**

* 配置策略对象

*

* @param hand

* 被采用的策略对象

*/

public void setHand(ScopeHand hand) {

this.hand = hand;

}

/**

* 领取此令牌关联的操作信息

*

* @return 返回操作信息

*/

public void receive(int tokenType) {

if(Token.USER==tokenType){

System.out.println("ok");

add(hand.extractObject());

}

if(Token.RESOURCES==tokenType){

add(hand.extractList());

}

if(Token.NONE==tokenType){

add(hand.extractRequest());

}

}

/**

* 建立信息储蓄仓库

*/

public void initialization(){

if(userMap==null){

userMap=new HashMap();

}

if(resourcesMap==null){

resourcesMap=new HashMap>();

}

if(requestMap==null){

requestMap=new HashMap();

}

}

/**

* 添加

* @param o

*/

public void add(Object o){

number=hand.nowNumber();

userMap.put(number, o);

}

/**

* 添加

* @param list

*/

public void add(List list){

number=hand.nowNumber();

resourcesMap.put(number, list);

}

/**

* 添加

* @param s

*/

public void add(HttpServletRequest s){

number=hand.nowNumber();

requestMap.put(number, s);

}

/**

* 获取相应MAP

* @return

*/

public static Map getUserMap() {

return userMap;

}

/**

* 获取相应MAP

* @return

*/

public static Map> getResourcesMap() {

return resourcesMap;

}

/**

* 获取相应MAP

* @return

*/

public static Map getRequestMap() {

return requestMap;

}

public String getNumber() {

return number;

}

}

5.客户端

package com.sme.actions.user;

import com.sme.actions.basic.AbstractAction;

import com.sme.services.intface.ServicesIn;

import com.sme.services.validate.GeneralHand;

import com.sme.services.validate.Token;

import com.sme.services.validate.TokenManager;

import com.sme.util.CreateObject;

public class Sme_LoginAction extends AbstractAction {

private ServicesIn user;

private TokenManager token;

private GeneralHand gh=(GeneralHand)CreateObject.Create(GeneralHand.class);

/**

*

*/

private static final long serialVersionUID = 1L;

public String execute() {

token=(TokenManager)CreateObject.Create(TokenManager.class);

gh.process(su);

token.setHand(gh);

token.receive(Token.USER);

return SUCCESS;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值