跨域
基本流程
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
浏览器发出CORS简单请求,只需要在头信息之中增加一个Origin字段。
浏览器发出CORS非简单请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)。浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。
只要同时满足以下两大条件,就属于简单请求。
1) 请求方法是以下三种方法之一:
HEAD
GET
POST
2)HTTP的头信息不超出以下几种字段:
Accept
Accept-Language
Content-Language
Last-Event-ID
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
3, 具体实现(spring boot)
/**
* 描述: 使用Filter 处理跨域请求,即CORS(跨来源资源共享)。
*
* @author city space
*
*/
@Configuration
public class SimpleCORS
{
/**
* 设置 跨域请求参数,处理跨域请求
*
* @return
*/
@Bean
public CorsFilter corsFilter()
{
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig());
return new CorsFilter(source);
}
private CorsConfiguration buildConfig()
{
CorsConfiguration corsConfiguration = new CorsConfiguration();
// 允许跨域访问的域名
corsConfiguration.addAllowedOrigin("*");
// 请求头
corsConfiguration.addAllowedHeader("*");
// 请求方法
corsConfiguration.addAllowedMethod(HttpMethod.DELETE);
corsConfiguration.addAllowedMethod(HttpMethod.POST);
corsConfiguration.addAllowedMethod(HttpMethod.GET);
corsConfiguration.addAllowedMethod(HttpMethod.PUT);
corsConfiguration.addAllowedMethod(HttpMethod.DELETE);
corsConfiguration.addAllowedMethod(HttpMethod.OPTIONS);
// 预检请求的有效期,单位为秒。
corsConfiguration.setMaxAge(3600L);
// 是否支持安全证书
corsConfiguration.setAllowCredentials(true);
return corsConfiguration;
}
}
4, 配置项解释
4.1 Access-Control-Allow-Origin
该字段必填。它的值要么是请求时Origin字段的具体值,要么是一个*,表示接受任意域名的请求。
4.2 Access-Control-Allow-Methods
该字段必填。它的值是逗号分隔的一个具体的字符串或者*,表明服务器支持的所有跨域请求的方法。注意,返回的是所有支持的方法,而不单是浏览器请求的那个方法。这是为了避免多次"预检"请求。
4.3 Access-Control-Expose-Headers
4.3 该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。
4.4 Access-Control-Allow-Credentials
该字段可选。它的值是一个布尔值,表示是否允许发送Cookie.默认情况下,不发生Cookie,即:false。对服务器有特殊要求的请求,比如请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json,这个值只能设为true。如果服务器不要浏览器发送Cookie,删除该字段即可。
4.5 Access-Control-Max-Age
该字段可选,用来指定本次预检请求的有效期,单位为秒。在有效期间,不用发出另一条预检请求。
注意: CORS请求发送Cookie时,Access-Control-Allow-Origin只能是与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
邮件
QQ邮箱设置
官方文档
实现过程:
1.下载jar包跟源码
2.新建一个类:SendEmail.class
在main方法里:
定义字符串
接收邮箱地址,
发送邮箱地址,
邮件主题,
邮件内容,
服务器的smtp,
//新建properties对象
//传输协议(写死的),如果写错了host,会自动在本地发送接收邮件
//设置认证
//实现认证策略(每个人的都不同,因为认证码都不同) 见第三步创建
//创建session对象(刚刚写的properties,刚刚写的认证策略)
//创建MimeMessage对象,用来封装要发送的数据
//设置发件人
//设置收件人
//设置邮件标题
//设置邮件内容
//设置邮件发送的日期
//生成最终邮件内容
//设置debug模式
session.setDebug(true);
//创建transport传输对象
Transport transport = session.getTransport("smtp");
transport.connect();
//发送给谁,所有接收人
//传输完毕就关闭
transport.close();
3.新建一个认证类继承Authenticator来重写getPasswordAuthenticator()方法
无参构造
4.尝试连接
debug模式会报错,这样方便查找错误
4.服务端 ReceiveEmail类
//pop服务器
//协议
//用户名(邮箱地址)
//设置对应QQ的授权码
//设置属性列表
//设置smtp的服务器,从服务器读取数据
//从session中获取链接
//暂时不开启debug模式,为了运行好看一点
//获取store对象
//把服务器传进去,连接到服务器
//获取对应的邮箱列表(PS:通过pop3获得的Folder对象调用这个方法
邮件夹名称只能为"INBOX",)
//读写权限都有,这样就可以获取所有邮件了
//因为不止一封邮件,所以搞一个集合
//遍历去访问
for(Message message : messages){
}
163的例子
package com.email;
import java.util.Date;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MyAhthenticator extends Authenticator {
public static String senderAddress="发送的邮箱地址";
public static String receiveAddress="接收的邮箱地址";
public static String senderAccount="主题";
public static String senderPassword="密码";
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.transport.protocol", "smtp");
props.setProperty("mail.smtp.host", "smtp.163.com");
Session session = Session.getInstance(props);
session.setDebug(true);
Message msg=getMimeMessage(session);
Transport transport = session.getTransport();
transport = session.getTransport();
transport.connect(senderAccount, senderPassword);
transport.sendMessage(msg,msg.getAllRecipients());
transport.close();
}
public static MimeMessage getMimeMessage(Session session) throws Exception{
//创建一封邮件的实例对象
MimeMessage msg = new MimeMessage(session);
//设置发件人地址
msg.setFrom(new InternetAddress(senderAddress));
/**
* 设置收件人地址(可以增加多个收件人、抄送、密送),即下面这一行代码书写多行
* MimeMessage.RecipientType.TO:发送
* MimeMessage.RecipientType.CC:抄送
* MimeMessage.RecipientType.BCC:密送
*/
msg.setRecipient(MimeMessage.RecipientType.TO,new InternetAddress(receiveAddress));
//设置邮件主题
msg.setSubject("邮件主题","UTF-8");
//设置邮件正文
msg.setContent("简单的纯文本邮件!", "text/html;charset=UTF-8");
//设置邮件的发送时间,默认立即发送
msg.setSentDate(new Date());
return msg;
}
}
运行效果:
(收不到邮箱就在垃圾箱里找找)