【问题标题】:nullpointerexception on dispatcherTypes = {DispatcherType.REQUEST} using prettyfacesdispatcherTypes = {DispatcherType.REQUEST} 上的 nullpointerexception 使用漂亮的面孔
【发布时间】:2013-04-06 22:37:27
【问题描述】:

你好,我正在使用 jsf2.0,漂亮的脸,素数的脸

我创建了一个过滤器来监控用户会话

@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() {}
}

web.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>

漂亮的配置.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();用于销毁会话 如果我从浏览器按 BACK 按钮,它会将我带到上一页,为什么浏览器会显示我的隐私页面?,我想在 BAck 按钮上登录页面 谢谢。

【问题讨论】:

    标签: jsf-2 primefaces filter servlet-filters prettyfaces


    【解决方案1】:

    PrettyFaces 通过在 Servlet 过滤器中拦截传入的请求,然后将其转发到真实的 URL,从而实现 URL 重写。

    过滤器的DispatchType 配置过滤器应应用于哪种请求。默认为REQUEST,这是通常的情况。如果您将其设置为FORWARD,则它仅适用于内部转发的请求(PrettyFaces 就是这样做的)。

    如果是REQUEST,您将获得 NPE,因为您的过滤器在 PrettyFaces 过滤器之前执行,因此您无法访问 PrettyContext

    在您的情况下使用FORWARD 绝对没问题。您唯一需要记住的是HttpServletRequest.getRequestURI() 将返回真实 URL,而不是转发请求的漂亮URL。

    您的后退按钮问题可能与缓存有关。如果您没有设置正确的缓存头,浏览器将缓存最后一页,因此按 BACK 将简单地重新显示最后一页,而不向服务器发送请求。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 2015-03-30
      • 2010-11-18
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 1970-01-01
      • 2012-10-18
      相关资源
      最近更新 更多