package me.test.redis;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponseWrapper;
import javax.servlet.http.HttpSession;
import me.test.MySessionFilter;
import me.test.SessionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyResponse extends HttpServletResponseWrapper {
private Logger logger = LoggerFactory.getLogger(MyResponse.class);
private SessionManager sessionManager;
public MyResponse(SessionManager sessionManager) {
super(MySessionFilter.responseHolder.get());
this.sessionManager = sessionManager;
}
public String encodeURL(String url) {
HttpServletRequest request = MySessionFilter.wrappedRequestHolder.get();
// is cross domain? just return url without modified.
URI u = null;
try {
u = new URI(url);
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e);
}
String path = u.getPath() == null ? "" : u.getPath();
if (u.getHost() != null) {
int port = u.getPort();
if (port < 0) {
port = "https".equalsIgnoreCase(u.getScheme()) ? 443 : 80;
}
if (!request.getServerName().equalsIgnoreCase(u.getHost())
|| request.getServerPort() != port
|| path.startsWith(request.getContextPath())) {
return url;
}
}
// session id for url not set
String paramName = sessionManager.getSessionIdUrlMatrixParamName();
if (paramName == null) {
return url;
}
String sessionURLPrefix = ";" + paramName + "=";
// is session id from cookie and URL contains session id? remove from url
if (request.isRequestedSessionIdFromCookie()) {
int prefix = url.indexOf(sessionURLPrefix);
if (prefix != -1) {
int suffix = url.indexOf("?", prefix);
if (suffix < 0) {
suffix = url.indexOf("#", prefix);
}
if (suffix <= prefix) {
return url.substring(0, prefix);
}
return url.substring(0, prefix) + url.substring(suffix);
}
return url;
}
// url already contains session id? replace with actual session id.
HttpSession session = request.getSession(false);
if (session == null) {
return url;
}
// Already encoded
String id = session.getId();
int prefix = url.indexOf(sessionURLPrefix);
if (prefix != -1) {
int suffix = url.indexOf("?", prefix);
if (suffix < 0) {
suffix = url.indexOf("#", prefix);
}
if (suffix <= prefix) {
return url.substring(0, prefix + sessionURLPrefix.length()) + id;
}
return url.substring(0, prefix + sessionURLPrefix.length()) + id +
url.substring(suffix);
}
// insert session id to url
int suffix = url.indexOf('?');
if (suffix < 0) {
suffix = url.indexOf('#');
}
String rootPath = ("https".equalsIgnoreCase(u.getScheme()) || "http".equalsIgnoreCase(u.getScheme())) && u.getPath() == null ? "/" : "";
// if no path, insert the root path
if (suffix < 0) {
return url + rootPath + sessionURLPrefix + id;
}
// if no path so insert the root path
return url.substring(0, suffix) + rootPath + sessionURLPrefix + id + url.substring(suffix);
}
public String encodeUrl(String url) {
return encodeURL(url);
}
public String encodeRedirectURL(String url) {
return encodeURL(url);
}
public String encodeRedirectUrl(String url) {
return encodeRedirectURL(url);
}
}