java - 更改 JSP servlet (Jasper) 的类加载器

标签 java jakarta-ee tomcat servlets

我想要实现的是代理请求 URI 并根据请求用户 session 中的某些条件呈现不同的 JSP 文件。

userA -> 请求:/{container}/index.jsp -> 返回:{viewA}/index.jsp

userB -> 请求:/{container}/index.jsp -> 返回:{viewB}/index.jsp

Servlet 过滤器没有足够的控制权来做这类事情。 我想象的工作是覆盖 JSPServlet 的 URLClassLoader,这样我就可以搜索要编译的文件 [在自定义类加载器中]。这可能吗,还是有其他方法?

我在这里读到了与我想要实现的目标相关的内容:http://www.softwaresummit.com/2003/speakers/BergmanTomcat.pdf第 10 页,但是,它似乎并没有真正起作用(扩展 HttpJspBase 不会给你任何东西)。

我试图用这张[相当糟糕]的图片来说明流程:

http://80.68.91.73/pageflow.png

我更希望找到正确方向的指引,而不是完整的解决方案。问题是,我找不到合适的关键字来找到我要找的东西!

谢谢!

约翰

最佳答案

这不完全是你要求的,但你有没有考虑过只有一个index.jsp并使用forward-tag将请求转发到不同的子页面?

<% if(session.someCondition) { %>
  <jsp:forward page="index-version1.jsp"/>
<% } else { %>
  <jsp:forward page="index-version2.jsp"/>
<% } %>

你也可以使用像这样的东西从 servlet 过滤器转发请求:

FilterConfig filterConfig;

public void init(FilterConfig filterConfig) {
    this.filterConfig = filterConfig;
}

public void doFilter( ..) {

    filterConfig.getServletContext().getRequestDispatcher(<insert path to correct version of your page here>).forward(request, response);

}

如果您不想直接访问jsp 页面,您可以将它们存放在WEB-INF 下的不同子目录中。这样,您可以转发给他们,但无法直接从网络联系到他们。

关于java - 更改 JSP servlet (Jasper) 的类加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5501035/

相关文章:

java - 无法在单元测试的 Before 和 After 方法中启动/停止 Spark

java - 迁移到 Java Web Start - Applet-Desc 会被弃用吗?

java - 从 tomcat webapps 文件夹中读取属性文件

java - PHP、Java、Javascript 之间的 AES 互操作性

java - 简单的 JApplet 获取 "NoClassDefFoundError"并且不知道它来自哪里

jakarta-ee - 使用 CDI 记录最佳方法

java - Lombok 项目有哪些风险?

java - Glassfish 还是 Tomcat+OpenEJB?哪种变体更适合小型应用程序?

linux - jsvc.exec 错误 : Still running according to PID file

Tomcat 8 JDBC 领域 : change user's password