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;
}
}