не может быть разрешен к типу - PullRequest
0 голосов
/ 29 июня 2011

Я пытаюсь использовать HTTP-аутентификацию в своем коде JSP.Но я получаю сообщение об ошибке на MyAuthenticator, который не может быть разрешен для типа.Является ли синтаксис правильным для кода, который я написал на странице JSP.Любые предложения будут оценены ..

    <%@ page language="java" import="java.net.Authenticator,java.net.PasswordAuthentication,java.io.BufferedReader,java.net.*,java.io.*" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%

String urlToQuery = request.getParameter("url");
System.out.println(" " +urlToQuery);
//URL url = new URL(urlToQuery);



//InputStream in = conn.getInputStream();

String urlString = "";
String username = "";
String password = "";
Authenticator.setDefault(new MyAuthenticator(username, password));
URL url = new URL(urlToQuery);
URLConnection conn = url.openConnection();
InputStream content = (InputStream) url.getContent();
BufferedReader in = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = in.readLine()) != null) {
  System.out.println(line);
}
System.out.println("Done.");

 class MyAuthenticator extends Authenticator {
    private String username, password;

    public MyAuthenticator(String user, String pass) {
      username = user;
      password = pass;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
      System.out.println("Requesting Host  : " + getRequestingHost());
      System.out.println("Requesting Port  : " + getRequestingPort());
      System.out.println("Requesting Prompt : " + getRequestingPrompt());
      System.out.println("Requesting Protocol: " + getRequestingProtocol());
      System.out.println("Requesting Scheme : " + getRequestingScheme());
      System.out.println("Requesting Site  : " + getRequestingSite());
      return new PasswordAuthentication(username, password.toCharArray());
    }
  }



%>

<%=line %>

Ответы [ 2 ]

0 голосов
/ 29 июня 2011

<% ... %> побуждает JSP обрабатывать содержимое кода как операторы. Поэтому ваш класс становится локальным классом, следуя тем же правилам области действия, что и локальные переменные (то есть вы должны объявить класс раньше, чем его использовать). Я не проверял это, но если вы переписали свой код на:

    <%@ page language="java" import="java.net.Authenticator,java.net.PasswordAuthentication,java.io.BufferedReader,java.net.*,java.io.*" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<%

class MyAuthenticator extends Authenticator {
    private String username, password;

    public MyAuthenticator(String user, String pass) {
      username = user;
      password = pass;
    }

    protected PasswordAuthentication getPasswordAuthentication() {
      System.out.println("Requesting Host  : " + getRequestingHost());
      System.out.println("Requesting Port  : " + getRequestingPort());
      System.out.println("Requesting Prompt : " + getRequestingPrompt());
      System.out.println("Requesting Protocol: " + getRequestingProtocol());
      System.out.println("Requesting Scheme : " + getRequestingScheme());
      System.out.println("Requesting Site  : " + getRequestingSite());
      return new PasswordAuthentication(username, password.toCharArray());
    }
  }

String urlToQuery = request.getParameter("url");
System.out.println(" " +urlToQuery);
//URL url = new URL(urlToQuery);



//InputStream in = conn.getInputStream();

String urlString = "";
String username = "";
String password = "";
Authenticator.setDefault(new MyAuthenticator(username, password));
URL url = new URL(urlToQuery);
URLConnection conn = url.openConnection();
InputStream content = (InputStream) url.getContent();
BufferedReader in = new BufferedReader(new InputStreamReader(content));
String line;
while ((line = in.readLine()) != null) {
  System.out.println(line);
}
System.out.println("Done.");





%>

<%=line %>

Тогда MyAuthenticator должно быть разрешено в вашем коде.

Попробуйте переместить класс Java в отдельный файл, чтобы сделать ваш код более читабельным.

0 голосов
/ 29 июня 2011

Не определять внутренние классы в JSP.Рассмотрим JSP как простой метод.

JSP - это что-то вроде (1):

public class MyJSP extends Servlet {
  public void service(HttpRequest request, HttpResponse response) {
     /** JSP CODE HERE **/
  }
}

Определение внутреннего класса должно выполняться как анонимный внутренний класс:

 Authenticator.setDefault(new Authenticator() {
   protected getPasswordAuthentication() {
     System.out.println("Requesting Host  : " + getRequestingHost());
     System.out.println("Requesting Port  : " + getRequestingPort());
     ...
   }
 });

Не уверен, что мне делать, чтобы передать параметры (я использовал только самые простые анонимные внутренние классы).

В любом случае для всего, что будет использоваться извне, я бы использовал открытый класс(в своем собственном файле) и избегайте всех этих неприятностей.

(1) Не совсем так, но вы поняли идею.

...