package com.asiainfolinkage.ems.web.controller.base;
import java.math.BigInteger;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* 附带token的控制器
* @version 1.0 Copyright 2013年7月29日 下午3:38:30
*/
public abstract class TokenBaseController extends BaseController {
private static Map<String, String> springmvc_token = new HashMap<String, String>();
/** 生成一个唯一值的token */
public String generateGUID(HttpSession session) {
String token = "";
Date date = new Date();
synchronized (springmvc_token) {
try {
Object obj = session.getAttribute(Constants.SPRING_MVC_TOKENNAME);
if (obj != null)
springmvc_token = (Map<String, String>) session.getAttribute(Constants.SPRING_MVC_TOKENNAME);
token = new BigInteger(165, new Random()).toString(36).toUpperCase();
springmvc_token.put(Constants.DEFAULT_TOKEN_NAME + "." + token, token);
session.setAttribute(Constants.SPRING_MVC_TOKENNAME, springmvc_token);
Constants.TOKEN_VALUE = token;
} catch (IllegalStateException e) {
_log.error("generateGUID() mothod find bug,by token session...");
}
}
return token;
}
/** 验证表单token值和session中的token值是否一致 */
public boolean validToken(HttpServletRequest request) {
String inputToken = getInputToken(request);
if (inputToken == null) {
_log.warn("token is not valid!inputToken is NULL");
return false;
}
HttpSession session = request.getSession();
Map<String, String> tokenMap = (Map<String, String>) session.getAttribute(Constants.SPRING_MVC_TOKENNAME);
if (tokenMap == null || tokenMap.size() < 1) {
_log.warn("token is not valid!sessionToken is NULL");
return false;
}
String sessionToken = tokenMap.get(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);
if (!inputToken.equals(sessionToken)) {
_log.warn("token is not valid!inputToken='" + inputToken + "',sessionToken = '" + sessionToken + "'");
return false;
}
tokenMap.remove(Constants.DEFAULT_TOKEN_NAME + "." + inputToken);
session.setAttribute(Constants.SPRING_MVC_TOKENNAME, tokenMap);
return true;
}
/** 获取表单中token值 */
private String getInputToken(HttpServletRequest request) {
Map params = request.getParameterMap();
if (!params.containsKey(Constants.DEFAULT_TOKEN_NAME)) {
_log.warn("Could not find token name in params.");
return null;
}
String[] tokens = (String[]) (String[]) params.get(Constants.DEFAULT_TOKEN_NAME);
if ((tokens == null) || (tokens.length < 1)) {
_log.warn("Got a null or empty token name.");
return null;
}
return tokens[0];
}
}
分享到:
相关推荐
java多线程编程核心技术synchronized实例大全,同步方法,同步语句块,类锁,对象锁全都用代码来展现出来
java中synchronized用法
java里面synchronized用法
java同步synchronized关键字用法示例
我自己的博客所附带的案例源码,我的博客标题名称是"synchronized并发讲解",关注我等待跟多更新
基于Synchronized加锁的四个demo,主要反映类锁、对象锁、方法锁的使用方法。 并测试不同类型锁之间的有效关系。
synchronized关键字主要北用来进行线程同步,这里我们主要来演示Java多线程程序中synchronized修饰方法的使用实例,需要的朋友可以参考下:
synchronized关键字在java中的重要性 以及常用的方法 还有它的详解
Synchronized关键字的用法
synchronized 测试案例,同步一个对象或者多个对象的案例均有,还有成功和失败案例的对比
主要介绍了Java中synchronized的使用方法,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
主要介绍了Java 同步锁(synchronized)详解及实例的相关资料,需要的朋友可以参考下
synchronized下的方法控制多线程程序中的线程同步非常方便,这里就来看一下Java使用synchronized修饰方法来同步线程的实例演示,需要的朋友可以参考下
多线程实例 生产者、消费者有讲解 下面是其中一小部分代码 public synchronized void putShareChar(char c) { // 通知消费者已经生产,可以消费 if (isProduced) { // 如果产品还未消费,则生产者等待 try { ...
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
主要介绍了PHP pthreads v3下同步处理synchronized用法,结合实例形式分析了PHP pthreads v3下同步处理synchronized原理、使用方法及相关操作注意事项,需要的朋友可以参考下
java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized java锁机制Synchronized
主要介绍了Java中synchronized关键字的用法,针对synchronized修饰方法的使用作出了简单讲解和演示,需要的朋友可以参考下
synchronized是很重要的,但是不少人不是很明白synchronized的用法,这里有详细的doc文档给大家参考