Spring-boot中Http与Https兼容例子

[b]Spring-boot中Http与Https兼容例子[/b]


1.证书生成参考:[url]http://huangyongxing310.iteye.com/blog/2352693[/url]


[b]application.properties[/b]

#Server
server.port=8090

#LOGGING
logging.pattern.level=INFO

#server.port:8443
#server.ssl.key-store: classpath:keystore.p12
##server.ssl.key-store-password: aqjcpt
#server.ssl.key-store-password:123456
#server.ssl.keyStoreType: PKCS12
#server.ssl.keyAlias: tomcat


package com.cesmart;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;

@EnableAutoConfiguration
@ComponentScan(basePackages = "com.cesmart") // 扫描那些包得到bean.@ComponentScan({"com.teradata.notification","com.teradata.dal"})
//@EnableSwagger2 //启动swagger注解
public class Application {
public static void main(String[] args) {
ApplicationContext applicationContext = SpringApplication.run(Application.class, args);
}
}



package com.cesmart.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.google.common.base.Predicates;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration//定义为spring boot 的配置文件
@EnableSwagger2//启动swagger注解
public class Swagger2 {
public static final String SWAGGER_SCAN_BASE_PACKAGE = "com.cesmart.controller";

@Bean(value="createRestApi")
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("test1")
.pathMapping("/")
.apiInfo(apiInfo())
.select()
.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
.paths(Predicates.or(PathSelectors.regex("/*/.*")))
.build();

//groupName,分组名字
//pathMapping,映射路径(会加到URL前面组成新的路径,如:"/xing/WebTest/webTest",(pathMapping("/xing")))
//apiInfo,API信息描述
//select, 选择那些路径和api会生成document
//apis,扫描那些包,RequestHandlerSelectors.any()表示对所有api进行监控
//paths,匹配那些路径,PathSelectors.any()表示所有路径,
}

@Bean(value="createRestApi2")
public Docket createRestApi2() {
return new Docket(DocumentationType.SWAGGER_2)
.groupName("test2")
.pathMapping("/")
.apiInfo(apiInfo2())
.select()
.apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE))
.paths(Predicates.or(PathSelectors.regex("/*/.*")))
.build();
}


private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("Spring Boot中使用Swagger2构建RESTful APIs")
.description("更多Spring Boot相关文章请关注:http://blog.didispace.com/")
.termsOfServiceUrl("http://blog.didispace2.com/")
.contact("程序猿DD")
.version("1.0")
.license("license")
.licenseUrl("licenseUrl")
.build();

//title,标题,在页面顶部显示
//description,描述,在页面顶部显示
//termsOfServiceUrl,
//contact,显示“Created by + contact”,在页面顶部显示
//version,API版本,,在页面顶部显示
//license,版权
}

private ApiInfo apiInfo2() {
return new ApiInfoBuilder()
.title("Spring Boot中使用Swagger2构建RESTful APIs")
.description("更多Spring Boot相关文章请关注:http://blog.didispace.com/")
.termsOfServiceUrl("http://blog.didispace2.com/")
.contact("程序猿DD")
.version("1.0")
.license("license")
.licenseUrl("licenseUrl")
.build();
}

}



package com.cesmart.config;

import java.io.File;

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.context.embedded.ConfigurableEmbeddedServletContainer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;
import org.springframework.boot.context.embedded.EmbeddedServletContainerFactory;
import org.springframework.boot.context.embedded.Ssl;
import org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainerFactory;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

import com.google.common.base.Predicates;

import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration // 定义为spring boot 的配置文件

public class WebConfig {

// Http访问的URL
private static final String HTTP_URL_PATTERNS[] = { "/HttpTest/*" };

// Https访问的URL
private static final String HTTPS_URL_PATTERNS[] = { "/HttpsTest/*" };

@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer() {
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
Ssl ssl = new Ssl();
// Server.jks中包含服务器私钥和证书
ssl.setKeyStore("classpath:keystore.p12");
ssl.setKeyStorePassword("123456");
container.setSsl(ssl);
container.setPort(8443);
}
};
}

@Bean
public EmbeddedServletContainerFactory servletContainerFactory() {
TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory() {
@Override
protected void postProcessContext(Context context) {
// SecurityConstraint必须存在,可以通过其为不同的URL设置不同的重定向策略。
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
for (String pattern : HTTPS_URL_PATTERNS) {
collection.addPattern(pattern);
}
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);

// ==============
SecurityConstraint securityConstraintHttp = new SecurityConstraint();
securityConstraintHttp.setUserConstraint("NONE");
SecurityCollection collectionHttp = new SecurityCollection();
for (String pattern : HTTP_URL_PATTERNS) {
collectionHttp.addPattern(pattern);
}
securityConstraintHttp.addCollection(collectionHttp);
context.addConstraint(securityConstraintHttp);

}
};
factory.addAdditionalTomcatConnectors(createHttpConnector());
return factory;
}

private Connector createHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
connector.setScheme("http");
connector.setSecure(false);
connector.setPort(8090);
connector.setRedirectPort(8443);
return connector;
}

}



package com.cesmart.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

@RestController
@Api(value = "HttpsTest", description = "有关于HttpsTest操作")
@RequestMapping(value = "/HttpsTest")
// 用在类上,说明该类的作用
// value,显示在类中的说明
// description,类中的说明
// 显示形式:“value:description”,如上面显示为"WebTest:有关于Swagger2操作"
public class HttpsTest {
@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
// 用在方法上,说明方法的作用
// 显示在方法说明中,显示notes
// response,接口返回参数类型
// value = "接口说明",
// notes = "接口发布说明"
@ApiImplicitParams({
@ApiImplicitParam(paramType = "path", required = true, name = "test", dataType = "String", value = "456"),
@ApiImplicitParam(paramType = "path", required = true, name = "test2", dataType = "String", value = "789") })
// @ApiImplicitParam,表示一个参数的描述,与请求参数有关系
// paramType,参数放在哪个地方
// required,参数是否必须传
// name,参数名
// dataType,参数类型(描述)
// value,参数的意思(描述)
@ApiParam
@RequestMapping(value = "/HttpsTestGet/{test}/{test2}", produces = "text/plain;charset=UTF-8", method = RequestMethod.GET)
public String HttpsTestGet(@PathVariable("test") String test, @PathVariable("test2") String test2) {
System.out.println("HttpTest");
System.out.println("test == " + test);
System.out.println("test2 == " + test2);
return "HttpTest";
}

@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
@ApiImplicitParams({
@ApiImplicitParam(paramType = "query", required = true, name = "test", dataType = "String", value = "456", defaultValue = "test"),
@ApiImplicitParam(paramType = "query", required = true, name = "test2", dataType = "String", value = "789", defaultValue = "test2") })
@RequestMapping(value = "/HttpsTestPost", produces = "text/plain;charset=UTF-8", method = RequestMethod.POST)
public String HttpsTestPost(String test, String test2) {
System.out.println("webTest");
System.out.println("test == " + test);
System.out.println("test2 == " + test2);
return "webTest";
}

}



package com.cesmart.controller;

import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;

@RestController
@Api(value = "HttpTest", description = "有关于HttpTest操作")
@RequestMapping(value = "/HttpTest")
// 用在类上,说明该类的作用
// value,显示在类中的说明
// description,类中的说明
// 显示形式:“value:description”,如上面显示为"WebTest:有关于Swagger2操作"
public class HttpTest {
@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
// 用在方法上,说明方法的作用
// 显示在方法说明中,显示notes
// response,接口返回参数类型
// value = "接口说明",
// notes = "接口发布说明"
@ApiImplicitParams({
@ApiImplicitParam(paramType = "path", required = true, name = "test", dataType = "String", value = "456"),
@ApiImplicitParam(paramType = "path", required = true, name = "test2", dataType = "String", value = "789") })
// @ApiImplicitParam,表示一个参数的描述,与请求参数有关系
// paramType,参数放在哪个地方
// required,参数是否必须传
// name,参数名
// dataType,参数类型(描述)
// value,参数的意思(描述)
@ApiParam
@RequestMapping(value = "/HttpTestGet/{test}/{test2}", produces = "text/plain;charset=UTF-8", method = RequestMethod.GET)
public String HttpTestGet(@PathVariable("test") String test, @PathVariable("test2") String test2) {
System.out.println("HttpTest");
System.out.println("test == " + test);
System.out.println("test2 == " + test2);
return "HttpTest";
}

@ApiOperation(value = "接口说明", notes = "接口发布说明", response = String.class)
@ApiImplicitParams({
@ApiImplicitParam(paramType = "query", required = true, name = "test", dataType = "String", value = "456", defaultValue = "test"),
@ApiImplicitParam(paramType = "query", required = true, name = "test2", dataType = "String", value = "789", defaultValue = "test2") })
@RequestMapping(value = "/HttpTestPost", produces = "text/plain;charset=UTF-8", method = RequestMethod.POST)
public String HttpTestPost(String test, String test2) {
System.out.println("webTest");
System.out.println("test == " + test);
System.out.println("test2 == " + test2);
return "webTest";
}

}



参考(在Spring Boot中使用Https(应用参考这个)):[url]http://www.cnblogs.com/xinzhao/p/4952856.html[/url]
参考(Spring Boot基于Tomcat的HTTP和HTTPS协议配置,这个好):[url]http://kchu.me/2015/08/19/Spring-Boot%E5%9F%BA%E4%BA%8ETomcat%E7%9A%84HTTP%E5%92%8CHTTPS%E5%8D%8F%E8%AE%AE%E9%85%8D%E7%BD%AE/[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jie310600

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值