एक और दृष्टिकोण, मार्क्स के समान है, SessionCookieConfig
उपयोग करने के लिए होगा, लेकिन JNDI विन्यास से एक संदर्भ श्रोता में सेट:
कोड:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.SessionCookieConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class JndiSessionCookieConfigListener implements ServletContextListener {
private static final Logger logger = LoggerFactory.getLogger(JndiSessionCookieConfigListener.class);
private volatile Context jndiSessionCookieConfig;
private volatile SessionCookieConfig sessionCookieConfig;
@Override
public void contextInitialized(ServletContextEvent sce) {
String listenerName = getClass().getSimpleName();
try {
logger.info("JNDI override session cookie config found for {}", listenerName);
jndiSessionCookieConfig = (Context) new InitialContext().lookup(
"java:comp/env/" + listenerName);
}
catch (NamingException e) {
logger.info("No JNDI override session cookie config found for {}", listenerName);
}
sessionCookieConfig = sce.getServletContext().getSessionCookieConfig();
String comment = getString("comment");
if (comment != null) {
logger.debug("\t[comment]: [{}]", comment);
sessionCookieConfig.setComment(comment);
}
String domain = getString("domain");
if (domain != null) {
logger.debug("\t[domain]: [{}]", domain);
sessionCookieConfig.setDomain(domain);
}
Boolean httpOnly = getBoolean("http-only");
if (httpOnly == null) {
sessionCookieConfig.setHttpOnly(true);
}
else {
logger.debug("\t[http-only]: [{}]", httpOnly);
sessionCookieConfig.setHttpOnly(httpOnly);
}
Integer maxAge = getInteger("max-age");
if (maxAge != null) {
sessionCookieConfig.setMaxAge(maxAge);
}
String name = getString("name");
if (name != null) {
logger.debug("\t[name]: [{}]", name);
sessionCookieConfig.setName(name);
}
String path = getString("path");
if (path != null) {
logger.debug("\t[path]: [{}]", path);
sessionCookieConfig.setPath(path);
}
Boolean secure = getBoolean("secure");
if (secure == null) {
sessionCookieConfig.setSecure(true);
}
else {
logger.debug("\t[secure]: [{}]", secure);
sessionCookieConfig.setSecure(secure);
}
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
}
private Boolean getBoolean(String name) {
Object value;
try {
value = jndiSessionCookieConfig.lookup(name);
if (value instanceof Boolean) {
return (Boolean)value;
}
else {
return Boolean.valueOf(value.toString());
}
}
catch (NamingException e) {
return null;
}
}
private Integer getInteger(String name) {
Object value;
try {
value = jndiSessionCookieConfig.lookup(name);
if (value instanceof Integer) {
return (Integer)value;
}
else {
return Integer.valueOf(value.toString());
}
}
catch (NamingException e) {
return null;
}
}
private String getString(String name) {
Object value;
try {
value = jndiSessionCookieConfig.lookup(name);
return value.toString();
}
catch (NamingException e) {
return null;
}
}
}
web.xml अंदर :
...
<listener>
<listener-class>
org.mitre.caasd.servlet.init.JndiSessionCookieConfigListener
</listener-class>
</listener>
...
अपने context.xml में:
...
<Environment name="JndiSessionCookieConfigListener/secure"
type="java.lang.String"
override="false"
value="true" />
...
यह आपको तैनाती पर्यावरण में क्रम बिल्कुल सत्र कुकी विन्यास निर्धारित करने की अनुमति देता है। इस प्रकार, आप स्थानीय रूप से विकास करने के लिए उसी वेबपैप (युद्ध फ़ाइल) का उपयोग कर सकते हैं (जहां आपके पास https नहीं होगा) और उत्पादन में जहां आप ALWAYS https चाहते हैं।
ध्यान दें, इस दृष्टिकोण OWASP documentation
में बताया गया है के बाद से सर्वलेट 3 http://docs.oracle.com/javaee/6/api/javax/servlet/SessionCookieConfig.html –