2011-06-28 162 views
0

我想在我的JSP代码中使用HTTP身份验证。但是我的MyAuthenticator错误无法解析为类型。 sytax对于我在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 %> 
+0

MyAuthenticator的导入声明在哪里? – adarshr

+0

@adarshr,我认为MyAuthenticator将进入Authenticator,并且我已经包含Authenticator的导入。并且语法对于我在jsp中编写的代码是正确的? – ferhan

+0

@adarshr,他已经在JSP中定义了类......再往下看。 – SJuan76

回答

0

不要在JSP中定义内部类。考虑一个JSP就像一个简单的方法。

JSP是像(1):

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

定义一个内部类也应该作为一个anonimous内部类:

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

不知道我会做什么来传递参数(我只使用了最简单的匿名内部类)。

无论如何,对于任何将从外部使用的方法,我会使用公共类(在它自己的文件中)并避免所有这些麻烦。

(1)不完全是这样,但你明白了。

+0

感谢您的答复..你能解释我通过从我的代码给出的例子..因为我无法理解这一点..因为我是新来的这些东西..这对我很有帮助.. – ferhan

+1

当然...删除所有内容并学习如何编写一个简单的控制台Java应用程序(网上有很多教程),以便了解Java的基本概念(类,可见性,以及更多),然后尝试使用需要您习惯于这些概念的框架。不用谢。 – SJuan76

+0

通过使用JSP声明构建'<%! ... %>',可以在JSP页面上定义内部类。请保持建设性的答案。 –

0

<% ... %>引导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类移动到单独的文件中,以使代码更具可读性。