3.1.7 构造方法

本文详细介绍了Java中的构造方法,包括构造方法的定义、特点、重载和默认构造方法的作用。强调了构造方法在实例化对象时自动调用,以及在类中未定义构造方法时,系统会提供默认无参构造方法。同时,通过实例说明了构造方法重载的概念,即创建多个构造方法以供不同初始化需求。

构造方法

构造方法(也被称为构造器)是类的一个特殊成员方法,在类实例化对象时自动调用。
构造方法是特殊的成员方法,在定义时,有以下几点需要注意:

  1. 构造方法的名称必须与类名一致。
  2. 构造方法名称前不能有任何返回值类型的声明。
  3. 不能在构造方法中使用return返回一个值,但是可以单独写return语句作为方法的结束。

例1:

class Student{
	public Student(){
		System.out.println("调用了无参构造方法。");
	}
}
public class Test{
	public static void main(String[] args){
		Student stu=new Student();
	}
}

上面的代码执行结果:

调用了无参构造方法。

在main方法中创建了一个Student类的对象stu,用new关键字进行实例化时,Student类的构造方法会被自动调用。

构造方法的重载

构造方法也是可以重载的。
例2:

class Student{
	private String name;
	private int age;
	//getter、setter方法略
	
	public Student(){
		System.out.println("调用了无参构造方法。");
	}
	public Student(String name,int age){
		this.name=name;
		this.age=age;
		System.out.println("调用了带两个参数的构造方法。");
	}
}
public class Test{
	public static void main(String[] args){
		Student stu1=new Student();
		Student stu2=new Student("陈明明",15);
	}
}

上面的代码执行结果:

调用了无参构造方法。
调用了带两个参数的构造方法。

上面的代码中,又定义了一个带两个参数的构造方法,当在main方法中创建对象stu2时就自动调用这个带参构造方法,并为两个属性赋值。构造方法的作用其实就是为了给属性赋初值。

默认构造方法

在Java中的每个类都至少有一个构造方法,如果在一个类中没有定义构造方法,系统会自动为这个类创建一个默认的构造方法,这个默认的构造方法没有参数,方法体中没有任何代码,即什么也不做。
例3:

class Student{
}
public class Test{
	public static void main(String[] args){
		Student stu=new Student();
	}
}

上面的Student类中虽然没有构造方法,但是下面的main方法中创建对象stu时并不会报错,因为系统会自动为Student类添加一个无参构造方法。
但是如果程序员已经为类添加了构造方法,系统就不会再自动添加这个默认的构造方法了。
例4:

class Student{
	private String name;
	private int age;
	//getter、setter方法略

	public Student(String name,int age){
		this.name=name;
		this.age=age;
		System.out.println("调用了带两个参数的构造方法。");
	}
}
public class Test{
	public static void main(String[] args){
		Student stu1=new Student();
		Student stu2=new Student("陈明明",15);
	}
}

上面这个例子会在创建对象stu1时报错,原因就是Student类中已经有了一个带参数的构造方法,系统就不会再自动为其添加无参构造方法,而下面的main方法中创建对象stu1时又需要调用无参构造方法,这时就会报错。
一般的做法是为类添加构造方法时,至少要定义一个无参构造方法。

注意:
构造方法一般是public级

### 3.1 XSS漏洞绕过方法 XSS(跨站脚本攻击)漏洞常用于在网页中注入恶意脚本,攻击者通过绕过前端或后端的过滤机制实现攻击目的。以下是一些常见的绕过方式: #### 3.1.1 大小写混编绕过 某些网站采用简单的黑名单机制,仅过滤特定关键字如 `<script>`,但未对大小写进行统一处理。攻击者可利用大小写混合的方式绕过检测机制,例如使用 `<ScRiPt>` 或 `<sCrIpT>` 等形式[^1]。 示例: ```html <ScRiPt>alert(1)</sCrIpT> ``` #### 3.1.2 双写绕过 部分过滤机制会对特定关键字进行替换或删除,例如将 `<script>` 替换为空字符串。攻击者可以采用双写方式,使过滤逻辑无法完全匹配目标字符串,从而保留原始内容[^3]。 示例: ```html <scr<script>ipt>alert(1)</scr</script>ipt> ``` #### 3.1.3 使用注释插入干扰字符 攻击者可以在标签中插入 HTML 注释 `<!-- -->`,以破坏过滤器对关键字的识别。例如: ```html <scr<!--1-->ipt>alert(1)</scr<!--2-->ipt> ``` 这种方式可绕过对完整标签的识别[^2]。 #### 3.1.4 引号绕过与标签闭合 当输入被包裹在标签属性中时,攻击者可以通过闭合标签并插入恶意代码的方式实现攻击。例如,在 `<input value="...">` 中注入: ```html "><script>alert(1)</script> ``` 此外,若引号被过滤,可尝试省略引号或使用其他属性触发[^3]。 #### 3.1.5 利用伪协议与事件触发 攻击者可以利用 `javascript:` 伪协议构造恶意链接,例如: ```html <a href="javascript:alert(1)">点击</a> ``` 此外,利用 HTML 事件如 `onerror`、`onload` 等也可实现无 `<script>` 标签的攻击: ```html <img src="x" onerror="alert(1)"> ``` 该方式可绕过对 `<script>` 的过滤。 #### 3.1.6 编码绕过 使用 HTML 实体编码、URL 编码等方式可绕过对关键字的检测。例如: ```html <script>alert(1)</script> ``` 或将整个标签进行 Unicode 编码,使得过滤器无法识别原始字符串[^1]。 #### 3.1.7 使用其他标签和样式注入 除 `<script>` 外,攻击者还可利用 `<img>`、`<body>`、`<style>` 等标签实现 XSS 攻击。例如: ```html <body onload="alert(1)"> ``` 或在 CSS 中嵌入脚本,如: ```html <style type="text/css"> { background:url("javascript:alert(1)"); } </style> ``` 此类方式可绕过对脚本标签的过滤[^3]。 --- ### 3.2 XSS绕过技巧总结 - **标签闭合与属性注入**:通过闭合当前标签并插入新标签实现脚本注入。 - **大小写变形与双写**:绕过关键字黑名单机制。 - **注释干扰与拆分注入**:破坏关键字识别逻辑。 - **事件触发与伪协议**:无需完整 `<script>` 标签即可执行脚本。 - **编码与实体转换**:绕过对明文关键字的检测。 - **样式与标签变形**:利用非脚本标签执行恶意逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值