Java сервлет в качестве прокси для веб-сервера Apache - PullRequest
1 голос
/ 27 августа 2010

У меня есть веб-сервер apache, который используется для обслуживания php и статических веб-файлов. Для того, чтобы использовать активную аутентификацию каталогов, я написал некоторый код, который может подключаться к AD через JNDI и аутентифицировать пароли и группы имен пользователей. Я хотел бы отобразить все запросы на страницы в apache через мой сервлет, чтобы убедиться в наличии действительного сеанса, а затем, если им придется снова войти в систему, у них есть правильная группа AD для посещения определенного URL. Моя проблема в том, что когда я сопоставляю свой сервлет с каждым URL с помощью / *, он не может пересылать запросы на те страницы, которые я пытаюсь получить. Он просто пересылает запрос моему сервлету и вызывает его метод doGet, пока не возникнет исключение сервлета. Мне нужна функциональность прозрачного прокси, но я не могу этого понять. У кого-нибудь есть конкретные примеры прозрачного прокси сервлета или есть способ сделать это с сервлетами? Функция пересылки сервлета, кажется, делает его идеальным средством для этого, но я застрял.

Код фильтра

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>

1 Ответ

1 голос
/ 27 августа 2010

Поскольку сервлет отображается на /*, RequestDispatcher#forward() вызовет его снова, что приведет к бесконечному циклу и, наконец, к StackOverflowError (или к некоторому другому исключению в зависимости от рассматриваемого сервлет-контейнера.который может иметь встроенную функцию предотвращения рекурсии, которая запускается после определенного количества рекурсивных вызовов).

В конце концов, Servlet не совсем подходящий инструмент для работы, вы бы хотели использовать Filter здесь.Реализуйте javax.servlet.Filter и выполните ту же работу в методе doFilter().Он не будет вызывать себя рекурсивно при отображении на /*, так как по умолчанию он прослушивает только запросы, но не переадресацию и не включает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...