2011년 6월 13일 월요일

패스워드로 보호된 웹사이트에 액세스하는 방법

웹 서핑을 하고 있을 때 갑자기 사용자 명과 패스워드 입력을 요구받은 적이 있을 것이다. 브라우저를 사용하여 이와 같은 웹사이트에 액세스하고 있는 경우라면 특별한 문제는 없다. 단지 화면에 따라 사용자 명과 패스워드를 입력하기만 하면 되기 때문이다. 그러나 Java 프로그램으로부터 그 웹사이트에 액세스하여 InputStream을 사용하여 데이터를 판독 하려고 하면 FileNotFoundException이 발생한다. JDK 1.2이후 부터는 새롭게 java.net 클래스에 인증용 클래스가 추가되고, 패스워드로 확보된 웹사이트도 간단히 액세스할 수 있게 되었다. JDK 1.2에서는 Authenticator .setDefaullt 메쏘드를 사용하여 미리 인증자를 인스톨해둘 필요가 있다. 그리하여 인증이 필요한 경우에는 getPasswordAuthenticator 메쏘드를 사용하여 인증자를 호출하면 된다. getPasswordAuthenticator는 적절한 사용자 명과 패스워드를 나타내는 PasswordAuthenticator 클래스 인스턴스를 돌려주는 메쏘드이다. 이와 같이 JDK 1.2를 사용하면 패스워드로 보호된 웹사이트에 액세스하는 프로그램을 간단 하게 작성할 수 있다. 실제로 다음 두 개의 순서를 구현하기만 하면 된다.
1단계 : 인증자의 인스톨
Authenticator .setDefault (new MyAuthenticator ());

2단계 : 인증자의 서브클래스 생성
class MyAuthenticator extends Authenticator {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication ("username", "password");
}
}


전체 소스
package webAccess;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.Authenticator;
import java.net.MalformedURLException;
import java.net.PasswordAuthentication;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTextPane;
public class accessFrame extends JFrame {
private JScrollPane messageScrollPane = new JScrollPane();
private JTextPane messageBox = new JTextPane();
private JPanel urlPanel = new JPanel();
private JPanel userPanel = new JPanel();
private JTextField URLString = new JTextField();
private JTextField userid = new JTextField();
private JTextField password = new JTextField();
private JButton connect = new JButton();
public accessFrame() {
try {
jbInit();
Authenticator.setDefault (new MyAuthenticator ());
} catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout(null);
this.setSize(new Dimension(401, 460));
this.setTitle("사용자 인증");
messageScrollPane.setBounds(new Rectangle(5, 220, 380, 200));
messageBox.setEditable(false);
urlPanel.setBounds(new Rectangle(25, 25, 330, 60));
urlPanel.setBorder(BorderFactory.createTitledBorder("URL"));
urlPanel.setLayout(null);
userPanel.setBounds(new Rectangle(25, 90, 330, 75));
userPanel.setBorder(BorderFactory.createTitledBorder("UserID/Password"));
userPanel.setLayout(null);
URLString.setBounds(new Rectangle(5, 20, 320, 35));
userid.setBounds(new Rectangle(30, 30, 115, 30));
password.setBounds(new Rectangle(180, 30, 115, 30));
connect.setText("Connect");
connect.setBounds(new Rectangle(270, 175, 80, 35));
connect.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
connect_actionPerformed(e);
}
});
messageScrollPane.getViewport().add(messageBox, null);
userPanel.add(password, null);
userPanel.add(userid, null);
this.getContentPane().add(connect, null);
this.getContentPane().add(userPanel, null);
urlPanel.add(URLString, null);
this.getContentPane().add(urlPanel, null);
this.getContentPane().add(messageScrollPane, null);
}
private String fetchURL () {
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL (URLString.getText());
InputStream content = (InputStream)url.getContent();
BufferedReader in = new BufferedReader (new InputStreamReader (content));
String line;
while ((line = in.readLine()) != null) {
buffer.append(line+"n");
}
} catch (MalformedURLException e) {
buffer.append(e);
} catch (IOException e) {
buffer.append(e);
}
return buffer.toString();
}
private void setMessage(String message) {
messageBox.setText(messageBox.getText()+message);
}
private void connect_actionPerformed(ActionEvent e) {
setMessage(fetchURL());
}
class MyAuthenticator extends Authenticator {
public void MyAuthenticator() {
}
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userid.getText(), password.getText().toCharArray());
}
}
}
package webAccess;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.UIManager;
import java.awt.Dimension;
import java.awt.Toolkit;
public class WebAccessClient {
public WebAccessClient() {
Frame frame = new accessFrame();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Dimension frameSize = frame.getSize();
if (frameSize.height > screenSize.height) {
frameSize.height = screenSize.height;
}
if (frameSize.width > screenSize.width) {
frameSize.width = screenSize.width;
}
frame.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
frame.setVisible(true);
}
/**
*
* @param args
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception e) {
e.printStackTrace();
}
new WebAccessClient();
}
}

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...