Εισαγωγή Παραμέτρων από φόρμα ή URL από Java Servlets σε κωδικοποίηση UTF-8


Πολλάκις έχουμε χρειαστεί να εισάγουμε μια φόρμα με δεδομένα. Αποτελεί εδώ και δεκαετίες πλέον ένα αναπόσπαστο μέρος του web, έτσω και για τις βασικές πληροφορίες login ακόμα και σε administration επίπεδο. Οι δημοφιλέστεροι τρόποι για να λαμβάνουμε δεδομένα είναι ή μέσω GET ή μέσω POST.
Σημείωση:
Αν δεν ξέρετε πως να κάνετε servlets μπορείτε να δείτε τα παρακάτω άρθρα:

Όπως και σε αυτό το άρθρο .

Για την μέθοδο GET πρέπει να υλοποιήσετε αυτήν την μέθοδο:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

Ενώ για την μέθοδο POST την παρακάτω μέθοδο:


public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

Εφόσον υλοποιήσαμε τις μεθόδους εντός αυτές πρέπει να καλέσετε την εξής μέθοδο προκειμένου να πάρετε το αποτέλεσμα:

request.getParameter(^όνομα παραμέτρου^);

Όπου ^όνομα παραμέτρου^ ένα όνομα που αντιστοιχεί είτε στην παράμετρο που βάζουμε μετά το ?  στο url ή στο όνομα που βάζουμε στο <input type=»text» /> εκεί που είναι το name.
Πχ. Αν το url είναι http://example.com:8080/test?a=’a’&b=1 και θέλουμε να πάρουμε την τιμή του a τότε καλούμε την μέθοδο ως εξής:

request.getParameter("a");

Εντός της doGet.

Ενώ αν έχουμε την εξής φόρμα:

<form method="POST" action="./test">
<input type="text" name="test">
<input type="submit" value="Submit"/>
</form>

Και θέλουμε να πάρουμε ότι βάζουμε στο text input με όνομα test αντίστοιχα καλούμε την μέθοδο:

request.getParameter("test");

Εντός της doPost.

Παραδόξως και εντός της doPost μπορούμε να παίρνουμε τις παραμέτρους και από φόρμα ΚΑΙ από url με την μέθοδο request.getParameter. Το ποια θα καλεστεί εξαρτάτε αν κάνουμε HTTP Get ή Http POST.

Παράδειγμα:

Δημιουργούμε το εξής servlet (σύμφωνα με τα βήματα που είδαμε εδώ αν δεν ξέρετε μπορείτε κάλλιστα να δείτε πρώτα το άρθρο στο link):

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

public class Params extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        String var=request.getParameter("message");
        PrintWriter out=response.getWriter();

        out.println("<!DOCTYPE HTML><html><body>");
        out.println("The message is"+var);
        out.println("</body></html>");
    }
}

Στο index.jsp (φάκελος webapp) βάζουμε τα εξής:

<!DOCTYPE html>
<html>
<body>
<h1>Entry via POST:</h1>
    <form method="POST" action="./params">
        <input type="text" name="message"/>
        <input type="submit"  value="Submit"/>
    </form>
<h1>Entry via GET:</h1>
    <form method="GET" action="./params">
        <input type="text" name="message"/>
        <input type="submit"  value="Submit"/>
    </form>
</body>
</html>

Και σαφώς μην ξεχνάτε να βάλετε και το κατάλληλο περιεχόμενο στο web.xml:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>For article servlet</display-name>
    <servlet>
        <servlet-name> Params</servlet-name>
        <servlet-class> Params</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Params</servlet-name>
        <url-pattern>/params</url-pattern>
    </servlet-mapping>
</web-app>

Σε απλά Ελληνικά αυτό που κάνει είναι να παίρνει κάτι που λέγεται message είτε στο URL (μέσω GET) είτε μέσω POST και το εμφανίζει. Παρατηρήστε στην δεύτερη φόρμα εφόσον κάνετε submit το πως αλλάζει το URL.

Παρόλα αυτά υπάρχουν 3 προβληματάκια:

  1. Άμα βάλετε Ελληνικά στην φόρμα ενδεχομένως να σας πετάει «Κινέζικα».
  2. Άμα καλέσετε το /params σκέτο θα σας βγάλει: «The message is: null»
  3. Ο κώδικας είναι ευάλωτος σε XSS Atacks (Που δεν θα το δούμε πως λύνεται στην παρούσα φάση)

Για το δεύτερο λύνεται απλά ελέγχοντας αν το var είναι null ή κενό string (όχι σαν αυτό που φοράνε οι γυναίκες 😉 ). Έτσι ο Κώδικας του servlet γίνεται κάπως έτσι:

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.*;
import javax.servlet.http.*;

public class Params extends HttpServlet
{
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        doPost(request,response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        response.setContentType("text/html;charset=UTF-8");
        response.setCharacterEncoding("UTF-8");

        String var=request.getParameter("message");
        PrintWriter out=response.getWriter();

        out.println("<!DOCTYPE HTML><html><body>");
        if(var != null && !var.equals(""))
        {
            out.println("The message is: "+var);
        }
        else
        {
            out.println("No params Given");
        }
        out.println("</body></html>");
    }
}

Ενώ για το πρώτο κάνουμε τα εξής:

Στο web.xml βάζουμε τα εξής:

    <filter>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </filter>

    <filter-mapping>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
        </jsp-property-group>
    </jsp-config>

Που ουσιαστικά μας επιτρέπει να ορίζουμε τις POST παραμέτρους υπό μορφή UTF-8. Έτσι το web.xml θα γίνει:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>For article servlet</display-name>

    <filter>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <async-supported>true</async-supported>
    </filter>

    <filter-mapping>
        <filter-name>setCharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <page-encoding>UTF-8</page-encoding>
        </jsp-property-group>
    </jsp-config>

    <servlet>
        <servlet-name> Params</servlet-name>
        <servlet-class> Params</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Params</servlet-name>
        <url-pattern>/params</url-pattern>
    </servlet-mapping>
</web-app>

Ενώ σε περίπτωση που έχετε πρόβλημε και με το GET η εξακολουθείτε να έχετε πρόβλημα με το encoding μπορείτε στο /etc/tomcat7/server.xml να βάλετε τα εξής:

 useBodyEncodingForURI="true"

Εκεί που λέει <Connector … /> πριν το />

Έτσι οι εν λόγο γραμμές θα γίνουν:

    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443"  
               useBodyEncodingForURI="true"/>

Και μετά δίνουμε (αν χρησιμοποιούμε Linux):

sudo service tomcat7 force-reload
Advertisements

One thought on “Εισαγωγή Παραμέτρων από φόρμα ή URL από Java Servlets σε κωδικοποίηση UTF-8

  1. Παράθεμα: Φόρτωση σελίδας JSP από Servlet | Pc_magas' Blog

Σχολιάστε

Εισάγετε τα παρακάτω στοιχεία ή επιλέξτε ένα εικονίδιο για να συνδεθείτε:

Λογότυπο WordPress.com

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό WordPress.com. Αποσύνδεση / Αλλαγή )

Φωτογραφία Twitter

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Twitter. Αποσύνδεση / Αλλαγή )

Φωτογραφία Facebook

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Facebook. Αποσύνδεση / Αλλαγή )

Φωτογραφία Google+

Σχολιάζετε χρησιμοποιώντας τον λογαριασμό Google+. Αποσύνδεση / Αλλαγή )

Σύνδεση με %s