window.open a.href打开窗口referer的问题

本文探讨了通过JavaScript的window.open与HTML的a.href两种方式打开新窗口的区别,特别是对于新窗口对象的获取及后期操作,以及不同浏览器环境下referer头的处理差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

window.open a.href打开窗口referer的问题:

 JSP:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    String path = request.getContextPath();
    String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>045index</title>
<style type="text/css">
a {
    border: 1px solid blue;
    margin-left: 5px;
}
</style>
</head>
<body>
    <input type="button" value="window.open:_blank" id="btn001">
    <input type="button" value="window.open:winopen" id="btn002">
    <input type="button" value="window.open:winopen anotherButton" id="btn003">
    <input type="button" value="see how many window open" id="btn004">
    <input type="button" value="close windows opened" id="btn005">
    <!-- a href 打开的窗口对象不能直接获得到 -->
    <a href="test8.do" target="_blank">a link _blank </a>
    <!-- 如果target对象一致,那么打开的窗口就是一致的 -->
    <a href="test8.do" target="winopen">a link winopen </a>
    <a href="test8.do" target="winopen">a link winopen2 </a>
    <!-- 使用a的click事件进行新窗口的打开,调用button的事件 -->
    <a id="a001" >a link click _blank </a>
    <a href="test8.do" target="winopen" id="a002" >a link click winopen and href </a>
    <script type="text/javascript" src="js/jquery-1.11.1.js"></script>
    <script type="text/javascript" src="b/js/bootstrap.js"></script>
    <script type="text/javascript" src="js/index046.js"></script>
</body>
</html>

 

js:

/**1, 用window.open的时候可以得到打开的窗口对象,可以用来后期关闭;
 * 2, 用a.href可以打开新的窗口,但是得不到打开的窗口对象,后期无法关闭;
 * 3, window.open/a.href的target设置为一个固定值winopen,反复打开的窗口都会是同一个窗口;
 * 4, chrome中window.open/a.href都会有request.getHeader("referer");
 * 5, IE中的window.open没有referer,a.href会有referer;
 * 6, 用<a href="test8.do" target="winopen" id="a002" >的方式可以hack一下,
 *    window.open的方式如果没有referer,会显示空页面,而a.href会打开同样的窗口,这个有
 *    referer,会显示正常的内容;
 */
$(function() {
    $('#btn001').click(btn001Click);
    $('#btn002').click(btn002Click);
    $('#btn003').click(btn003Click);
    $('#btn004').click(btn004Click);
    $('#btn005').click(btn005Click);
    $('#a001').click(btn001Click);
    $('#a002').click(btn002Click);
});
var opens = [];
function btn001Click(e) {
    // 反复点击会打开新的窗口;
    // 用chrome进行打开,会有request.getHeader("referer")
    // 用IE进行打开,request.getHeader("referer")会是null;
    var open = window.open('test8.do', '_blank');
    // chrome中第一次打开窗体有时无法正确设置title
    // IE中可以正常的设置titile
    open.document.title='a';
    opens.push(open);
    // return false是为了抑制a的默认事件;
    return false;
}
function btn002Click(e) {
    // 反复点击会打开同一个窗口
    var open = window.open('test8.do', 'winopen');
    // chrome中第一次打开窗体有时无法正确设置title,第二次打开同一个窗体的时候可能会设置正确
    // IE中可以正常的设置titile
    open.document.title='b';
    // 会在opens数组中重复添加相同的窗口对象;
    opens.push(open);
}
function btn003Click(e) {
    // 反复点击会打开同一个窗口,与btn002Click的窗口一致
    var open = window.open('test8.do', 'winopen');
    // chrome中第一次打开窗体有时无法正确设置title,第二次打开同一个窗体的时候可能会设置正确
    // IE中可以正常的设置titile
    open.document.title='c';
    // 会在opens数组中重复添加相同的窗口对象;
    opens.push(open);
}
function btn004Click(e) {
    console.log(opens);
}
function btn005Click(e) {
    var i = 0, len = opens.length;
    for (i = 0; i < len; i++) {
        console.log(i);
        // 如果数组中有重复对象,在前面已经关闭了,后面重复关闭不会报异常;
        opens[i].close();
    }
}

 

servlet:

package com.stono.servlet;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
public class TestServlet8 extends HttpServlet {
    private static final long serialVersionUID = 1L;
    protected void doGet(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException, java.io.IOException {
        String referer = req.getHeader("referer");
        System.out.println(referer);
        if(referer == null){
            return ;
        }
        PrintWriter writer = resp.getWriter();
        writer.println("this is from com.stono.servlet.TestServlet8");
    };
}

 

关注一下:a.href的一个坑:http://www.cnblogs.com/iyangyuan/p/3979957.html

from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import ElementClickInterceptedException import csv import pymysql import os import requests import time import datetime import re def download_image(url, save_path, filename): if not url or url.startswith(('data:image', 'javascript:')): print(f"无效的图片URL: {url}") return # 补全 URL(如果以 // 开头) if url.startswith('//'): url = 'https:' + url # 当当网图片通常支持 HTTPS elif not url.startswith(('http://', 'https://')): url = 'https://' + url # 其他情况默认 HTTPS # 清洗文件名 def sanitize_filename(name): return re.sub(r'[\\/*?:"<>|]', "_", name) safe_filename = sanitize_filename(filename) save_to = os.path.join(save_path, safe_filename) # 请求配置 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36', 'Referer': 'http://www.dangdang.com/' } # 重试机制 max_retries = 3 for attempt in range(max_retries): try: response = requests.get(url, headers=headers, timeout=10) if response.status_code == 200: if not os.path.exists(save_path): os.makedirs(save_path) with open(save_to, 'wb') as f: f.write(response.content) print(f'图片已保存: {save_to}') break else: print(f"HTTP错误: {response.status_code} (URL: {url})") except Exception as e: print(f"第 {attempt + 1} 次尝试失败: {str(e)}") time.sleep(2) else: print(f"下载失败(超过最大重试次数): {url}") # 初始化浏览器 driver_path = r"D:\chromedriver-win32\chromedriver.exe" options = webdriver.ChromeOptions() options.add_argument('--headless') service = Service(driver_path) driver = webdriver.Chrome(service=service, options=options) try: driver.get('http://www.dangdang.com/') # 设置窗口大小,可能避免某些元素遮挡 driver.set_window_size(1920, 1080) # 使用更健壮的方式获取搜索框 search_term = input("请输入要搜索的图书类型:") search_box = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "key_S")) ) search_box.clear() search_box.send_keys(search_term) # 等待搜索按钮可点击 search_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".search .button")) ) # 尝试处理可能遮挡的浮动元素 try: WebDriverWait(driver, 5).until( EC.invisibility_of_element_located((By.CSS_SELECTOR, "a.robot")) ) except: pass # 尝试点击搜索按钮 try: search_btn.click() except ElementClickInterceptedException: print("常规点击被拦截,尝试使用JavaScript点击") driver.execute_script("arguments[0].click();", search_btn) id = 0 data = [['图书编号', '图书名称', '图书作者', '图书出版社', '图书图片url', '图书价格', '图书简介']] # 使用更可靠的翻页方式 for _ in range(3): # 限制爬取3页防止无限循环 # 等待结果载 WebDriverWait(driver, 15).until( EC.presence_of_element_located((By.CSS_SELECTOR, "#search_nature_rg")) ) book_items = driver.find_elements(By.CSS_SELECTOR, "#search_nature_rg li") for item in book_items: books = [] id += 1 books.append(id) # 标题 try: title = item.find_element(By.CSS_SELECTOR, "a[dd_name='单品标题']").get_attribute("title") if not title: title = item.find_element(By.CSS_SELECTOR, "a:first-child").text.strip() books.append(title) except: books.append("未知标题") # 作者 try: author = item.find_element(By.CSS_SELECTOR, ".search_book_author a").text books.append(author) except: books.append("未知作者") # 出版社 try: press_span = item.find_element(By.CSS_SELECTOR, ".search_book_author span:nth-child(3)") press = press_span.find_element(By.TAG_NAME, "a").text books.append(press) except: books.append("未知出版社") # 图片URL try: img = item.find_element(By.CSS_SELECTOR, "a img") src = img.get_attribute("src") if "url_none.png" in src: src = img.get_attribute("data-original") or "" books.append(src) except: books.append("") # 价格 try: price = item.find_element(By.CSS_SELECTOR, ".search_now_price").text.replace("¥", "") books.append(price) except: books.append("0.00") # 简介 try: intro = item.find_element(By.CSS_SELECTOR, ".detail").text books.append(intro) except: books.append("无简介") data.append(books) # 翻页 try: next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.CSS_SELECTOR, ".next")) ) next_btn.click() time.sleep(2) except: print("已到达最后一页或翻页失败") break # 保存到CSV timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S") csv_filename = f'dangdang_books_{timestamp}.csv' with open(csv_filename, 'w', newline='', encoding='utf-8-sig') as f: writer = csv.writer(f) writer.writerows(data) # 数据库操作 conn = pymysql.connect( user="root", password="123456", host="localhost", port=3306, charset='utf8mb4' ) cursor = conn.cursor() try: cursor.execute("CREATE DATABASE IF NOT EXISTS xyw CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci") except Exception as e: print(f"创建数据库失败: {str(e)}") exit() # 选择数据库 conn.select_db("xyw") # 创建表(如果不存在) create_table_sql = """ CREATE TABLE IF NOT EXISTS dangdang( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) CHARACTER SET utf8mb4, author VARCHAR(100) CHARACTER SET utf8mb4, press VARCHAR(100) CHARACTER SET utf8mb4, src VARCHAR(255), price DECIMAL(10,2), introduction TEXT CHARACTER SET utf8mb4 ); """ cursor.execute(create_table_sql) # 插入数据 insert_sql = """ INSERT INTO dangdang (title, author, press, src, price, introduction) VALUES (%s, %s, %s, %s, %s, %s) """ # 新增:统计成功插入的记录数 inserted_count = 0 for row in data[1:]: try: price_value = float(row[5]) if row[5].replace('.', '', 1).isdigit() else 0.0 cursor.execute(insert_sql, (row[1], row[2], row[3], row[4], price_value, row[6])) inserted_count += 1 # 每成功插入一条,计数器1 except Exception as e: print(f"插入数据失败: {str(e)}") conn.commit() print(f"成功插入 {inserted_count} 条数据到数据库") # 使用自定义计数器 # 下载图片(修正缩进) save_directory = 'download' if not os.path.exists(save_directory): os.makedirs(save_directory) for i, row in enumerate(data[1:], 1): image_url = row[4] if image_url: new_filename = f'{str(i).zfill(4)}.jpg' download_image(image_url, save_directory, new_filename) finally: # 确保关闭资源 if 'conn' in locals() and conn.open: cursor.close() conn.close() driver.quit()这段代码用scrapy框架写 ,功能不变
最新发布
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值