?? tokenprocessor.java
字號:
package org.sunxin.lesson.jsp.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* TokenProcessor類是一個單例類。
*/
public class TokenProcessor
{
static final String TOKEN_KEY="org.sunxin.token";
private static TokenProcessor instance = new TokenProcessor();
/**
* getInstance()方法得到單例類的實例。
*/
public static TokenProcessor getInstance()
{
return instance;
}
/**
* 最近一次生成令牌值的時間戳。
*/
private long previous;
/**
* 判斷請求參數中的令牌值是否有效。
*/
public synchronized boolean isTokenValid(HttpServletRequest request)
{
//得到請求的當前Session對象。
HttpSession session = request.getSession(false);
if (session == null)
{
return false;
}
//從Session中取出保存的令牌值。
String saved = (String) session.getAttribute(TOKEN_KEY);
if (saved == null) {
return false;
}
//清除Session中的令牌值。
resetToken(request);
//得到請求參數中的令牌值。
String token = request.getParameter(TOKEN_KEY);
if (token == null) {
return false;
}
return saved.equals(token);
}
/**
* 清除Session中的令牌值。
*/
public synchronized void resetToken(HttpServletRequest request)
{
HttpSession session = request.getSession(false);
if (session == null) {
return;
}
session.removeAttribute(TOKEN_KEY);
}
/**
* 產生一個新的令牌值,保存到Session中,
* 如果當前Session不存在,則創建一個新的Session。
*/
public synchronized void saveToken(HttpServletRequest request)
{
HttpSession session = request.getSession();
String token = generateToken(request);
if (token != null) {
session.setAttribute(TOKEN_KEY, token);
}
}
/**
* 根據用戶會話ID和當前的系統時間生成一個唯一的令牌。
*/
public synchronized String generateToken(HttpServletRequest request)
{
HttpSession session = request.getSession();
try
{
byte id[] = session.getId().getBytes();
long current = System.currentTimeMillis();
if (current == previous)
{
current++;
}
previous = current;
byte now[] = new Long(current).toString().getBytes();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(id);
md.update(now);
return toHex(md.digest());
}
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] & 0x0f, 16));
}
return sb.toString();
}
/**
* 從Session中得到令牌值,如果Session中沒有保存令牌值,則生成一個新的令牌值。
*/
public synchronized String getToken(HttpServletRequest request)
{
HttpSession session = request.getSession(false);
if(null==session)
return null;
String token=(String)session.getAttribute(TOKEN_KEY);
if(null==token)
{
token = generateToken(request);
if (token != null)
{
session.setAttribute(TOKEN_KEY, token);
return token;
}
else
return null;
}
else
return token;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -