我想要实现的是代理请求 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/