我有一个apache webserver,用于提供php和静态web文件。为了使用活动目录身份验证,我编写了一些可以通过JNDI连接到AD并验证用户名密码和组的代码。我想要的是通过我的servlet将所有请求映射到apache中的页面,以确保存在有效的会话,然后如果他们必须再次登录,他们有正确的AD组来访问特定的URL。我的问题是,当我使用/ *将我的servlet映射到每个url时,它无法将请求转发到我想要获取的实际页面。它只是将请求转发到我的servlet并调用它的doGet方法,直到发生servlet异常。我想要透明代理的功能,但我似乎无法从中获得。有没有人有透明代理servlet的具体示例或知道使用servlet执行此操作的方法。 servlet的转发功能似乎使这成为一个完美的工具,但我似乎陷入困境。
过滤代码
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse res = (HttpServletResponse)response;
boolean authenticated = false; //should be false when testing is done.
//skip if its the login page
if(req.getRequestURI().equals("/auth/login.jsp") || authenticated){
chain.doFilter(req, res);
}else{
req.setAttribute("protectedUrl", req.getRequestURI());
res.sendRedirect("/auth/login.jsp");
}
}
Web.xml中
(snip)
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
答案 0 :(得分:1)
因为servlet映射到/*
,RequestDispatcher#forward()
将再次调用它,导致无限循环,最后导致StackOverflowError
(或其他一些异常,具体取决于所讨论的servlet容器它可能有一些内置的递归预防,它会在一定量的递归调用后启动)。
毕竟,Servlet
并非完全适合这项工作的工具,您更愿意在这里使用Filter
。实施javax.servlet.Filter
并在doFilter()
方法中执行相同的工作。映射到/*
时,它不会递归调用自身,因为它默认只侦听请求,而不是前向或包含。