Ich habe eine benutzerdefinierte Komponente in JSF 2.0 erstellt. Sein Zweck besteht darin, einen Sitzungsattributwert in einem Eingabetextfeld anzuzeigen. Ich möchte das Session-Attribut in HttpSessionListener sessionCreated
Methode erstellt werden. Das Problem ist encodeAll
Methode wird vor sessionCreated
Methode aufgerufen. Was sollte ich tun, um sessionCreated
vor encodeAll
aufgerufen zu machen?JSF 2.0 encodeAll() aufgerufen vor sessionCreated()
web.xml
<context-param>
<param-name>javax.faces.FACELETS_LIBRARIES</param-name>
<param-value>/WEB-INF/components.taglib.xml</param-value>
</context-param>
<listener>
<listener-class>mycomp.jsf.listener.MyListener</listener-class>
</listener>
components.taglib.xml
<facelet-taglib xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"
version="2.0">
<namespace>http://mycomp/jsf/components</namespace>
<tag>
<tag-name>mycomp</tag-name>
<component>
<component-type>MyComp</component-type>
</component>
</tag>
</facelet-taglib>
MyListener.java
public class MyListener implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent event) {
HttpSession session = event.getSession();
session.setAttribute("sessionid", session.getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
}
}
MyComp.java
@FacesComponent(value = "MyComp")
public class MyComp extends UIComponentBase {
public MyComp() {
setRendererType(null);
}
protected Class getComponentClass() {
return this.getClass();
}
@Override
public void decode(FacesContext context) {
//some logic
}
@Override
public void encodeAll(FacesContext context) throws IOException {
String clientId = getClientId(context) + ":token";
HttpSession session = (HttpSession) context.getExternalContext().getSession(false);
String sessionId = (String) session.getAttribute("sessionid");
if (sessionId == null || "".equals(sessionId)) {
throw new RuntimeException("sessionid is missing!");
}
ResponseWriter writer = context.getResponseWriter();
writer.startElement("input", this);
writer.writeAttribute("type", "text", "type");
writer.writeAttribute("name", clientId, "name");
writer.writeAttribute("value", sessionId, "value");
writer.endElement("input");
}
@Override
public String getFamily() {
return null;
}
}
index.xhtml
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:t="http://mycomp/jsf/components">
<h:head>
</h:head>
<h:body>
<h:form>
<t:mycomp />
</h:form>
</h:body>
</html>
die Session-ID Einstellung rein beispielhaft ist, nehme ich an? Was ist dein konkretes Problem? Haben Sie eine 'NullPointerException' in der Zeile' session.getAttribute() 'bekommen? Oder hast du eine 'RuntimeException' bekommen, die du selbst dort codiert hast? – BalusC
Ich bekomme eine "NullPointerException", da das 'session'-Objekt null ist. Bedeutet das, dass die Methode 'encodeAll' ausgeführt wird, noch bevor die Sitzung erstellt wurde? Wie auch immer, mein eigentliches Ziel ist es, eine Zufallszahl zu erstellen und sie in den Sitzungsumfang zu setzen, um CSRF zu verhindern. Ähnlicher Code in JSF 1.2 hatte 'sessionCreated' vor 'encodeBegin' aufgerufen, daher hatte ich dieses Problem nicht. – Praneeth
Sie hätten darüber in der Frage klarer sein sollen. Das habe ich schon vermutet, aber Sie haben das nicht ausdrücklich erwähnt. Ausnahmen sollten nicht ignoriert werden, als wären sie Dekoration. Ich habe eine Antwort geschrieben. – BalusC