J'ai un filtre de servlet qui gère les erreurs pour les servlets vanilla et les pages JSF
.Paramètre HTTP GET SOMETIMES manquant lors de l'utilisation de JSF
Si une erreur est détectée, l'utilisateur est redirigé vers une page d'erreur où il peut donner son avis. Ensuite, j'essaie de lire la valeur dans l'objet ErrorBean
. Cependant, parfois l'erreur n'est pas présente - il y a une chance 50-50 de l'erreur étant présente.
Lorsque j'utilise
FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap()
il retourne parfois une carte avec 1 entrée et parfois une carte vide. Dans tous les cas, l'identifiant est transmis au niveau http.
Je n'arrive pas vraiment à reproduire la cause de cette erreur. Voici le code correspondant (méthodes d'assistance + implémentations vides omises). Le ErrorFilter est mappé à /*
et le ErrorBean est un bean de portée de session géré par JSF.
ErrorFilter
public class ErrorFilter implements Filter
{
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException
{
HttpServletRequest hreq = (HttpServletRequest) req;
HttpServletResponse hres = (HttpServletResponse) resp;
try
{
chain.doFilter(req, resp);
}
catch (IOException e)
{
handleError(e, hreq, hres);
}
catch (ServletException e)
{
handleError(e, hreq, hres);
}
catch (RuntimeException e)
{
handleError(e, hreq, hres);
}
}
private static void handleError(Throwable e, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
final RequestInfo requestInfo = new RequestInfo(getUri(req), req.getSession().getId(), null, null, UserFactory.getUser(), InetAddress.getByName(req.getRemoteAddr()));
String token = new DecimalFormat("00000000").format(Math.abs(RANDOM.nextInt() % Integer.MAX_VALUE));
//log msg
//send mail in a different thread
if (!req.getRequestURI().startsWith("/faces/error.jsp"))
{
resp.sendRedirect("/faces/error.jsp?token=" + token);
}
else
{
//log that an infite loop occurred
throw new ServletException(crapMsg, e);
}
}
}
ErrorBean
public class ErrorBean implements Serializable
{
private String feedback;
private String lastToken;
public String getLastErrorCode()
{
return "your token: " + getToken();
}
private String getToken()
{
final String token = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("token");
//here the "token" returns null although it is sent via get.
if (token != null)
{
if (!token.equals(lastToken))
{
// reset data on token change.
feedback = null;
}
lastToken = token;
}
return lastToken;
}
public void setFeedback(String feedback)
{
this.feedback = feedback;
}
public String getFeedback()
{
if (feedback == null)
{
feedback = getDefaultMessage();
}
return feedback;
}
public void send()
{
sendMail(lastToken,feedback);
}
}
je n'ai pas compris exactement pourquoi il échoue PARFOIS .. la solution que vous proposez fonctionnait bien, je l'ai implémenté comme une solution de contournement de cette façon. stocker l'attribut de jeton dans la session. Cela fonctionne robuste. –