gpt4 book ai didi

java - 与Tomcat的 war 如何交付Realm?

转载 作者:行者123 更新时间:2023-11-28 22:55:23 25 4
gpt4 key购买 nike

我们有一个在 Tomcat 7.0.56 上运行的简单 Web 应用程序。现在我们想用我们的自己的身份验证领域。

public class SpecialAuth extends DataSourceRealm{
@Override
public Principal authenticate(String username, String credentials){
....
}
}

这个是在war里面的/META-INF/context.xml里面定义的

<Context>
<Realm className="some.package.SpecialAuth" dataSourceName="jdbc/MySQL" />
</Context>

SpecialAuth.class 放在哪里?

我们所期望的只是在我们的 war 中拥有 SpecialAuth.class,但随后我们在启动时遇到了以下异常

Caused by: java.lang.ClassNotFoundException: some.package.BackOfficeAuth
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
....

如果我们制作一个 jar,将其放入 $TOMCAT/lib 中,一切正常。

但这不是解决方案!这意味着每次我处理此类时,我都必须接触我的 tomcat 服务器并且无法使用正常部署。

如何在不一直接触tomcat的情况下使用内置的身份验证机制ß

最佳答案

正如你所说,我不喜欢你的回答 :) 所以我所做的(我 100% 确定你不喜欢它)是将领域设置为可能的肮脏方式,但现在我可以运行它在一个被触及的tomcat上。经过 163 次验收测试后,似乎没有任何问题。

public final class ContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent event) {
ServletContext servletContext = event.getServletContext();
TomcatContextManipulator tomcat = new TomcatContextManipulator(servletContext);
tomcat.applyRealm(new MyOwnRealm());
}
}

.

public class TomcatContextManipulator {
private static final String EXPEXCTED_TOMCAT_VERSION = "7.0.52.0";

private ApplicationContextFacade servletContext;

/**
* @param servletContext must be of type {@link ApplicationContextFacade}
*/
public TomcatContextManipulator(ServletContext servletContext) {
checkTomcatVersion();

ensureEquals(servletContext.getClass(), ApplicationContextFacade.class, "class of servletContext");
this.servletContext = (ApplicationContextFacade) servletContext;
}

/**
* checks if the correct version of tomcat is in use, throws {@link IllegalStateException} if not
*/
private void checkTomcatVersion() {
// we use several internal parts of tomcat (for example with reflection)
// by doing this we bind ourself hardly to a explicit version
ensureEquals(EXPEXCTED_TOMCAT_VERSION, ServerInfo.getServerNumber(), "Tomcat-Server-Version");
}

/**
* overrides the existing realm with the given on
*/
public void applyRealm(Realm realm) {
ensureNotNull(realm, "realm");
ApplicationContext applicationContext = (ApplicationContext) ReflectionUtil.get(servletContext, "context");
StandardContext standardContext = (StandardContext) ReflectionUtil.get(applicationContext, "context");
standardContext.setRealm(realm);
}
}

注意:

  • Reflection.get() 返回给定对象的(私有(private))实例变量的值
  • ensure...() 类似于 assert... 但它会抛出异常

关于java - 与Tomcat的 war 如何交付Realm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28669268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com