JSP: pagina inclusa con request.getParameter() da errore 500

di sevenjeak il
6 risposte
Salve,

Da molto tempo che non scrivo su questo forum, ansi, si può dire che lo perso proprio di vista, comunque lasciamo perdere ora e passiamo al mio problema.

Sto iniziando a studiare JSP ( per poi passare al JEE ), vorrei poter fare una pagina con contenuto incluso a seconda del parametro passato via GET, un po come si fa con php con il comando include($_GET["pagina"] . ".php"), e per realizzarlo ho scritto questo codice:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>jCommerce</title>
<link rel="stylesheet" href="css/main.css" media="screen" />
</head>
<body>
   <header>
     <font color="blue">l</font><font color="#030142">Ogo</font>
     <div id="user-area">
        <a href="index.jsp?page=login">Log in</a>
     </div>
   </header>
   <main>
      <%
      if (request.getParameter("page") != null) {
    	  %>
    	  <jsp:include page="pages/<%=request.getParameter("page") %>.jsp"></jsp:include>
    	  <%
      }
      %>
   </main>
</body>
</html>
Il problema è ché, quanto la eseguo sul mio application server ( tomcat10), mi ristituisce errore 500 con la sequente eccessione:
org.apache.jasper.JasperException: /index.jsp (line: [19], column: [61]) equal symbol expected
	org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:41)
	org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:292)
	org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:98)
	org.apache.jasper.compiler.Parser.parseAttribute(Parser.java:227)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:162)
	org.apache.jasper.compiler.Parser.parseAttributes(Parser.java:153)
	org.apache.jasper.compiler.Parser.parseInclude(Parser.java:861)
	org.apache.jasper.compiler.Parser.parseStandardAction(Parser.java:1128)
	org.apache.jasper.compiler.Parser.parseElements(Parser.java:1468)
	org.apache.jasper.compiler.Parser.parse(Parser.java:138)
	org.apache.jasper.compiler.ParserController.doParse(ParserController.java:244)
	org.apache.jasper.compiler.ParserController.parse(ParserController.java:105)
	org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:206)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:391)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:367)
	org.apache.jasper.compiler.Compiler.compile(Compiler.java:351)
	org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:603)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:380)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:328)
	jakarta.servlet.http.HttpServlet.service(HttpServlet.java:774)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
Da cosa può dipendere? dove sbaglio?

6 Risposte

  • sevenjeak ha scritto:


        	  <jsp:include page="pages/<%=request.getParameter("page") %>.jsp"></jsp:include>
    Il problema è ché, quanto la eseguo sul mio application server ( tomcat10), mi ristituisce errore 500 con la sequente eccessione:

    org.apache.jasper.JasperException: /index.jsp (line: [19], column: [61]) equal symbol expected
    No, non puoi mettere <%= %> "in mezzo" ad altre parti letterali. Se vuoi usare <%= %> devi rendere tutto il valore una expression. E oltretutto bisogna mettere gli apici singoli per l'attributo page.
    <jsp:include page='<%= "pages/" + request.getParameter("page") + ".jsp" %>'></jsp:include>
                      ?                                                       ?
    E c'è anche un altro modo (più compatto), ovvero usando l'Expression Language:
    <jsp:include page="pages/${param.page}.jsp"></jsp:include>
    Sappi comunque che questo non è buon approccio, perché il client può tentare e richiedere di includere il file che vuole e questo di per sé è un bel "buco di sicurezza". L'unica cosa che nel tuo caso "salva" un po' è il fatto che hai fissato .jsp dietro, quindi non si può chiedere davvero qualunque file. Ma comunque non è buono lo stesso.

    sevenjeak ha scritto:


    Sto iniziando a studiare JSP ( per poi passare al JEE )
    P.S.: JSP è JavaEE (perlomeno riguarda la parte dei web component)

    P.S.2: dato che parli di Tomcat 10, attenzione, perché supporta JakartaEE, che si differenzia da JavaEE principalmente per il cambio del package principale che da javax.**** diventa jakarta.****
    Si tratta di una grossa "rottura" con il passato, vecchie webapp non funzionano con Tomcat 10 e le nuove webapp con JakartaEE non funzionano con vecchi Tomcat.
  • Ok, grazie per la risposta, ho optato per le expression language e funziona.

    andbin ha scritto:


    Sappi comunque che questo non è buon approccio, perché il client può tentare e richiedere di includere il file che vuole e questo di per sé è un bel "buco di sicurezza". L'unica cosa che nel tuo caso "salva" un po' è il fatto che hai fissato .jsp dietro, quindi non si può chiedere davvero qualunque file. Ma comunque non è buono lo stesso.
    Non ho ben capito, in che senso è un problema di sicurezza.
  • Immagina di non aver aggiunto alla fine ".jsp" e che l'account che esegue la tua web app abbia accesso completo al file system ;

    ecco che modificando ad arte il parametro 'page' della richiesta http può includere nella risposta un file con dati sensibili
    che sarebbero visualizzati nel suo browser
  • Veramente io avevo pensato anche di inserire un controllo sull'esistenza della pagina prima di eseguire l'include. comunque grazie per la risposta, o capito
  • sevenjeak ha scritto:


    Veramente io avevo pensato anche di inserire un controllo sull'esistenza della pagina
    Testare che una pagina esista fisicamente è più critico. Semmai un controllo sul parametro, es. che sia una di N stringhe note.
  • Ok, ho capito, grazie
Devi accedere o registrarti per scrivere nel forum
6 risposte