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

Java 更改JSP servlet的类加载器(Jasper),java,jakarta-ee,tomcat,servlets,Java,Jakarta Ee,Tomcat,Servlets,我想要实现的是代理请求URI,并根据请求用户会话中的某些条件呈现不同的JSP文件 即 userA->request://{container}/index.jsp->return:{viewA}/index.jsp userB->request://{container}/index.jsp->return:{viewB}/index.jsp Servlet过滤器没有足够的控制来完成这类事情。 我想象的工作方式是重写JSPServlet的URLClassLoader,这样我就可以搜索要编译的文件

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

userA->request://{container}/index.jsp->return:{viewA}/index.jsp

userB->request://{container}/index.jsp->return:{viewB}/index.jsp

Servlet过滤器没有足够的控制来完成这类事情。 我想象的工作方式是重写JSPServlet的URLClassLoader,这样我就可以搜索要编译的文件[在自定义类加载器中]。这是可能的,还是有别的办法

我在这里读到了一些与我想要实现的内容相关的东西:第10页,然而,它似乎并没有真正起作用(扩展HttpJspBase并没有给你任何东西)

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

我更多的是寻找一个正确的方向,而不是一个完整的解决方案。问题是,我找不到合适的关键字来找到我要找的

谢谢


John

这并不是您所要求的,但是您是否考虑过只使用一个index.jsp并使用forward标记将请求转发到不同的子页面

<% 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);

}
FilterConfig FilterConfig;
public void init(FilterConfig FilterConfig){
this.filterConfig=filterConfig;
}
公共过滤器(…){
filterConfig.getServletContext().getRequestDispatcher().forward(请求,响应);
}

如果您不想直接访问jsp页面,可以将它们存储在WEB-INF下面的不同子目录中。这样,您可以转发给它们,但不能直接从WEB访问它们。

复制的不仅仅是index.jsp(可能是100页)。每一个不同的连接将有一个完全不同的设计(但有一个共同的代码基)。