nullpointerexception для dispatcherTypes = {DispatcherType.REQUEST} с использованием красивых лиц

привет, я использую jsf2.0, prettyfaces, Primesfaces

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

@WebFilter(urlPatterns= {"*.xhtml"} , dispatcherTypes = {DispatcherType.REQUEST})
public class Authentication implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
System.out.println("[Authentication Filter] : init Method");
}
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
HttpSession session = request.getSession(false);
PrettyContext context = PrettyContext.getCurrentInstance(request);      
if (!(context.getCurrentMapping().getId().equals("login")) && (session == null || session.getAttribute("username") == null)) {
{
response.sendRedirect(request.getContextPath()+"/login");
}
else {
chain.doFilter(req, res); // Logged-in user found, so just continue request.
}
@Override
public void destroy() {}
}

веб.xml

<welcome-file-list>
<welcome-file>/</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>

довольно-config.xml

<url-mapping id="home"> 
<pattern value="/" /> 
<view-id value="index.xhtml" />
</url-mapping> 

когда я использую dispatcherTypes = {DispatcherType.REQUEST}, я получаю исключение нулевого указателя в context.getCurrentMapping().getId() этого оператора, который использует в операторе if, см. выше, но когда я dispatcherTypes = {DispatcherType.FORWARD}, он отлично работает для меня Что происходит, может ли какой-нибудь орган направить меня? спасибо, и я хочу знать разницу между DispatcherType.REQUEST и DispatcherType.FORWARD, другой вопрос, когда я использую FacesContext.getCurrentInstance().getExternalContext().invalidateSession(); для удаления сеанса, и если я нажму кнопку НАЗАД в браузере, он перенесет меня на предыдущую страницу, почему браузер показывает мне личную страницу?, я хочу, чтобы страница входа была на кнопке НАЗАД, спасибо.


person mo sean    schedule 14.04.2013    source источник


Ответы (1)


PrettyFaces реализует перезапись URL-адресов, перехватывая входящие запросы в фильтре сервлетов и затем перенаправляя их на реальный URL-адрес.

DispatchType фильтра настраивает, для какого типа запроса должен применяться фильтр. По умолчанию используется REQUEST, что является обычным случаем. Если вы установите значение FORWARD, оно будет применяться только к запросам, пересылаемым внутри (что и делает PrettyFaces).

В случае REQUEST вы получаете NPE, потому что ваш фильтр выполняется перед фильтром PrettyFaces, и поэтому вы не можете получить доступ к PrettyContext.

Для вас абсолютно нормально использовать FORWARD в вашем случае. Единственное, что вы должны помнить, это то, что HttpServletRequest.getRequestURI() будет возвращать настоящий URL вместо красивого для перенаправленных запросов.

Ваша проблема с кнопкой «Назад», вероятно, связана с кэшированием. Если вы не установите правильные кэширующие головки, браузер будет кэшировать последнюю страницу, поэтому нажатие НАЗАД просто отобразит последнюю страницу без отправки запроса на сервер.

person chkal    schedule 15.04.2013