tomcat 6 HTTP 身份验证

Posted

技术标签:

【中文标题】tomcat 6 HTTP 身份验证【英文标题】:tomcat 6 HTTP authentication 【发布时间】:2011-10-23 08:20:18 【问题描述】:

我尝试在 Redhat Enterprise 5.2 上的 Tomcat 6.0.9 中部署一个 Web 应用程序。我得到了 j2ee-1.4.jar 放在 /lib 目录中。我发现重启tomcat后出现了几个问题。但还要注意,删除上面的 jar 可以解决下面列出的问题。我被告知我必须包含 j2ee-1.4.jar,但我不知道我需要完成哪些步骤才能完成这项工作。

 First, when attempting to login to Tomcat Manager I am no longer presented with a login dialog. It jumps right to the 401 page stating "This request requires HTTP authentication ()"

此事件的经理日志显示以下内容:

 org.apache.catalina.core.ApplicationDispatcher invoke
SEVERE: Servlet.service() for servlet jsp threw exception
javax.servlet.ServletException: javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:274)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:687)
        at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
        at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:403)
        at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
        at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:424)
        at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:343)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:144)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
        at java.lang.Thread.run(Thread.java:662)

其次,我注意到基本比较的 JSP 示例会生成以下内容:

org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet jsp threw exception
org.apache.jasper.JasperException: Unable to compile class for JSP:


Stacktrace:
        at org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:85)
        at org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:330)
        at org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:415)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:308)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
        at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
        at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
        at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:308)
        at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
        at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:860)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
        at java.lang.Thread.run(Thread.java:662)

任何帮助将不胜感激

谢谢

【问题讨论】:

【参考方案1】:

删除那个 JAR 文件。它确实属于您的网络应用程序库。这是一个 Glassfish 特定的 JAR 文件,其中包含一个过时的 Servlet API 规范,它只会与 Tomcat 自己的 JAR 文件发生冲突。此异常是类路径中的类版本冲突的结果:

javax.servlet.jsp.JspFactory.getJspApplicationContext(Ljavax/servlet/ServletContext;)Ljavax/servlet/jsp/JspApplicationContext;

The mentioned method 是 Servlet 2.5 / JSP 2.1 中的新功能。 Tomcat 6.0 本身是一个 Servlet 2.5 容器,但包含的 j2ee-1.4.jar 是一个 Servlet 2.4 / JSP 2.0 版本。

即使您的 JAR 文件的 Servlet API 版本相同,您也不应该在您的 web 应用程序库中包含特定于 servletcontainer 的 JAR 文件。它会使你的 webapp 不可移植。

如果您这样做是为了规避未解决的javax.servlet.* 类的编译错误,那么您应该以不同的方式解决这个问题。例如,您应该在编译时类路径中指向 Tomcat 自己的 servlet-api.jar 文件。例如

javac -cp .;/path/to/Tomcat/lib/servlet-api.jar com/example/MyServlet.java

或者,如果您使用 Eclipse 之类的 IDE,您应该在项目的属性中将 servletcontainer 设置为 Target Runtime。这样 Eclipse 将自动将其所有库放入项目的构建路径中。

另见:

How do I import the javax.servlet API in my Eclipse project?

一旦解决了这个问题并 100% 确定有一个干净的类路径,那么您应该专注于以正确的方式解决实际问题,而不是污染类路径。如果您遇到问题,只需在 *** 上提出一个新问题即可。

【讨论】:

【参考方案2】:

在您的构建路径中的 servlet-api.jar 中会有重复的条目。删除重复的条目,或者它从你的构建路径中丢失。在完成这个清理你的项目并运行之后

【讨论】:

以上是关于tomcat 6 HTTP 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

Tomcat 身份验证和 Spring Security

具有基本身份验证的 Apache 和 Tomcat 反向代理:Tomcat 可以接收用户名吗?

JBoss 相互证书身份验证在 SSL 握手时失败

通过 Tomcat 的 Spring Boot LDAP 身份验证(预身份验证)

带有嵌入式tomcat的Spring Boot +带有身份验证用户的访问日志

带有 HTTP 基本身份验证的 Angular 6 HTTP Get 请求