package li.web;
import java.io.IOException;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* TokenFilter
*
* @author 明伟
*/
public class TokenFilter implements Filter {
private static final Map<String, HttpSession> SESSION_MAP = new ConcurrentHashMap<String, HttpSession>();
private String tokenName = "_token";
public void destroy() {}
public void init(FilterConfig config) throws ServletException {
String _name = config.getInitParameter("tokenName");
if (null != _name) {
this.tokenName = _name;
}
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
final HttpServletResponse response = (HttpServletResponse) servletResponse;
chain.doFilter(new HttpServletRequestWrapper(request) {
private String token;
public HttpSession getSession() {
token = super.getParameter(tokenName);
HttpSession httpSession = null;
if (null != token) {
httpSession = SESSION_MAP.get(token);
if (null == httpSession) {
httpSession = super.getSession();
SESSION_MAP.put(token, httpSession);
}
} else {// null == token
token = newToken();
httpSession = super.getSession();
SESSION_MAP.put(token, httpSession);
}
return httpSession;
}
/**
* 一定要在getSession之后
*/
public String getRequestedSessionId() {
return token;
}
}, response);
}
/**
* newToken
*/
public String newToken() {
return UUID.randomUUID().toString();
}
}