springboot项目中的跨域配置
什么是跨域?
想要明白什么是跨域,就需要先明白同源策略。浏览器有一种安全机制叫作同源策略,它是用于隔离恶意文件的一种机制。但是在隔离恶意文件的同时,也会把正常的文件隔离。
什么时候就会出现跨域问题?
当所在域与请求域的ip、端口、协议有一个是不同时,就会发生跨域问题。
在spring boot中如何配置
1、使用配置类
@Configuration
public class CrossWebMvcConfig implements WebMvcConfigurer {
//将跨域的路由和地址在配置文件中添加
@Value("${cross.mapping}")
private String mapping;
@Value("${cross.addr}")
private String addr;
/**
* 配置跨域请求
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping(mapping)
.allowedMethods("*")//允许所有的请求方法如:post,get,delect,put等
.allowedHeaders("*")
//.allowCredentials(true) 是否允许发送Cookie, 用于凭证请求
.maxAge(1800)
.allowedOrigins(addr);
}
}
2、使用filter
@Component public class CorsFilter implements Filter { public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletResponse response = (HttpServletResponse) res; response.setHeader("Access-Control-Allow-Origin", "*"); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE"); response.setHeader("Access-Control-Max-Age", "3600"); response.setHeader("Access-Control-Allow-Headers", "x-requested-with"); chain.doFilter(req, res); } public void init(FilterConfig filterConfig) {} public void destroy() {} }
https和http的区别和配置
区别:
1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
配置:
在tomcat中配置
1、在jdk中bin目录下打开cmd输入一下命令
keytool -genkey -v -alias tomcat -keyalg RSA -keystore D:home omcat.keystore -validity 36500
//“D:home omcat.keystore”含义是将证书文件的保存路径,证书文件名称是tomcat.keystore ;“-validity 36500”含义是证书有效期,36500表示100年,默认值是90天 “tomcat”为自定义证书名称
在命令行填写必要参数:
A、 输入keystore密码:此处需要输入大于6个字符的字符串。
B、 “您的名字与姓氏是什么?”这是必填项,并且必须是TOMCAT部署主机的域名或者IP[如:gbcom.com 或者 10.1.25.251](就是你将来要在浏览器中输入的访问地址),否则浏览器会弹出警告窗口,提示用户证书与所在域不匹配。在本地做开发测试时,应填入“localhost”。
C、 你的组织单位名称是什么?”、“您的组织名称是什么?”、“您所在城市或区域名称是什么?”、“您所在的州或者省份名称是什么?”、“该单位的两字母国家代码是什么?”可以按照需要填写也可以不填写直接回车,在系统询问“正确吗?”时,对照输入信息,如果符合要求则使用键盘输入字母“y”,否则输入“n”重新填写上面的信息。
D、 输入<tomcat>的主密码,这项较为重要,会在tomcat配置文件中使用,建议输入与keystore的密码一致,设置其它密码也可以,完成上述输入后,直接回车则在你在第二步中定义的位置找到生成的文件。
2、为客户端生成证书
keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore D:mykey.p12
//双击mykey.p12文件
3、让服务器信任客户端证书
由于是双向SSL认证,服务器必须要信任客户端证书,因此,必须把客户端证书添加为服务器的信任认证。由于不能直接将PKCS12格式的证书库导入,必须先把客户端证书导出为一个单独的CER文件
keytool -export -alias mykey -keystore D:mykey.p12 -storetype PKCS12 -storepass password -rfc -file D:mykey.cer
将该文件导入到服务器的证书库,添加为一个信任证书
keytool -import -v -file D:homemykey.cer -keystore D:home omcat.keystore
通过list命令查看服务器的证书库,可以看到两个证书,一个是服务器证书,一个是受信任的客户端证书:
keytool -list -keystore D:home omcat.keystore
4、让客户端信任服务器证书
由于是双向SSL认证,客户端也要验证服务器证书,因此,必须把服务器证书添加到浏览的“受信任的根证书颁发机构”。由于不能直接将keystore格式的证书库导入,必须先把服务器证书导出为一个单独的CER文件
keytool -keystore D: omcat.keystore -export -alias tomcat -file D: omcat.cer
//双击tomcat.cer文件
5、配置Tomcat服务器
a、打开tomcat配置文件,如:D:/apache-tomcat-6.0.29/conf/server.xml,
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> //修改为 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="443" />
<!-- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"/> --> //去掉注释且修改参数 <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="E:/tomcat.keystore" keystorePass="123456789"/>
<!-- <Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="8443" /> --> //修改参数 <Connector port="8009" enableLookups="false" protocol="AJP/1.3" redirectPort="443" />
b、打开D:/apache-tomcat-6.0.29/conf/web.xml,在该文件</welcome-file-list>后面加上这样一段:
<login-config> <!-- Authorization setting for SSL --> <auth-method>CLIENT-CERT</auth-method> <realm-name>Client Cert Users-only Area</realm-name> </login-config> <security-constraint> <!-- Authorization setting for SSL --> <web-resource-collection > <web-resource-name >SSL</web-resource-name> <url-pattern>/*</url-pattern> </web-resource-collection> <user-data-constraint> <transport-guarantee>CONFIDENTIAL</transport-guarantee> </user-data-constraint> </security-constraint>
在浏览器中输入:https://localhost:443/,会弹出选择客户端证书界面,点击“确定”,会进入tomcat主页,地址栏后会有“锁”图标,表示本次会话已经通过HTTPS双向验证。
springboot中设置https
1、生成证书
和tomcat生成tomcat.keystore一样
2、将这个tomcat.keystore拷贝到项目根目录下(如果有子模块。则放在父模块的根目录下)
3、配置application.properties
#端口号 server.port: 8443 #你生成的证书名字 server.ssl.key-store: E:work ave omcat.keystore #密钥库密码 server.ssl.key-store-password: duan123 server.ssl.keyStoreType: JKS server.ssl.keyAlias: tomcat
4、配置自动跳转
import org.apache.catalina.Context; import org.apache.catalina.connector.Connector; import org.apache.tomcat.util.descriptor.web.SecurityCollection; import org.apache.tomcat.util.descriptor.web.SecurityConstraint; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory; import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory; import org.springframework.context.annotation.Bean; @Configuration public class HttpsConfig { @Bean public EmbeddedServletContainerFactory servletContainer(){ TomcatEmbeddedServletContainerFactory tomcat=new TomcatEmbeddedServletContainerFactory(){ @Override protected void postProcessContext(Context context) { SecurityConstraint securityConstraint=new SecurityConstraint(); securityConstraint.setUserConstraint("CONFIDENTIAL");//confidential SecurityCollection collection=new SecurityCollection(); collection.addPattern("/*"); securityConstraint.addCollection(collection); context.addConstraint(securityConstraint); } }; tomcat.addAdditionalTomcatConnectors(httpConnector()); return tomcat; } @Bean public Connector httpConnector(){ Connector connector=new Connector("org.apache.coyote.http11.Http11NioProtocol"); connector.setScheme("http"); connector.setPort(8080); connector.setSecure(false); connector.setRedirectPort(8443); return connector; } }