Неправильный URL при подключении апплета к сервлету - PullRequest
1 голос
/ 23 апреля 2011

Я пытаюсь получить доступ к сервлету из Java-апплета и установить ответ сервлета в текстовом поле апплета. Я использую Tomcat 7.0 и мой JRE / JDK полностью обновлены. Сервлет работает нормально (правильный вывод в браузере) при вызове из браузера как localhost: 8080 / hello / hello? Query = select * from airport *

(где аэропорты - это имя базы данных)

Однако, когда я запускаю апплет в appletviewer, я получаю исключение Malformed URL.

Код для апплета:

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;

/*
<applet code="lab101" width=500 height=270>
</applet>
*/

public class lab101 extends Applet implements ActionListener{

TextArea t;

Panel p,q,r;
CheckboxGroup c;
Checkbox ins,dis,del,update;     //Checkboxes are included just for testing purposes.
TextField f;
Label l1;
Button b;

public void init(){

setLayout(new FlowLayout());

b=new Button("Run");
l1=new Label("Query:");
c=new CheckboxGroup();
t=new TextArea("",10,50);
p=new Panel();
q=new Panel();
r=new Panel();


p.add(t);

ins=new Checkbox("Insert",c,false);

dis=new Checkbox("Display",c,true);

del=new Checkbox("Delete",c,false);

update=new Checkbox("Update",c,false);

f=new TextField(50);

q.add(ins);
q.add(dis);
q.add(del);
q.add(update);

r.add(l1);
r.add(f);
r.add(b);

b.addActionListener(this);

add(p);
add(q);
add(r);

try{
URL url=new URL("127.0.0.1:8080/hello/hello?query=select * from airports");


URLConnection servletconnection=url.openConnection();

servletconnection.setDoInput(true);

InputStream in=servletconnection.getInputStream();
String s="";
int ch;
loop:while(1>0){
ch=in.read();
if(ch==-1) break loop;
else s+=(char)ch;
}

t.setText(s);


}//try close

catch(MalformedURLException e){
t.setText("Malformed URL Exception occured.");}

catch(IOException e){
  t.setText("IO exception occured");}


}


public void actionPerformed(ActionEvent ae){
}


public void start(){
}

public void paint(Graphics g){
}

}//class ends

Код для сервлета:

import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.sql.*;

public class hello extends HttpServlet{

public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException {
response.setContentType("text/plain");
PrintWriter out=response.getWriter();

String query=request.getParameter("query");

Connection link=null;
Statement statement=null;
ResultSet results=null;

try{

Class.forName("org.postgresql.Driver");

String url = "jdbc:postgresql://localhost:5432/test";
link=DriverManager.getConnection(url,"postgres","hooligan");
out.println("Successful connection");
}

catch(ClassNotFoundException e){
out.println("Unable to load driver");
}

catch(SQLException e){
out.println("Cannot connect to database");
}


try{
statement=link.createStatement();
//String select="select * from airports";
results=statement.executeQuery(query);
}

catch(SQLException e){
out.println("Cannot execute query");
e.printStackTrace();
}


try{

out.println();

while(results.next()){

out.println("Name: " + results.getString(1));
out.println("Location: " + results.getString(2));
//System.out.println("Account no: " + results.getInt(3));

System.out.println();}

}

catch(SQLException e){
out.println("Error retrieving data");
}


try{
link.close();}

catch(SQLException e){
out.println("Unable to disconnect");}


out.close();
out.flush();
}}

Есть мысли?

P.S. я также заметил, что если я использую localhost вместо 127.0.0.1, я получаю исключение безопасности (вероятно, потому что апплет не подписан?)

Ответы [ 2 ]

2 голосов
/ 23 апреля 2011

Есть 2 (на самом деле 3) проблемы:

Во-первых, апплету разрешено запускать HTTP-запросы только по той базе URL-адресов, с которой был получен апплет.Вы можете получить его по Applet#getCodeBase(), который необходимо использовать следующим образом:

URL url = new URL(getCodeBase(), "hello?query=select * from airports");
URLConnection connection = url.openConnection();
// ...

Во-вторых, строка запроса содержит недопустимые символы для использования в URL (пробел, звездочка).Вам необходимо использовать URLEncoder#encode() для URL-кодирования строки запроса.

String query = URLEncoder.encode("select * from airports", "UTF-8");
URL url = new URL(getCodeBase(), "hello?query=" + query);
URLConnection connection = url.openConnection();
// ...

Вам также нужно убедиться, что вы открываете страницу HTML / JSP с апплетом в браузере натот же базовый URL, что и там, где работает сервлет.Например, http://localhost:8080/hello/pagewithapplet.html, и, следовательно, не из командной строки, не из-за просмотра апплета или чего-то ещеАпплет на самом деле должен обслуживаться с того же веб-сервера, на котором работает сервлет.


Независимо от конкретной проблемы, как указано в вопросе, ваша третья проблема заключается в том, что отправкаПростой SQL-оператор в качестве параметра запроса является очень плохой идеей.Что если хакер декомпилирует ваш апплет и выяснит, как осуществляется связь апплета с сервлетом, а затем изменит инструкцию SQL на что-то еще, например delete from airports?

Не делайте SQL в апплете, делайте это только в сервлете и позволяйте апплету отправлять только определенные команды, такие как hello?query=list_airports (который на самом деле открыт для дальнейшей оптимизации, подумайте о веб-сервисе REST, но это оставлено на ваше усмотрение).

0 голосов
/ 23 апреля 2011

URL url=new URL("127.0.0.1:8080/hello/hello?query=select * from airports")

не является действительным URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...