Можно, но я бы использовал простой POJO только для того, чтобы все было четко разделено. Имейте в виду, что значение, хранящееся в синглтоне, будет доступно только тому же потоку, который обработал запрос сервлета, поэтому, если вы делаете какую-либо асинхронность, вам нужно будет это учитывать. Вот супер базовый импл:
public class OrgId {
public static ThreadLocal<Integer> orgId = new ThreadLocal<Integer>();
}
Поскольку организационный идентификатор является резидентным в сеансе, вы можете установить значение ThreadLocal в раннем фильтре сервлета следующим образом (не так много проверок на ошибки):
public class OrgIdFilter implements Filter {
public void doFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain) throws java.io.IOException, javax.servlet.ServletException {
int orgId = 0;
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpSession session = req.getSession();
orgId = Integer.parseInt(session.getAttribute("OrganizationalIdAttr"));
try {
OrgId.orgId.set(orgId);
filterChain.doFilter(servletRequest, servletresponse);
} finally {
OrgId.orgId.set(null); // Important to clear after request !!
}
}
}
Предполагается, что orgId находится в сеансе, когда вызывается фильтр, но если нет, вы понимаете ...
Тогда в вашем перехватчике (или почти везде) вы можете получить текущий orgId потока с помощью:
OrgId.orgId.get(); // Might be null.....
Потенциальный snafu здесь заключается в том, что все эти компоненты (фильтр, OrgId и перехватчик) должны быть загружены одним и тем же загрузчиком классов, чтобы гарантировать, что класс OrgId фактически является одиночным, в противном случае с множеством экземпляров ThreadLocal, висящих вокруг не будет работать последовательно или вообще. Излишне говорить, что все это должно происходить в одной и той же виртуальной машине.
Я не уверен, является ли это самым чистым способом решения этой проблемы, но он действительно даст вам ваш орган, где он вам нужен.