怎么获取网页的一部分并在gui界面中显示

一个投票页面,我想用程序读出验证码,把那段代码在图形界面显示出来,然后手动输入进去,选项什么的用程序自动选好,然后再post过去。
因为我看网上说的好多验证码破解不了,所以就半自动投票吧,总比一天只能投一次强吧。
我现在的问题有这些:
1、把验证码显示出来的代码怎么在我的程序里面给显示出来?模拟个浏览器?请大家给个提示和例子,谢谢!
2、一般来说服务器上都会在打开投票页面就有个session,我抓包看到cookie里面有个PHPSESSIONID,这个怎么读取回来?我试了如下的代码:

URL url = new URL("http://192.168.1.2/vote/index.php");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
//获得session信息
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
System.out.println(sessionId[0]);

怎么获取不到啊
...全文
845 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 53 楼 suciver 的回复:
[quote=引用 51 楼 zhiqiu 的回复:] 我找到个办法:在main函数里面搞个for循环,用Robot模拟鼠标点击postBut按钮,然后死循环判断是否已经点了postBut1按钮,点了就退出while循环,继续for循环。 不知道还有更好的办法?
你都已经在swing里面了无需用什么Robot来模拟点击。你不就是想程序完全自动提交吗,你的所有方法如果都在监听器里面的话直接可以用for循环调用postBut.doClick();方法这样等同于单击事件要不然你用Robot还要判断坐标[/quote] 我已经用Robot模拟点击实现了,就是想知道还有什么办法,你说的doClick方法,我刚试了一下,因为那些按钮是在构造函数里面添加的,所以我在main函数里面调用会提示那些按钮不存在的,所以我把那些操作直接挪到了main方法里,已经实现了模拟点击,谢谢了! 目前还有一个问题就是如何使用OCR来自动填入验证码了,这个我还什么头绪,等级不高,一个贴只能100分,我再开个新帖吧,呵呵。http://bbs.csdn.net/topics/390663488
wuliaokankan 2013-12-07
  • 打赏
  • 举报
回复
读取浏览器缓存下来的验证码图片可行么?
  • 打赏
  • 举报
回复
我找到个办法:在main函数里面搞个for循环,用Robot模拟鼠标点击postBut按钮,然后死循环判断是否已经点了postBut1按钮,点了就退出while循环,继续for循环。 不知道还有更好的办法?
  • 打赏
  • 举报
回复
引用 49 楼 suciver 的回复:
[quote=引用 48 楼 zhiqiu 的回复:] 明白了,我直接加了个类成员存放session,post方法直接删除了,把监听的放到上一级了。 我还有个想法,不知道怎么实现: 点了开始投票以后,循环1000次(打个比方),先获取验证码并在label上显示,然后等待JTextField里面的输入,输入完回车或者点确定按钮,点了以后再继续往服务器post数据,然后sleep一段时间,再开始下一次循环。 这样我开始运行程序以后就只需要点一次开始按钮,然后就是输入一个验证码,回车,等一会再输入,回车。。。以此类推。 这个怎么做?
和请求一次一样的啊,等于循环获取验证码,循环的时候验证码和对应的session,post的数据就用界面上的就可以了这样就可以同样的用户不断post了。只要楼主session和验证码保证一致就行了。[/quote] 我现在实现的程序是有两个按钮,一个postBut是用来获取验证码并显示的,一个postBut1是在输入了验证码以后post的,现在不知道循环在哪做了?
壹直是这样 2013-12-07
  • 打赏
  • 举报
回复
高手啊 下载下载学习学习哦
suciver 2013-12-07
  • 打赏
  • 举报
回复
引用 51 楼 zhiqiu 的回复:
我找到个办法:在main函数里面搞个for循环,用Robot模拟鼠标点击postBut按钮,然后死循环判断是否已经点了postBut1按钮,点了就退出while循环,继续for循环。 不知道还有更好的办法?
你都已经在swing里面了无需用什么Robot来模拟点击。你不就是想程序完全自动提交吗,你的所有方法如果都在监听器里面的话直接可以用for循环调用postBut.doClick();方法这样等同于单击事件要不然你用Robot还要判断坐标
suciver 2013-12-06
  • 打赏
  • 举报
回复
引用 48 楼 zhiqiu 的回复:
明白了,我直接加了个类成员存放session,post方法直接删除了,把监听的放到上一级了。 我还有个想法,不知道怎么实现: 点了开始投票以后,循环1000次(打个比方),先获取验证码并在label上显示,然后等待JTextField里面的输入,输入完回车或者点确定按钮,点了以后再继续往服务器post数据,然后sleep一段时间,再开始下一次循环。 这样我开始运行程序以后就只需要点一次开始按钮,然后就是输入一个验证码,回车,等一会再输入,回车。。。以此类推。 这个怎么做?
和请求一次一样的啊,等于循环获取验证码,循环的时候验证码和对应的session,post的数据就用界面上的就可以了这样就可以同样的用户不断post了。只要楼主session和验证码保证一致就行了。
  • 打赏
  • 举报
回复
引用 46 楼 suciver 的回复:
那是因为你Post方法里面用了postBut1.addActionListener,这个就代表着你每次调用Post方法就会添加一个监听器,jdk的监听器是用迭代器模式的所以你第一次点就添加了一次监听器第二次点又添加了一次监听器。你把这个postBut1.addActionListener放到外面去Post方法主要就是请求url的操作
明白了,我直接加了个类成员存放session,post方法直接删除了,把监听的放到上一级了。 我还有个想法,不知道怎么实现: 点了开始投票以后,循环1000次(打个比方),先获取验证码并在label上显示,然后等待JTextField里面的输入,输入完回车或者点确定按钮,点了以后再继续往服务器post数据,然后sleep一段时间,再开始下一次循环。 这样我开始运行程序以后就只需要点一次开始按钮,然后就是输入一个验证码,回车,等一会再输入,回车。。。以此类推。 这个怎么做?
suciver 2013-12-05
  • 打赏
  • 举报
回复
引用 43 楼 zhiqiu 的回复:
[quote=引用 42 楼 zhiqiu 的回复:] postBut1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ if(arg0.getSource()==postBut1){ Icon icon1 = new ImageIcon("C://temp.bmp"); lab.setIcon(icon1); } } }); 我又加了个按钮,这样刷新图片都不行,这是怎么回事?
lab.setIcon(new ImageIcon(ImageIO.read(new File("c://temp.bmp")))); 这样就会刷新了,原来的setIcon不会检测硬盘的变化,还是内存中的数据,呵呵。 另外,我想问下,那个破解图片的OCR的成功率有多高?是不是一般的那些验证码可以通过程序来做。[/quote] 看楼主的回复应该是已经提交成功了吧。 楼主其实无需把验证码的图片下载到本地,ImageIO.read(InputStream is);这个就可以直接从给你上面的那个urlConnection.getInputStream();中获取图片了。你代码的下载图片那段都可以不要了,直接把urlConnection.getInputStream的is引用传给你的post方法 lab.setIcon(new ImageIcon(ImageIO.read(is)));//直接从流中获取图片,就不会产生临时文件了 验证码字与字之间要有空隙背景和字符要进行二值化处理。这样OCR识别的成功率才会高。楼主这个验证码字与字之间已经有空隙了只是这个背景你要处理下,可以用BufferedImage将像素除了接近RGB(0,0,0)黑色的也就是最接近验证码字符的颜色的其它都是背景全部提成白色进行2值化这样OCR识别成功率就大大增加了。
suciver 2013-12-05
  • 打赏
  • 举报
回复
引用 45 楼 zhiqiu 的回复:
谢谢,我按你说的,确实不需要再下载了,现在还有个问题,我现在把所有的功能都整合到一个frame里面了,想实现的功能是: 1、点击投票以后jlabel上显示验证码图片,然后我在后面的jtextfield里面输入,点击投票或者回车完成一次投票动作。 2、循环上述操作,每点一次就显示一次图片,输入内容,完成一次。 我现在的程序发现有个问题:程序运行以后第一次点投票,没有问题,包括服务器返回的信息,第二次点,验证码图片也能出来,输入也能完成投票,不过还多进行了一次post操作,这个当然返回的就是验证码错误的提示了,第三次点投票,会多出两次post操作。第四次点投票,就会多出三次post操作,很是奇怪,不知道哪里的问题了。。。
这贴引用的也太长了看我46楼的回复
suciver 2013-12-05
  • 打赏
  • 举报
回复
那是因为你Post方法里面用了postBut1.addActionListener,这个就代表着你每次调用Post方法就会添加一个监听器,jdk的监听器是用迭代器模式的所以你第一次点就添加了一次监听器第二次点又添加了一次监听器。你把这个postBut1.addActionListener放到外面去Post方法主要就是请求url的操作
  • 打赏
  • 举报
回复
引用 44 楼 suciver 的回复:
看楼主的回复应该是已经提交成功了吧。
楼主其实无需把验证码的图片下载到本地,ImageIO.read(InputStream is);这个就可以直接从给你上面的那个urlConnection.getInputStream();中获取图片了。你代码的下载图片那段都可以不要了,直接把urlConnection.getInputStream的is引用传给你的post方法
lab.setIcon(new ImageIcon(ImageIO.read(is)));//直接从流中获取图片,就不会产生临时文件了
验证码字与字之间要有空隙背景和字符要进行二值化处理。这样OCR识别的成功率才会高。楼主这个验证码字与字之间已经有空隙了只是这个背景你要处理下,可以用BufferedImage将像素除了接近RGB(0,0,0)黑色的也就是最接近验证码字符的颜色的其它都是背景全部提成白色进行2值化这样OCR识别成功率就大大增加了。


谢谢,我按你说的,确实不需要再下载了,现在还有个问题,我现在把所有的功能都整合到一个frame里面了,想实现的功能是:
1、点击投票以后jlabel上显示验证码图片,然后我在后面的jtextfield里面输入,点击投票或者回车完成一次投票动作。
2、循环上述操作,每点一次就显示一次图片,输入内容,完成一次。
我现在的程序发现有个问题:程序运行以后第一次点投票,没有问题,包括服务器返回的信息,第二次点,验证码图片也能出来,输入也能完成投票,不过还多进行了一次post操作,这个当然返回的就是验证码错误的提示了,第三次点投票,会多出两次post操作。第四次点投票,就会多出三次post操作,很是奇怪,不知道哪里的问题了。。。

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.net.URLEncoder;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;


public class TestPost1 {
public static void main(String[] args) throws Exception{
new TestPost1();
}
public TestPost1()throws Exception{
JFrame frame = new JFrame("自动投票程序");
frame.setResizable(false);
frame.setSize(new Dimension(400, 400));
frame.setLayout(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(300, 200);
frame.setVisible(true);
final JButton ipBut = new JButton("添加ip数据库");
final JButton ipBut1 = new JButton("恢复ip数据库");
final JButton postBut = new JButton("开始投票");
final JButton postBut1 = new JButton("投票");
final JLabel lab = new JLabel();
final JTextField image = new JTextField();
final JTextArea resultText = new JTextArea("程序运行结果如下:\n");
final JScrollPane resultPane = new JScrollPane(resultText,JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
frame.getContentPane().add(ipBut, null);
frame.getContentPane().add(ipBut1, null);
frame.getContentPane().add(postBut, null);
frame.getContentPane().add(lab, null);
frame.getContentPane().add(image, null);
frame.getContentPane().add(postBut1, null);
frame.getContentPane().add(resultPane, null);
ipBut.setBounds(10, 10, 120, 30);
ipBut1.setBounds(140, 10, 120, 30);
postBut.setBounds(270, 10, 120, 30);
lab.setBounds(10, 40, 120, 30);
image.setBounds(140, 40, 120, 30);
postBut1.setBounds(270, 40, 120, 30);
resultPane.setBounds(10, 70, 380, 200);
ipBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==ipBut){
new AddIPDatabase();
}
}
});
ipBut1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==ipBut1){
//开始投票过程前,先把ip数据库恢复为全部都未进行过投票状态。
File file = new File("resource/ipdatabase_bak.txt");
File temp = new File("resource/ipdatabase.txt");
BufferedReader reader=null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
BufferedWriter writer=null;
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(temp)));
String str=null;
while (null != (str = reader.readLine())){
writer.write(str + "\r\n");
}
reader.close();
writer.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
});
postBut.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==postBut){
Thread post1 = new Thread(){
public void run(){
try{
URL url = new URL("http://192.168.0.5/vote/demo/demo.php");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream is = urlConnection.getInputStream();
//此时session就有了,请求后获取session
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
//System.out.println(sessionId[0]);
final String session = sessionId[0];
try {
lab.setIcon(new ImageIcon(ImageIO.read(is)));
} catch (IOException e) {
e.printStackTrace();
}
Post(session);
}catch(Exception e){
e.printStackTrace();
}
}
};
post1.start();
}
}
//投票过程
public void Post(final String session){
postBut1.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent arg0){
if(arg0.getSource()==postBut1){
try{
URL url = new URL("http://192.168.0.5/vote/search.php");
URLConnection conn = url.openConnection();
//System.out.println(session);
conn.setRequestProperty("Cookie", session);

conn.setDoOutput(true);
//conn.setDoInput(true);
BufferedWriter br = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream(),"utf-8"));
br.write(URLEncoder.encode("name","utf-8"));
br.write("="); // 消息正文特殊字符: = 和 & 不需要编码
br.write(URLEncoder.encode("张三","utf-8"));
br.write("&");
br.write(URLEncoder.encode("inst[0]","utf-8"));
br.write("=");
br.write(URLEncoder.encode("网络","utf-8"));
br.write("&");
br.write(URLEncoder.encode("inst[1]","utf-8"));
br.write("=");
br.write(URLEncoder.encode("游泳","utf-8"));
br.write("&");
br.write(URLEncoder.encode("number","utf-8"));
br.write("=");
String number = image.getText();
br.write(URLEncoder.encode(number,"utf-8"));
System.out.println(URLEncoder.encode(number,"utf-8"));
br.flush();
br.close(); // 关闭输出流
// 提交POST请求
InputStream input = conn.getInputStream();

//接受服务器返回数据
BufferedReader br1 = new BufferedReader(new InputStreamReader(input,"utf-8"));
String line="";
String result = "";
while((line=br1.readLine())!=null) {
result += line + "\n";
}
br1.close();
System.out.println(result);
}catch(Exception e1){
e1.printStackTrace();
}
}
}
});
}
});
}
}

这是我执行了四次投票动作的返回信息:
sxa3
张三<br>192.168.0.2<br>SXA3网络,游泳,SXA3insert into votetest(ip,inst) values ('192.168.0.2','网络,游泳,')

wmlk
张三<br>192.168.0.2<br>WMLK网络,游泳,WMLKinsert into votetest(ip,inst) values ('192.168.0.2','网络,游泳,')

wmlk
张三<br>192.168.0.2<br>WMLK网络,游泳,SXA3验证码错误

nymh
张三<br>192.168.0.2<br>NYMH网络,游泳,NYMHinsert into votetest(ip,inst) values ('192.168.0.2','网络,游泳,')

nymh
张三<br>192.168.0.2<br>NYMH网络,游泳,WMLK验证码错误

nymh
张三<br>192.168.0.2<br>NYMH网络,游泳,SXA3验证码错误

kr9v
张三<br>192.168.0.2<br>KR9V网络,游泳,KR9Vinsert into votetest(ip,inst) values ('192.168.0.2','网络,游泳,')

kr9v
张三<br>192.168.0.2<br>KR9V网络,游泳,NYMH验证码错误

kr9v
张三<br>192.168.0.2<br>KR9V网络,游泳,WMLK验证码错误

kr9v
张三<br>192.168.0.2<br>KR9V网络,游泳,SXA3验证码错误

suciver 2013-12-04
  • 打赏
  • 举报
回复
引用 37 楼 zhiqiu 的回复:
[quote=引用 36 楼 suciver 的回复:] [quote=引用 35 楼 zhiqiu 的回复:] [quote=引用 34 楼 suciver 的回复:] [quote=引用 33 楼 zhiqiu 的回复:] String session_value = urlConnection.getHeaderField("Set-Cookie"); InputStream is = url.openStream(); 是不是这两行代码的问题啊?连了两次服务器?获取cookie,并且下载图片?
url.openStream();和url.openConnection().getInputStream();是一样的,楼主并没有两次请求,不过你获取session顺序不对你还没openStream();就去获取urlConnection.getHeaderField("Set-Cookie");这个session应该要在openStream();也就是请求时才生成的。你应该调整顺序。 像这种模拟的post楼主只要记住对于验证码必须保证此次的请求session和验证码图片一致,带着session和验证码已经数据post到提交地址。url的openStream()以及URLConnection的getInputStream()或者getOutputStream()都会开启请求,楼主只要保证请求的session一致与验证码对应就不会有问题了[/quote] 经过你提醒,我又测试了一下,发现就是我的程序的问题 ,我好像是执行一下获得了两次session,所以投票页面出现的图片不对。 不过按你说的,这不应该只是请求一次吗? 这个代码执行以后会产生两个session,如果我把后面保存session的注释掉的话就是一个session。[/quote] 你在下载图片的时候已经请求了一次了怎么下面又去请求

URL url = new URL("http://192.168.0.5/vote/demo/demo.php");
//打开连接等同于我们打开浏览器输入地址但是还没按下回车
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
File outFile = new File("C://temp.bmp");
OutputStream os = new FileOutputStream(outFile);
//用这个连接获取输入流,发出请求等于输入地址按下回车了。你原来用url.openStream();等于url.openConnection().getInputStream,你后面又去url.openConnection();这里就两次url.openConnection()了两次的urlConnection不是一个对象的
InputStream is = urlConnection.getInputStream();
//此时session就有了,请求后获取session
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
System.out.println(sessionId[0]);
final String session = sessionId[0];
byte[] buff = new byte[1024];
while(true) {
	int readed = is.read(buff);
	if(readed == -1) {
		break;
	}
	byte[] temp = new byte[readed];
								   System.arraycopy(buff, 0, temp, 0, readed);
	os.write(temp);
}
is.close(); 
os.close();
new Post(session);

[/quote] 那下载了图片以后怎么获取那个session值?这个session值就在cookie里。[/quote]
引用 37 楼 zhiqiu 的回复:
[quote=引用 36 楼 suciver 的回复:] [quote=引用 35 楼 zhiqiu 的回复:] [quote=引用 34 楼 suciver 的回复:] [quote=引用 33 楼 zhiqiu 的回复:] String session_value = urlConnection.getHeaderField("Set-Cookie"); InputStream is = url.openStream(); 是不是这两行代码的问题啊?连了两次服务器?获取cookie,并且下载图片?
url.openStream();和url.openConnection().getInputStream();是一样的,楼主并没有两次请求,不过你获取session顺序不对你还没openStream();就去获取urlConnection.getHeaderField("Set-Cookie");这个session应该要在openStream();也就是请求时才生成的。你应该调整顺序。 像这种模拟的post楼主只要记住对于验证码必须保证此次的请求session和验证码图片一致,带着session和验证码已经数据post到提交地址。url的openStream()以及URLConnection的getInputStream()或者getOutputStream()都会开启请求,楼主只要保证请求的session一致与验证码对应就不会有问题了[/quote] 经过你提醒,我又测试了一下,发现就是我的程序的问题 ,我好像是执行一下获得了两次session,所以投票页面出现的图片不对。 不过按你说的,这不应该只是请求一次吗? 这个代码执行以后会产生两个session,如果我把后面保存session的注释掉的话就是一个session。[/quote] 你在下载图片的时候已经请求了一次了怎么下面又去请求

URL url = new URL("http://192.168.0.5/vote/demo/demo.php");
//打开连接等同于我们打开浏览器输入地址但是还没按下回车
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
File outFile = new File("C://temp.bmp");
OutputStream os = new FileOutputStream(outFile);
//用这个连接获取输入流,发出请求等于输入地址按下回车了。你原来用url.openStream();等于url.openConnection().getInputStream,你后面又去url.openConnection();这里就两次url.openConnection()了两次的urlConnection不是一个对象的
InputStream is = urlConnection.getInputStream();
//此时session就有了,请求后获取session
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
System.out.println(sessionId[0]);
final String session = sessionId[0];
byte[] buff = new byte[1024];
while(true) {
	int readed = is.read(buff);
	if(readed == -1) {
		break;
	}
	byte[] temp = new byte[readed];
								   System.arraycopy(buff, 0, temp, 0, readed);
	os.write(temp);
}
is.close(); 
os.close();
new Post(session);

[/quote] 那下载了图片以后怎么获取那个session值?这个session值就在cookie里。[/quote] 我代码里面不是有获取session嘛,我就是把你那个代码修改了不要两次请求,先请求后去Set-Coookie再下载图片
  • 打赏
  • 举报
回复
引用 36 楼 suciver 的回复:
[quote=引用 35 楼 zhiqiu 的回复:] [quote=引用 34 楼 suciver 的回复:] [quote=引用 33 楼 zhiqiu 的回复:] String session_value = urlConnection.getHeaderField("Set-Cookie"); InputStream is = url.openStream(); 是不是这两行代码的问题啊?连了两次服务器?获取cookie,并且下载图片?
url.openStream();和url.openConnection().getInputStream();是一样的,楼主并没有两次请求,不过你获取session顺序不对你还没openStream();就去获取urlConnection.getHeaderField("Set-Cookie");这个session应该要在openStream();也就是请求时才生成的。你应该调整顺序。 像这种模拟的post楼主只要记住对于验证码必须保证此次的请求session和验证码图片一致,带着session和验证码已经数据post到提交地址。url的openStream()以及URLConnection的getInputStream()或者getOutputStream()都会开启请求,楼主只要保证请求的session一致与验证码对应就不会有问题了[/quote] 经过你提醒,我又测试了一下,发现就是我的程序的问题 ,我好像是执行一下获得了两次session,所以投票页面出现的图片不对。 不过按你说的,这不应该只是请求一次吗? 这个代码执行以后会产生两个session,如果我把后面保存session的注释掉的话就是一个session。[/quote] 你在下载图片的时候已经请求了一次了怎么下面又去请求

URL url = new URL("http://192.168.0.5/vote/demo/demo.php");
//打开连接等同于我们打开浏览器输入地址但是还没按下回车
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
File outFile = new File("C://temp.bmp");
OutputStream os = new FileOutputStream(outFile);
//用这个连接获取输入流,发出请求等于输入地址按下回车了。你原来用url.openStream();等于url.openConnection().getInputStream,你后面又去url.openConnection();这里就两次url.openConnection()了两次的urlConnection不是一个对象的
InputStream is = urlConnection.getInputStream();
//此时session就有了,请求后获取session
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
System.out.println(sessionId[0]);
final String session = sessionId[0];
byte[] buff = new byte[1024];
while(true) {
	int readed = is.read(buff);
	if(readed == -1) {
		break;
	}
	byte[] temp = new byte[readed];
								   System.arraycopy(buff, 0, temp, 0, readed);
	os.write(temp);
}
is.close(); 
os.close();
new Post(session);

[/quote] 那下载了图片以后怎么获取那个session值?这个session值就在cookie里。
suciver 2013-12-04
  • 打赏
  • 举报
回复
引用 35 楼 zhiqiu 的回复:
[quote=引用 34 楼 suciver 的回复:] [quote=引用 33 楼 zhiqiu 的回复:] String session_value = urlConnection.getHeaderField("Set-Cookie"); InputStream is = url.openStream(); 是不是这两行代码的问题啊?连了两次服务器?获取cookie,并且下载图片?
url.openStream();和url.openConnection().getInputStream();是一样的,楼主并没有两次请求,不过你获取session顺序不对你还没openStream();就去获取urlConnection.getHeaderField("Set-Cookie");这个session应该要在openStream();也就是请求时才生成的。你应该调整顺序。 像这种模拟的post楼主只要记住对于验证码必须保证此次的请求session和验证码图片一致,带着session和验证码已经数据post到提交地址。url的openStream()以及URLConnection的getInputStream()或者getOutputStream()都会开启请求,楼主只要保证请求的session一致与验证码对应就不会有问题了[/quote] 经过你提醒,我又测试了一下,发现就是我的程序的问题 ,我好像是执行一下获得了两次session,所以投票页面出现的图片不对。 不过按你说的,这不应该只是请求一次吗? 这个代码执行以后会产生两个session,如果我把后面保存session的注释掉的话就是一个session。[/quote] 你在下载图片的时候已经请求了一次了怎么下面又去请求

URL url = new URL("http://192.168.0.5/vote/demo/demo.php");
//打开连接等同于我们打开浏览器输入地址但是还没按下回车
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
File outFile = new File("C://temp.bmp");
OutputStream os = new FileOutputStream(outFile);
//用这个连接获取输入流,发出请求等于输入地址按下回车了。你原来用url.openStream();等于url.openConnection().getInputStream,你后面又去url.openConnection();这里就两次url.openConnection()了两次的urlConnection不是一个对象的
InputStream is = urlConnection.getInputStream();
//此时session就有了,请求后获取session
String session_value = urlConnection.getHeaderField("Set-Cookie");
String[] sessionId = session_value.split(";");
//保存session信息
System.out.println(sessionId[0]);
final String session = sessionId[0];
byte[] buff = new byte[1024];
while(true) {
	int readed = is.read(buff);
	if(readed == -1) {
		break;
	}
	byte[] temp = new byte[readed];
								   System.arraycopy(buff, 0, temp, 0, readed);
	os.write(temp);
}
is.close(); 
os.close();
new Post(session);

  • 打赏
  • 举报
回复
引用 34 楼 suciver 的回复:
[quote=引用 33 楼 zhiqiu 的回复:] String session_value = urlConnection.getHeaderField("Set-Cookie"); InputStream is = url.openStream(); 是不是这两行代码的问题啊?连了两次服务器?获取cookie,并且下载图片?
url.openStream();和url.openConnection().getInputStream();是一样的,楼主并没有两次请求,不过你获取session顺序不对你还没openStream();就去获取urlConnection.getHeaderField("Set-Cookie");这个session应该要在openStream();也就是请求时才生成的。你应该调整顺序。 像这种模拟的post楼主只要记住对于验证码必须保证此次的请求session和验证码图片一致,带着session和验证码已经数据post到提交地址。url的openStream()以及URLConnection的getInputStream()或者getOutputStream()都会开启请求,楼主只要保证请求的session一致与验证码对应就不会有问题了[/quote] 经过你提醒,我又测试了一下,发现就是我的程序的问题 ,我好像是执行一下获得了两次session,所以投票页面出现的图片不对。 不过按你说的,这不应该只是请求一次吗?

URL url = new URL("http://192.168.0.5/vote/demo/demo.php");
										
							File outFile = new File("C://temp.bmp");
							OutputStream os = new FileOutputStream(outFile);
							InputStream is = url.openStream();
							byte[] buff = new byte[1024];
							while(true) {
								int readed = is.read(buff);
								if(readed == -1) {
									break;
								}
								byte[] temp = new byte[readed];
								System.arraycopy(buff, 0, temp, 0, readed);
								os.write(temp);
							}
							is.close(); 
			                os.close();
			            	
			                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
							String session_value = urlConnection.getHeaderField("Set-Cookie");
							String[] sessionId = session_value.split(";");
							//保存session信息
							System.out.println(sessionId[0]);
							final String session = sessionId[0];
							new Post(session);
这个代码执行以后会产生两个session,如果我把后面保存session的注释掉的话就是一个session。
suciver 2013-12-04
  • 打赏
  • 举报
回复
引用 33 楼 zhiqiu 的回复:
String session_value = urlConnection.getHeaderField("Set-Cookie"); InputStream is = url.openStream(); 是不是这两行代码的问题啊?连了两次服务器?获取cookie,并且下载图片?
url.openStream();和url.openConnection().getInputStream();是一样的,楼主并没有两次请求,不过你获取session顺序不对你还没openStream();就去获取urlConnection.getHeaderField("Set-Cookie");这个session应该要在openStream();也就是请求时才生成的。你应该调整顺序。 像这种模拟的post楼主只要记住对于验证码必须保证此次的请求session和验证码图片一致,带着session和验证码已经数据post到提交地址。url的openStream()以及URLConnection的getInputStream()或者getOutputStream()都会开启请求,楼主只要保证请求的session一致与验证码对应就不会有问题了
  • 打赏
  • 举报
回复
引用 42 楼 zhiqiu 的回复:
postBut1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ if(arg0.getSource()==postBut1){ Icon icon1 = new ImageIcon("C://temp.bmp"); lab.setIcon(icon1); } } }); 我又加了个按钮,这样刷新图片都不行,这是怎么回事?
lab.setIcon(new ImageIcon(ImageIO.read(new File("c://temp.bmp")))); 这样就会刷新了,原来的setIcon不会检测硬盘的变化,还是内存中的数据,呵呵。 另外,我想问下,那个破解图片的OCR的成功率有多高?是不是一般的那些验证码可以通过程序来做。
  • 打赏
  • 举报
回复
postBut1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0){ if(arg0.getSource()==postBut1){ Icon icon1 = new ImageIcon("C://temp.bmp"); lab.setIcon(icon1); } } }); 我又加了个按钮,这样刷新图片都不行,这是怎么回事?
  • 打赏
  • 举报
回复
引用 40 楼 suciver 的回复:
[quote=引用 39 楼 zhiqiu 的回复:] [quote=引用 38 楼 suciver 的回复:] 我代码里面不是有获取session嘛,我就是把你那个代码修改了不要两次请求,先请求后去Set-Coookie再下载图片
CSDN的引用来引用去,都看晕了,我都没看清代码的变化了,按你说的我改了下代码,确实是引用一次了。 现在还有个问题就是,为什么我的主程序执行一次,点投票以后弹出的新的frame里面引用的图片不会变化?就是说主程序执行以后,点投票,弹出新的frame,里面的图片,我输入验证码,然后确定,没有问题,但是我关了这个frame,再次点投票,弹出的frame里面的图片还是刚才那个,没有变,但我看下载的图片却已经变化了,而且session什么的也都已经变过了。这是为什么? 是因为我关闭那个frame的操作不对吗?我是这样关闭的: frame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent arg0){ frame.dispose(); } }); [/quote] 你那个新窗体并不是主窗体的子窗体而是重新new出来的窗体时单独的可以直接用frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);不用那个windowListener详细的你去看api里面的说明详细。[/quote] 如果用frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);的话,新开的窗口关闭,主程序也会退出了啊。
加载更多回复(35)

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧