пересылка с помощью RequestDispatcher после прохождения фильтра Java

Прежде всего позвольте мне описать, что я пытаюсь сделать, что, я думаю, довольно просто. У меня есть веб-сайт с пользователями, и я хочу ограничить доступ к странице view_profile.jsp только для зарегистрированных пользователей. У меня есть фильтр, сопоставленный с:

<url-pattern>/auth/*</url-pattern>

который выглядит так

        try {
        HttpSession session = ((HttpServletRequest)request).getSession();
        UserBean user = (UserBean)session.getAttribute("currentUser");
        if (user != null && user.isValid()){
            System.out.println("Filter: context -> " + ((HttpServletRequest)request).getContextPath()); //returns ""
            chain.doFilter(request, response);
        }
        else{
            ((HttpServletResponse)response).sendRedirect("/login.jsp"); //works fine
        }

Этот фильтр запускается, когда на странице index.jsp пользователь щелкает ссылку:

<a href="./auth/view_profile?profile=${sessionScope.currentUser.username}">
//yeah, he will 'view' himself - it's just an example

который должен привести пользователя к сервлету, сопоставленному с ViewProfileServlet, сопоставленному с:

<url-pattern>/auth/view_profile</url-pattern>

который выглядит так:

    try {
        String username = (String) request.getParameter("profile");

        // here is getting info from database and setting request attributes
        // works fine

                //response.sendRedirect("/view_profile.jsp");
                System.out.println("ViewProfileServlet: In context -> " + getServletContext().getContextPath()); // returns ""
                dis = getServletContext().getRequestDispatcher("/view_profile.jsp");
                // i've tried request.getRequestDispatcher. no difference
                System.out.println("ViewProfileServlet: forward to '/view_profile.jsp'");
                dis.forward(request, response);
            }

Что, в свою очередь, должно привести пользователя к /view_profile.jsp (в корневом контексте, а не в /auth) и работать, чего не происходит. Что происходит, так это запуск ViewProfileServlet и отображение view_profile.jsp, хотя кажется, что контекст по-прежнему /auth, потому что все ссылки на view_profile.jsp указывают, например, на localhost:8080/auth/some-page.jsp. Кроме того, файлы css не загружаются, они даже не запрашиваются (по крайней мере, согласно firebug), а источник страницы показывает ошибку 404 Glassfish, где предполагается, что css.

Я был бы очень признателен за любую помощь, я впервые делаю что-то в jsp, и я полностью потерялся здесь.


person michauwilliam    schedule 20.01.2012    source источник


Ответы (1)


Форвард происходит полностью на стороне сервера. Браузер об этом не знает. Когда он отправляет запрос /auth/view_profile и получает HTML из этого ответа, ему все равно, был ли HTML сгенерирован сервлетом, JSP, обоими или чем-то еще. Он читает HTML и считает, что он исходит из пути /auth/view_profile. Таким образом, все относительные пути в HTML относятся к /auth/view_profile.

Гораздо проще использовать абсолютные пути для ссылок на изображения, пути JS и CSS (и даже другие действия в большинстве случаев). Просто не забудьте использовать тег <c:url> для создания URL-адреса, чтобы путь к контексту веб-приложения был добавлен перед:

<script src="<c:url value='/js/myScript.js'/>" type="text/javascript"/>
                           ^-- the slash here makes the path absolute. 
person JB Nizet    schedule 20.01.2012
comment
Спасибо за ответ. Я изменил путь к css на ‹c:url ... › один, но происходит то, что на секунду он запрашивает «localhost:8080/auth/css/styles.css», который проходит (снова) через фильтр, а затем запрос css полностью исчезает. Результат тот же. - person michauwilliam; 20.01.2012
comment
Путь должен быть абсолютным: начните с /. - person JB Nizet; 20.01.2012
comment
Спасибо :) Css работает. Но что мне делать со ссылками на странице? Есть ли способ сделать так, чтобы они не указывали на контекст /auth/? Я пробовал ‹c:url value=/logout.jsp›, но он по-прежнему указывает на /auth/logout.jsp - person michauwilliam; 20.01.2012