• 每日一记8.12


    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;
        }
    
    }
  • 相关阅读:
    Git和SVN之间的五个基本区别
    如何成为一名程序员:我的道路
    产品经理要懂多少技术?
    Unix哲学相关资源汇总
    Android.mk简介
    Android 中的 Service 全面总结
    获取Map集合中数据的方法
    少编码多思考:代码越多 问题越多
    【自定义Android带图片和文字的ImageButton】
    Android task process thread 进程与线程
  • 原文地址:https://www.cnblogs.com/sunshine-2018/p/11337846.html
Copyright © 2020-2023  润新知