2010-08-18 2 views
3

Прошу прощения, если мой вопрос не имеет никакого смысла. Итак, вот что у меня есть: 2 страницы, A.jsf и B.jsf. Когда я нажимаю кнопку в A.jsf, код устанавливает значение object и перенаправляет на B.jsf. Содержит B.jsf, зависит от того, какой объект я установил в A.jsf (который зависит от того, какую кнопку я нажимаю). Поэтому я не хочу, чтобы позволить пользователю вводить это в веб-браузереЗапретить пользователю делать запрос GET на страницу

http://myhost:myport/myproject/B.jsf

и получить непосредственно B.jsf. Итак, нет запроса GET на B.jsf, только POST. И если я вижу запрос GET на B.jsf, я перенаправляю на A.jsf. Я чувствую, что решение находится внутри web.xml.
Кстати, я использую Netbean 6,8 и Java EE 6

EDIT Вот решение. Благодаря BalusC
MyFilter.java

package org.xdrawings.filter; 

public class MyFilter implements Filter{ 

    private FilterConfig filterConfig = null; 

    public void destroy(){} 

    public void init(FilterConfig filterConfig){ 
     this.filterConfig = filterConfig; 
    } 

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException{ 
     HttpServletRequest req = (HttpServletRequest)request; 
     HttpServletResponse res = (HttpServletResponse) response; 
     if("GET".equals(req.getMethod()) && "/B.jsf".equals(req.getServletPath())){ 
      res.sendRedirect("A.jsf"); 
     }else { 
      chain.doFilter(request, response); 
     } 
    } 
} 

затем в мой web.xml

<filter> 
    <filter-name>My Filter</filter-name> 
    <filter-class>org.xdrawings.filter.MyFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>My Filter</filter-name> 
    <url-pattern>*.jsf</url-pattern> 
</filter-mapping> 

All credits go to BalusC

ответ

7

Да, как вы уже догадались, это может управляться от web.xml. Вам необходимо объявить security-constraint на url-pattern от /b.jsf с http-method от GET, а также пустым auth-constraint.

<security-constraint> 
    <display-name>Prevent GET requests on the b.jsf file</display-name> 
    <web-resource-collection> 
     <web-resource-name>The b.jsf file</web-resource-name> 
     <url-pattern>/b.jsf</url-pattern> 
     <http-method>GET</http-method> 
    </web-resource-collection> 
    <auth-constraint /> 
</security-constraint> 

Это, однако, показывает HTTP 403 error. Это не перенаправляет (и не может) на a.jsf (по крайней мере, не запустив собственную страницу ошибок 403 с необходимыми проверками, но это просто уродливо). Если редирект является обязательным, другие решения:

  1. В конструкторе запроса боб область действия, связанные с проверкой на b.jsf постбэка по ResponseStateManager#isPostback(), а затем перенаправлять соответствующим образом с использованием ExternalContext#redirect().

    FacesContext context = FacesContext.getCurrentInstance(); 
    if (!context.getRenderKit().getResponseStateManager().isPostback(context)) { 
        context.getExternalContext().redirect("a.jsf"); 
    } 
    

    Если вы уже на JSF 2.0, вы также можете использовать удобный метод FacesContext#isPostback() вместо, что меньше печатать.

  2. Или как более высокоуровневый подход, создайте Filter, который выполняет именно эту задачу. Запрошенная страница и метод HTTP могут быть получены HttpServletRequest#getServletPath() и getMethod() соответственно, и перенаправление может быть выполнено с использованием HttpServletResponse#sendRedirect().

    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 
    if ("GET".equals(req.getMethod()) && "/b.jsf".equals(req.getServletPath())) { 
        res.sendRedirect("a.jsf"); 
    } else { 
        chain.doFilter(request, response); 
    } 
    

    Это может быть легко расширена для будущих методов и страниц, которые можно настроить в соответствии с каждой init-param из Filter в web.xml.

+1

Меня это поражает, насколько вы знаете о веб-разработке. Ваш первый метод отлично работает. Тем не менее, я как бы хочу узнать второй метод, так как я всегда слышал о людях, создающих фильтр, но не уверен, что это такое. Похоже, вы создаете пользовательский «Фильтр» здесь и говорите проекту, чтобы использовать этот фильтр через 'web.xml', правильно? Позвольте мне попробовать, и я вернусь к вам. Большое спасибо man –

+0

Я реализую ваш второй метод, но у меня есть пара вопросов, можете ли вы посмотреть мое обновленное сообщение, чтобы увидеть мою реализацию. –

+1

Фильтр может быть отображен на '' '/ *' или более конкретном '* .jsf' или даже более конкретном'/b.jsf' (а затем удалить ненужную проверку в блоке 'if'). '' не является обязательным. Если вы определите любой, он будет доступен ['FilterConfig # getInitParameter()'] (http://download.oracle.com/javaee/5/api/javax/servlet/FilterConfig.html#getInitParameter%28java.lang .String% 29) внутри метода 'init()', который затем можно назначить в качестве переменной экземпляра и использовать его далее в логике 'doFilter()'. Например. запятую строку имен и т. д. – BalusC

1

Есть ли что-то не так с делать B.jsf чек на значение, установленное в A.jsf, и выдает редирект, если это нет?