У меня странная проблема, с которой я не могу справиться уже несколько дней, поэтому я сдался и решил посоветоваться со знающими участниками stackoverflow.
Какую версию Java я использую?
Коретто Амазонки 1.8.0_275
Чего я хочу добиться?
В моем приложении пользователь должен аутентифицировать себя, используя безопасное соединение ldap. После аутентификации из каталога LDAP пользователь будет перенаправлен на свою домашнюю страницу. Однако я хочу, чтобы при подключении к серверу ldap через безопасный порт не проходила проверка сертификации.
Что я сделал до сих пор и что работает?
Из других сообщений я обнаружил, что мне нужно использовать класс BlindSSLFactory, чтобы обойти проверку сертификации и внедрить этот класс в свойства во время запроса ldap, я добавил это в свой проект, и если я запускаю проект из eclipse, все работает абсолютно нормально, и проверка сертификации обходит, и пользователь входит в систему. Обратите внимание, что: в моем хранилище доверенных сертификатов Java у меня нет подписанного сертификата.
Что не работает?
Если я скомпилирую проект с созданным мной установщиком и запущу его как приложение (не из eclipse, а из собственного установщика), я получу следующую ошибку. Примечание. Я отлаживаю следующую строку, и она печатает true, так как я установил ее перед запуском проекта: -Dcom.sun.jndi.ldap.object.disableEndpointIdentification:
javax.naming.CommunicationException: simple bind failed: 10.148.129.11:636
at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:219) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2897) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:347) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxFromUrl(LdapCtxFactory.java:225) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:189) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:243) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:154) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:84) ~[na:1.8.0_275]
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:684) ~[na:1.8.0_275]
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:313) ~[na:1.8.0_275]
at javax.naming.InitialContext.init(InitialContext.java:244) ~[na:1.8.0_275]
at javax.naming.InitialContext.<init>(InitialContext.java:216) ~[na:1.8.0_275]
at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:101) ~[na:1.8.0_275]
at com.ricoh.sdced.festo.pab.web.login.LdapAuthentication.createLoginSession(LdapAuthentication.java:78) [classes!/:na]
at com.ricoh.sdced.festo.pab.web.login.LdapAuthentication.startLoginSession(LdapAuthentication.java:43) [classes!/:na]
at com.ricoh.sdced.festo.pab.web.views.LoginView.performLogin(LoginView.java:54) [classes!/:na]
at com.ricoh.sdced.festo.pab.web.views.LoginView.lambda$createLoginLayout$565279a2$1(LoginView.java:47) [classes!/:na]
at com.vaadin.flow.component.ComponentEventBus.fireEventForListener(ComponentEventBus.java:205) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.component.ComponentEventBus.handleDomEvent(ComponentEventBus.java:373) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.component.ComponentEventBus.lambda$addDomTrigger$dd1b7957$1(ComponentEventBus.java:264) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.internal.nodefeature.ElementListenerMap.lambda$fireEvent$2(ElementListenerMap.java:441) ~[flow-server-2.1.5.jar!/:2.1.5]
at java.util.ArrayList.forEach(ArrayList.java:1259) ~[na:1.8.0_275]
at com.vaadin.flow.internal.nodefeature.ElementListenerMap.fireEvent(ElementListenerMap.java:441) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.communication.rpc.EventRpcHandler.handleNode(EventRpcHandler.java:59) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.communication.rpc.AbstractRpcInvocationHandler.handle(AbstractRpcInvocationHandler.java:64) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocationData(ServerRpcHandler.java:402) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.communication.ServerRpcHandler.lambda$handleInvocations$1(ServerRpcHandler.java:383) ~[flow-server-2.1.5.jar!/:2.1.5]
at java.util.ArrayList.forEach(ArrayList.java:1259) ~[na:1.8.0_275]
at com.vaadin.flow.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:383) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:318) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:89) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:40) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.VaadinService.handleRequest(VaadinService.java:1540) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.server.VaadinServlet.service(VaadinServlet.java:247) ~[flow-server-2.1.5.jar!/:2.1.5]
at com.vaadin.flow.spring.SpringServlet.service(SpringServlet.java:95) ~[vaadin-spring-12.1.2.jar!/:na]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.37.jar!/:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:712) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:459) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:352) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:312) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.springframework.web.servlet.mvc.ServletForwardingController.handleRequestInternal(ServletForwardingController.java:141) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:177) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:52) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1040) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:943) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) ~[tomcat-embed-core-9.0.37.jar!/:4.0.FR]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.37.jar!/:4.0.FR]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.springframework.boot.actuate.metrics.web.servlet.WebMvcMetricsFilter.doFilterInternal(WebMvcMetricsFilter.java:93) ~[spring-boot-actuator-2.3.3.RELEASE.jar!/:2.3.3.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) ~[spring-web-5.2.8.RELEASE.jar!/:5.2.8.RELEASE]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:373) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1589) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_275]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_275]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.37.jar!/:9.0.37]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_275]
Caused by: java.net.SocketException: Connection or outbound has closed
at sun.security.ssl.SSLSocketImpl$AppOutputStream.write(SSLSocketImpl.java:967) ~[na:1.8.0_275]
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82) ~[na:1.8.0_275]
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140) ~[na:1.8.0_275]
at com.sun.jndi.ldap.Connection.writeRequest(Connection.java:448) ~[na:1.8.0_275]
at com.sun.jndi.ldap.Connection.writeRequest(Connection.java:421) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapClient.ldapBind(LdapClient.java:359) ~[na:1.8.0_275]
at com.sun.jndi.ldap.LdapClient.authenticate(LdapClient.java:214) ~[na:1.8.0_275]
... 88 common frames omitted
Как моя логика в коде?
public class BlindSSLSocketFactory extends SocketFactory {
private static SocketFactory blindFactory = null;
/**
* Builds an ALL trusting "blind" ssl socket factory.
*/
static {
// create a trust manager that will purposefully fall down on the
// job
TrustManager[] blindTrustMan = new TrustManager[] { new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] c, String a) {
}
public void checkServerTrusted(X509Certificate[] c, String a) {
}
} };
// create our "blind" ssl socket factory with our lazy trust manager
try {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, blindTrustMan, new java.security.SecureRandom());
blindFactory = sc.getSocketFactory();
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
}
/**
* @see javax.net.SocketFactory#getDefault()
*/
public static SocketFactory getDefault() {
return new BlindSSLSocketFactory();
}
/**
* @see javax.net.SocketFactory#createSocket(java.lang.String, int)
*/
public Socket createSocket(String arg0, int arg1) throws IOException, UnknownHostException {
return blindFactory.createSocket(arg0, arg1);
}
/**
* @see javax.net.SocketFactory#createSocket(java.net.InetAddress, int)
*/
public Socket createSocket(InetAddress arg0, int arg1) throws IOException {
return blindFactory.createSocket(arg0, arg1);
}
/**
* @see javax.net.SocketFactory#createSocket(java.lang.String, int,
* java.net.InetAddress, int)
*/
public Socket createSocket(String arg0, int arg1, InetAddress arg2, int arg3)
throws IOException, UnknownHostException {
return blindFactory.createSocket(arg0, arg1, arg2, arg3);
}
/**
* @see javax.net.SocketFactory#createSocket(java.net.InetAddress, int,
* java.net.InetAddress, int)
*/
public Socket createSocket(InetAddress arg0, int arg1, InetAddress arg2, int arg3) throws IOException {
return blindFactory.createSocket(arg0, arg1, arg2, arg3);
}
}
И мой класс входа в LDAP, куда я ввожу этот классblindSSLFactory
@Component
public class LdapAuthentication {
private final Logger logger = LoggerFactory.getLogger(getClass());
private String username;
private String password;
private boolean isLoggedIn;
public LdapAuthentication() {
}
public void startLoginSession(String username, String password)
throws NamingException {
logger.info("preparing user login details...");
this.username = username;
this.password = password;
logger.info("user login will be attempted for user: " + this.username);
this.isLoggedIn = createLoginSession(this.username, this.password);
logger.info("login attempt success result: " + this.isLoggedIn);
}
private boolean createLoginSession(String username, String password)
throws NamingException {
logger.info("creating a LDAP Authentication session...");
logger.info("System property value for -Dcom.sun.jndi.ldap.object.disableEndpointIdentification:"
+ System.getProperty("com.sun.jndi.ldap.object.disableEndpointIdentification"));
String ldapServerUrl = buildLdapPrefix()
+ SettingsResolver.getInstance().getSetting(
"ldap.server.address")
+ ":"
+ SettingsResolver.getInstance().getSetting(
"ldap.server.port.number");
logger.info("LDAP authentication URL: " + ldapServerUrl);
Properties props = new Properties();
//use this line if you wanna discard ssl certificate validation
props.put("java.naming.ldap.factory.socket",
BlindSSLSocketFactory.class.getName());
props.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
props.put(Context.PROVIDER_URL, ldapServerUrl);
props.put(Context.SECURITY_PRINCIPAL, username);
props.put(Context.SECURITY_CREDENTIALS, password);
InitialDirContext context = null;
try {
context = new InitialDirContext(props);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> results = context.search(
toDC(SettingsResolver.getInstance().getSetting(
"ldap.server.domain.name")), String.format(
"(& (userPrincipalName=%s)(objectClass=user))",
this.username), controls);
return results.hasMore();
} catch (NamingException namingException) {
logger.error(
"Exception occurred while authenticating to LDAP Server: ",
namingException);
throw namingException;
} finally {
try {
if (context != null)
context.close();
} catch (Exception ex) {
}
}
}
private static String toDC(String username) {
String result = "";
String[] parts = username.split("\\.");
for (int index = 0; index < parts.length - 1; index++)
result = result.concat("DC = ").concat(parts[index]).concat(",");
return result.concat("DC = ").concat(parts[parts.length - 1]);
}
public boolean isUserLoggedIn() {
return this.isLoggedIn;
}
private String buildLdapPrefix() {
String securePortEnabled = SettingsResolver.getInstance().getSetting(
"ldap.server.secure.port.enabled");
if (securePortEnabled.contains("true")) {
return "ldaps://";
} else {
return "ldap://";
}
}
}
Привет @ Ахмет Эроглу. Я отвечу здесь, а не в ответе. Маловероятно, но указанное изменение свойств может быть мотивировано процессом очистки класса ResourceManager
при инициализации контекста каталога. Возможно, когда вы запускаете приложение в eclipse, оно имеет полную конфигурацию jre и предоставляет некоторые значения по умолчанию. Пожалуйста, можете ли вы проверить этот термин, отладив соответствующий код?
Вы можете проверить фактические свойства, связанные с контекстом, следующим образом: Hashtable<?,?> actualEnvit'ronment = context.getEnvironment();
. Еще один тест, который вы можете выполнить, чтобы обеспечить некоторый уровень изоляции конфигурации свойств, указывает свойство конфигурации com.sun.naming.disable.app.resource.files
в вашей среде.
@jccampanero Уважаемый jccampanero, во-первых, большое спасибо за вашу помощь, мне очень жаль, но ваше объяснение было слишком техническим для меня, поскольку я начинающий разработчик. подскажите пожалуйста, что делать поточнее, а также как это сделать и почему? Я так не понял вашего объяснения :(( Большое вам спасибо заранее.. Должен ли я поместить этот «com.sun.naming.disable.app.resource.files» в свой реквизит со значением true u?
Привет Ахмед. Пожалуйста, извините, я постараюсь объясниться лучше. Да, я предложил вам попробовать несколько вещей. С одной стороны, вы можете включить Hashtable actualEnvironment = context.getEnvironment()
сразу после строки context = new InitialDirContext(props);
. Он предоставит вам ценную информацию о том, изменяет ли какой-либо код настроенные вами свойства в Eclipse и в вашем рабочем приложении. Если бы это было так, вы можете установить внутреннее свойство com.sun.naming.disable.app.resource.files
на true
также в eclipse и в установщике и посмотреть, что произойдет.
Если установить для этого свойства значение true
, ваш код не будет включать какое-либо приложение или конкретную конфигурацию. Пожалуйста, в любом случае, поскольку это что-то внутреннее в библиотеках JDK, во-первых, его следует тщательно протестировать, и в зависимости от реализации JDK, возможно, он может быть не переносимым. Идея состоит только в том, чтобы протестировать код и посмотреть, дает ли изменение какое-то представление о проблеме.
В качестве примечания, и это, вероятно, не имеет отношения к решению проблемы, если программа работает найти в eclipse, но, возможно, вам нужно указать свойство Context.SECURITY_PROTOCOL
со значением ssl
. Пожалуйста, смотрите: docs.oracle.com/javase/8/docs/technotes/guides/jndi/…. Если у вас есть какие-либо вопросы и вы думаете, что я могу чем-то помочь, пожалуйста, скажите мне, я буду рад помочь вам, если смогу.
@jccampanero Дорогой jccampanero, большое спасибо за ваши подробные объяснения, я так благодарен, что вы не можете знать ... Итак, вот что произошло после ваших предложений. Прежде всего, я хочу сказать еще кое-что, это также произошло до того, как вы добавили два ваших предложения. Когда я удаленно отлаживаю приложение, и дело доходит до этой строки добавления свойств, я делаю f6, чтобы перешагнуть. Обычно это должно переходить на следующую известную вам строку, но происходит следующее: как только дело доходит до этой первой строки props.put, она начинает вести себя странно, иногда она переходит сразу на две строки. и лассо, когда я наводил курсор на
переменные, я ничего не вижу, как мудро, я добавил factEnvrionment=context.getEvrionment, и он просто перескакивает с этой строки на следующую строку, и я не могу ее оценить. странно, это имя пользователя, пароль и свойства initidalldapdirectory всегда как-то правильно установлены, я также пробовал этот securty_protcol с ssl. это то же самое. когда дело доходит до этой строки с удаленной отладкой, она каким-то образом переходит в конец выражения до этой управляющей переменной, после выражения context=new InitialDirContext. Не знаю, что делать дальше :((
однако, если я запускаю приложение из eclipse, все работает нормально. также у меня есть только один экземпляр java на моем компьютере, и это amazon coretto 8. я проверяю, какой java используется в eclipse, и это тот же amazon coretto, который также используется во время запуска приложения в качестве внешнего приложения вне eclipse
Указанная вами проблема отладки обычно возникает, когда скомпилированный код не соответствует исходному коду. Является ли это возможным? Одна вещь, которую вы можете сделать, это включить в свой код отладочные трассировки, ничего особенного, System.out.println("Environment: " + factEnvrionment), например, и посмотреть вывод, если он есть, сравнить результаты, полученные при запуске приложение в eclipse и в prod.
Привет, я думаю, ты прав, и вот что я сделал. это проект maven с весенним загрузочным приложением. У меня есть этот класс под названием BlindSSLFactory, он был в каком-то пакете, я поместил этот класс в другой пакет и сделал чистую установку mvn внутри каталога, затем я создал файл jar. Я проверяю содержимое файла jar, но вижу, что этот класс фабрикиblindssl все еще находится в старом пакете внутри файла jar, когда я открываю его с помощью zip. значит ли это, что есть ошибка компиляции? Я так думаю правильно? Если да, то как я могу это исправить? потому что mvn clean install скомпилировал все нормально :/
Это действительно очень странно. Ахмет, убедитесь, что вы действительно сохранили содержимое в правильном пакете и соответствующем каталоге, и делайте это шаг за шагом: сначала запустите mvn clean
и убедитесь, что в вашем целевом каталоге ничего нет. Затем запустите mvn clean compile
и убедитесь, что класс находится в правильном каталоге. Пожалуйста, вы можете попробовать?
@jccampanero Дорогой jccampanero, вы не представляете, как я вам благодарен. Я еще не мог найти решение, но я нашел причину, почему это происходит. Это огромный проект, я работаю в компании. Что происходит, так это то, что мы делаем компиляцию нескольких подпроектов, а затем отдельно компилируется другой подмодуль, называемый установщиком, и этот модуль установщика вызывает файлы jar из других модулей, чтобы объединить все вместе и создать setup.exe. Я сделал mvn чистым, и mvn компилируется отдельно только в папке этого конкретного подмодуля.
Затем я взял эту банку и поместил ее в папку установки приложения, и я увидел, что программа работает совершенно нормально. в основном это означает, что каким-то образом во время компиляции этого подмодуля «установщика» не удается правильно найти правильный файл jar, следовательно, он не выбирает правильный скомпилированный файл jar. Это еще одна проблема, которую мне нужно решить, потому что я не знаю, как это происходит, но, по крайней мере, я нашел причину, большое спасибо за ваше долгое обсуждение, которое мне очень помогло. еще раз спасибо..
Это здорово, Ахмет, я очень рад узнать, что, по крайней мере, код, связанный с интеграцией сервера ldap, работает нормально, а проблема в другом. Пожалуйста, если вам нужна дополнительная помощь, и вы думаете, что я могу чем-то помочь, не стесняйтесь обращаться ко мне снова, я буду рад помочь вам, если смогу.
Ахмет, важно только то, что проблема была решена, но что касается вопроса, вы хотите, чтобы я создал какой-то ответ?
да, пожалуйста, сделайте это, я хотел бы отметить это как ответ после ваших огромных усилий и дать ему оценку.
Большое спасибо, Ахмет, я создал ответ. Как я уже говорил вам, если вы думаете, что я могу быть чем-то полезен с вашей новой проблемой или с любой другой, пожалуйста, не стесняйтесь обращаться ко мне, я буду рад помочь вам, если смогу.
Возможно, ваш BlindSSLFactory
на самом деле не используется в производственной среде. Мои деньги на то, что java.naming.ldap.factory.socket
переопределяется в другом месте кода, так как это, кажется, средство, позволяющее вашему приложению знать, что оно должно использовать эту фабрику через интерфейс, подобный SPI.
Хорошей отправной точкой будет удаленная отладка JVM и просмотр значения свойства во время выполнения.
Привет @Sheinbergon, спасибо за ваш ответ. Я только что выполнил удаленную отладку приложения prodc и понял, что при отладке по строкам все свойства строятся нормально, за исключением этой строки java.naming.ldap.factor.socket. Это свойство вообще не добавляется в список свойств. Есть ли у вас какие-либо предложения, как это исправить или в чем может быть причина? :/
@AhmetEroğlu, пожалуйста, что вы имеете в виду, когда говорите, что это свойство вообще не добавлено в список свойств?
@jccampanero Привет, в исходном коде выше, не могли бы вы увидеть область, где я заполняю переменную props в типе свойств. Есть моя проблема: если я запускаю исходный код из eclipse, все эти привязки ключ-значение без проблем заполняются реквизитами. Однако, если я запускаю проект как файл jar за пределами eclipse и выполняю удаленную отладку, я вижу, что к свойствам добавляются только имя пользователя, userpasword и эта фабрика контекста, когда дело доходит до этой фабрики сокетов, она не помещает ее и вид дает исключение.
@AhmetEroğlu Ну, просто чтобы быть уверенным - вы говорите, что не видите их через отладчик, или вы на самом деле печатаете среду через отладчик и не видите этих значений? Я бы предложил создать тупую функцию для вывода содержимого props
и оценки его непосредственно перед созданием InitialDirContext
. Если это все еще так * вы не видите переменную) ну... я предлагаю вам получить банку и декомпилировать ее локально. У меня такое ощущение, что на сервере нет правильной версии.
@Sheinbergon Привет, большое спасибо за вашу помощь, да, вы совершенно правы, я узнал о том, что правильный файл jar неправильно загружается в конечный продукт. Я не знаю, как это происходит и почему, но, по крайней мере, я знаю проблему. Спасибо еще раз!
@AhmetEroğlu здорово. Поскольку это ответ, который помог вам решить проблему, я был бы признателен, если бы вы приняли мой ответ как правильный.
Ваш код выглядит нормально, и вся предоставленная конфигурация кажется правильной.
После углубления в проблему - пожалуйста, посмотрите разные комментарии к основному вопросу - применяя разные конфигурации и стратегии отладки, как вы указали, проблема, похоже, связана с тем, как создается установка, отдельная программа, а не с код интеграции сервера LDAP, представленный в вопросе.
нет помощи от старших разработчиков? :(