2011-01-25 7 views
6

Provo a reindirizzare a un'altra azione e a trasmettere un parametro stringa. Funziona senza problemi, ma ho un problema di codifica se utilizzo le dieresi tedesche.Struts 2 problema di codifica dei parametri durante il reindirizzamento a un'altra azione

Questo è il mio codice: Prima azione ha un messaggio sul campo con getter e setter. Nell'azione ho impostato la stringa.

private String message; 
public String action1() 
{ 
    message = "ö"; 
    return SUCCESS; 
} 

La seconda azione ha un messaggio di campo con getter e setter.

private String message; 

struts.xml con la definizione delle azioni sia

<action name="action" method="action1" class="de.samba.control.actions.Action1"> 
<result name="success" type="redirectAction"> 
<param name="actionName">action2</param> 
<param name="message">${message}</param> 

<action name="action2" class="de.samba.control.actions.Action2"> 
<result name="success">/pages/showMessage.jsp</result> 

Se Io non utilizzando il reindirizzamento e mostrare il messaggio su un jsp , tutto funziona bene. La codifica è corretta. Se reindirizzamento a un'altra azione, il setter del campo messaggio imposta la stringa di formattazione errata "ö". Non riesco a trovare la soluzione. Qualcuno mi puó aiutare per piacere?

Filtro proprio:

<filter> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <filter-class>de.samba.control.CharacterEncodingFilter</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>CharacterEncodingFilter</filter-name> 
    <url-pattern>*.action</url-pattern> 
</filter-mapping> 

Filtro classe

public class CharacterEncodingFilter implements Filter { 

    @Override 
public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain next) throws IOException, ServletException 
{ 
    String encoding = request.getCharacterEncoding(); 
    if (encoding == null || encoding.length() == 0) 
    { 
     request.setCharacterEncoding("UTF-8"); 
    } 
    encoding = request.getCharacterEncoding(); 
    next.doFilter(request, response); 
} 
} 

Poi ho provato questo filtro:

<filter> 
<filter-name>encodingFilter</filter-name> 
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 
    <init-param> 
     <param-name>encoding</param-name> 
     <param-value>UTF-8</param-value> 
    </init-param> 
    <init-param> 
     <param-name>forceEncoding</param-name> 
     <param-value>true</param-value> 
    </init-param> 
</filter> 

Questo non funziona troppo. Qualcuno conosce questo problema? Forse è causato da Spring Security.

risposta

5

il problema era un problema di gatto e non un problema di puntoni. La soluzione è impostare URIEncoding del Connector su "utf-8" in server.xml. Vedi http://struts.apache.org/2.0.14/docs/how-to-support-utf-8-uriencoding-with-tomcat.html

+0

Ciao Rafael., Ho affrontato lo stesso problema (inizialmente funzionava bene in FF e non in IE), dopo aver seguito la tua soluzione, funziona bene in IE, ma non funziona più in FF, potresti per favore aiutami a risolvere questo .. è molto molto urgente .. grazie in anticipo !!! –

0

Questa domanda sembra che sia lo stesso problema si stanno avendo:

Struts2 request character encoding

+0

Ciao, grazie per la risposta. Questa sembrava essere la soluzione giusta. Ma non funziona.Provando questo ho l'impressione che forse non lo struts2 sia il debito, ma Spring Security. Perché provo con un filtro Charakterencoding e con org.springframework.web.filter.CharacterEncodingFilter. Entrambe le soluzioni non funzionano. Scrivo il codice del filtro per la mia domanda. Forse ho fatto degli errori. – Rafael

+0

Questo non dovrebbe essere il problema. Quando reindirizza un'azione tramite redirectAction, non penso che il web.xml sia considerato, o Spring Security per quella materia. La mia ipotesi sarebbe che abbia qualcosa a che fare con gli intercettori che trasferiscono il valore da un'azione all'altra. Forse un bug? – Akku

+0

Secondo http://struts.apache.org/2.0.14/docs/redirect-action-result.html, redirectAction "reindirizzerà il browser a un URL che richiama l'azione specificata". Se sta reindirizzando il browser, sta creando una nuova richiesta piuttosto che passare attraverso gli intercettori e passerà nuovamente attraverso il web.xml. –

0

Immagino che tu possa provare a salvare la variabile del messaggio in sessione. inoltre, afaik, in generale, nell'applicazione web, il modo consigliato di passare informazioni da un'azione a un'altra azione è utilizzare la sessione.

e se qualcos'altro fallisce, credo che ci sia un modo hacker. è possibile rilasciare il risultato su una normale pagina Web (jsp). metti quel valore del messaggio in un elemento di input. poi scrivi un javascript che invia automaticamente il valore all'interno di quell'elemento di input. non raccomandato, però.

+0

Non è vero. Un reindirizzamento lato server da un'azione all'altra dovrebbe essere possibile, e se la prima azione richiede che tu invii un messaggio all'utente, dì se hai un utenteEnteredData.action che prende i dati del modulo e li inserisce in un DB e in una pagina RenderProfilePage .action che ha qualche logica per renderizzare una pagina, non dovresti aver bisogno di usare la sessione. Le sessioni sono disponibili per il mantenimento dello stato tra richieste su un protocollo stateless. – Akku

1

Forse il problema è nel modo in cui viene generato l'url (che attiva l'invocazione dell'azione). Ad esempio, se le generazioni di url sono qualcosa di simile in basso, sii consapevole del attribute escape:

<s:url namespace="/" action="recursoNuevo" var="recursoNuevo" > 
    <s:param name="contextPath"> 
     <s:property value="contextPath" escape="false"/> 
    </s:param> 
    </s:url> 
Problemi correlati