Как перенаправить пользователя на страницу входа в JSF - PullRequest
0 голосов
/ 08 марта 2011

Я использую JSF 2.0 и facelets.Я хочу войти в систему проверки на каждой странице и перенаправить на страницу входа в случае сбоя ...

<%
HttpSession sess = request.getSession(true);

if (sess.getAttribute("userName") == null ) {
%>
<jsp:forward page="/login.xhtml"/>
<%
return;
} else {
    // some code
%>
    <%-- some other code --%>
<%
}
%>

Когда я пишу этот код, Netbeans IDE не позволит мне.

Как можноЯ использую это.

Спасибо.

Ответы [ 4 ]

3 голосов
/ 08 марта 2011

Я бы предложил использовать фильтр вместо jsp.Затем определите его как один из первых фильтров в файле web.xml.

public class DirectAccessBlockFilter implements Filter {

    private String loginPage = "login.xhtml";

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpSession session = httpRequest.getSession(false);

        if(session.getAttribute("userName") == null && !httpRequest.getServletPath().contains(loginPage)) {
            RequestDispatcher dispatcher = request.getRequestDispatcher(loginPage);
            dispatcher.forward(request, response);          
            return;
        }

        chain.doFilter(request, response);
    }

}
3 голосов
/ 08 марта 2011

Вы не можете сделать это.Это абсолютно невозможно, потому что лицевые стороны не являются JSP.Скриплетов не существует.

Кроме того, подобные вещи должны быть реализованы в фильтре сервлетов, а не на отдельных страницах.Кроме того, вам не следует делать это самостоятельно, а использовать одну из свободно доступных зрелых реализаций:

2 голосов
/ 08 марта 2011

Как и другие упомянутые, вы абсолютно не должны делать это таким образом, даже если это было возможно.

Facelets - это чистый документ XML, который анализируется анализатором XML по единственной причине создания дерева компонентов. Таким образом, только используется для размещения компонентов. Нет никакого способа включить какой-либо скриптлет.

Технически, есть несколько уловок, которые более или менее дадут вам (неправильную) идиому, которую вы ищете. Например. Вы можете поместить этот фрагмент кода в компонент поддержки и вызывать его с помощью выражения EL в начале каждой страницы. Вы также можете создать пользовательский компонент на основе Java и разместить его в начале каждой страницы. Наконец, вы можете определить свою собственную EL-функцию, содержащую этот код, и вызвать ее.

Но я не могу не подчеркнуть, что такой подход прост неверен . Используйте фильтр или фазелистенер, предложенный mmanco и Bozho. Если вы не можете с этим смириться, то, возможно, JSF и Facelets - не самая лучшая технология для вас, и вам лучше будет программировать на JSP или PHP.

2 голосов
/ 08 марта 2011

Не делай этого.Facelets - это вид по умолчанию для причины.

Вместо этого следует выполнить проверку входа в систему одним из следующих способов:

...