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();
}
}

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...