使用URLConnection进行连接校内网登录页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用URLConnection进行连接校内网登录页面相关的知识,希望对你有一定的参考价值。

能成功进入,返回正确页面
三楼那位,我的要求是不要登录的页面,而是用程序给URL参数,像用户名和密码都是利用程序添加进去的,利用OutputStreamWriter的方法写进去的~
谢谢刚来的哥们,这边有个方法能测试你是不是登录成功connection.getURL();这个进行判断就可以了,可能得知道后台是怎么处理的才可以~我这边做了好长时间都不行~
你的方法还存在错误,我上次忘记告诉你了,校内网是有隐藏字段的,提交的时候一并会提交的~~

我有个思路,但是没测试成功,代码是这样:
URL address=new URL("http://login.xiaonei.com/Login.do");

HttpURLConnection uc=
(HttpURLConnection)address.openConnection();

uc.setRequestMethod("POST");
uc.setRequestProperty("email","***");//"***"是用户名
uc.setRequestProperty("password","***");//"***"是密码
uc.connect();

这个问题在于不知道HttpURLConnection会不会重定向,就是登陆成功后自动跳转到个人页面,还有就是没法把页面显示出来(因为我找的那些Swing组件都不支持javascript),因此不知道到底成功登陆没有……
如果用connection.getURL()的话,结果是URL没有自动跳转呢,看来是没成功啊,我现在也没什么好想法了。。。
PS:我不是新来的,占坑好久了,呵呵
如果LZ知道隐藏字段的话,就加上试试吧,共同研究,呵呵

参考资料:Java API1.5

参考技术A 你所要求的太复杂,我估计你得去读jmeter的源代码才可以了。抱歉
基本能实现你的要求,具体的请你改改:
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
import javax.swing.text.DefaultStyledDocument;

//HTTP连接与浏览

public class HTTPBrowser extends JFrame
JTextField jtfAddress; //输入html文件地址或网址
JTextPane jtpShow; //显示页面
JTextArea jtaSource; //显示HTML源文件

public HTTPBrowser()
super("HTTP连接与浏览"); //调用父类构造函数
jtfAddress=new JTextField(30); //实例化地址输入框
jtpShow=new JTextPane(); //实例化显示内容框
jtaSource=new JTextArea();

JPanel p1=new JPanel(); //实例化面板
JSplitPane spane=new JSplitPane(JSplitPane.VERTICAL_SPLIT); //实例化分隔面板
p1.add(new JLabel("地址")); //增加组件到面板上
p1.add(jtfAddress);
spane.add(new JScrollPane(jtpShow),JSplitPane.TOP);
spane.add(new JScrollPane(jtaSource),JSplitPane.BOTTOM);
spane.setDividerLocation(130); //设置分隔位置
spane.setDividerSize(2); //设置分隔栏尺寸
Container container=getContentPane(); //得到容器
container.add(p1,BorderLayout.NORTH); //增加组件到容器上
container.add(spane,BorderLayout.CENTER);

jtfAddress.addActionListener(new ShowHTMLListener()); //输入地址文本域事件处理

setSize(380,300); //设置窗口尺寸
setVisible(true); //设置窗口可视
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //关闭窗口时退出程序


class ShowHTMLListener implements ActionListener
public void actionPerformed(ActionEvent event)
try
URL address=new URL(jtfAddress.getText()); //得到HTML页面的URL地址
jtpShow.setContentType("text/html"); //设置内容格式
jtpShow.setPage(address); //设置显示页面

BufferedReader in= new BufferedReader(new InputStreamReader(address.openStream())); //获取输入流
String line;
StringBuffer content = new StringBuffer(); //文件内容
while ((line = in.readLine()) != null) //读取文件
content.append(line+"\n");

jtaSource.setText(new String(content)); //设置显示文本
in.close(); //关闭输入流

catch (Exception ex)
ex.printStackTrace(); //输出出错信息




public static void main(String[] args)
new HTTPBrowser();

参考技术B 望大家帮帮忙~~

使用 URLConnection 进行摘要式身份验证

【中文标题】使用 URLConnection 进行摘要式身份验证【英文标题】:Digest authentication using URLConnection 【发布时间】:2010-11-25 16:06:57 【问题描述】:

我正在实施单点登录功能,以便使用摘要身份验证自动登录附属的 https 网站。目前我的代码是

URL url = new URL(protocol, ip, port, path);
URLConnection connection = url.openConnection(Proxy.NO_PROXY);
connection.connect();

if (connection != null && connection.getHeaderFields() != null) 
    if (connection.getHeaderFields().get(AUTHENTICATE_RESPONSE_HEADER) != null) 
        Map<String, String> authenticateParameters = identifyAuthentication(connection);

        String ha1 = calculateMD5(username + ":" + authenticateParameters.get("realm") + ":" + password);
        String ha2 = calculateMD5("GET" + ":" + path);
        String response = calculateMD5(ha1 + ":" + 
            authenticateParameters.get("nonce") + ":" +
            "00000001" + ":" +
            authenticateParameters.get("qop") + ":" +
            ha2);

            String authorizationRequest = authenticateParameters.get("challenge") + " " + 
                    "username=" + username + ", " +
                    "realm=" + authenticateParameters.get("realm") + ", " +
                    "nonce=" + authenticateParameters.get("nonce") + ", " +
                    "uri=" + path + ", " +
                    "qop=" + authenticateParameters.get("qop") + ", " +
                    "nc=" + "00000001" + ", " +
                    "response=" + response + ", " +
                    "opaque=" + authenticateParameters.get("opaque");

            connection.setAllowUserInteraction(true);
            connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest);
            connection.getHeaderFields();
    

问题是我得到了

java.lang.IllegalStateException: Already connected
    at java.net.URLConnection.addRequestProperty(URLConnection.java:1061)
    at sun.net.www.protocol.http.HttpURLConnection.addRequestProperty(HttpURLConnection.java:2016)
    at com.ibm.net.ssl.www2.protocol.https.a.addRequestProperty(a.java:49)

我想这是有道理的,但对我没有帮助。我将如何创建用于在此处登录的请求/响应(并最终获得 sessionId)?

提前致谢。

【问题讨论】:

我们能看到完整的堆栈跟踪吗?我不确定你方法中的哪一行失败了。 已添加 - 感谢您抽出宝贵时间。 【参考方案1】:

当连接请求标头已经连接(您已经发送了请求标头)时,您不能修改它。您必须为第二个请求建立新连接。

例如

connection = url.openConnection(Proxy.NO_PROXY);
connection.addRequestProperty(AUTHENTICATION_REQUEST_PROPERTY, authorizationRequest);
connection.getHeaderFields();

然后您可以从标头中获取 sessionId 或更确切地说是 cookie。

使用 apache HttpClient 的 Digest 功能可能更容易:http://hc.apache.org/httpclient-3.x/authentication.html

【讨论】:

建立新连接会返回与以前相同的 401 回复。 但是你没有得到原来的例外吗?您的授权请求可能不正确。响应头是什么? 最后我使用 HttpClient 完成了这项工作。更简单更容易! 这对你有用!你为什么不喜欢接受答案?

以上是关于使用URLConnection进行连接校内网登录页面的主要内容,如果未能解决你的问题,请参考以下文章

使用 URLConnection 进行摘要式身份验证

UrlConnection连接和Socket连接的区别

为啥不能在IE上打开网银登录页面或提示“该页无法显示”?

了解 URLConnection 连接是不是真的被池化了?

canvas里的selfgroup怎么加人

java中的URLConnection如何重用池中的连接