第八课:springboot 通过@Profile注解配合maven打包的应用

第八课:springboot 通过@Profile注解配合maven打包的应用

  • 简介
  • 项目的结构
  • 代码内容
    • 1.pom.xml
    • 2.application.properties
    • 3.IpAddressInInterceptor.java
    • 4.WebMvcConfig.java
  • 实现的原理内容

简介

基于前面的 文章
第六课:springboot实现不同环境配置加载方式一

项目中我们不但会碰到不同的测试环境配置的文件可能不同;有时间配置的一些拦截器或者特殊功能的类也有可能是不同的; 那就需要我们根据不同的环境配置来确定某些对象是否生效;
比如案例中的白名单设置;我希望在线上环境是生效的;但是对应的测试环境没有什么太多作用;还需要根据不同的上游配置很多的白名单信息; 就需要用到@Profile注解;
@Profile 注解可以设置在对象或者对应的@Bean注释的方法上;标识当前spring.profiles.active 中配置的值和@Profile注解中的value值一样的时间才会生效;
项目demo下载

项目的结构

第八课:springboot 通过@Profile注解配合maven打包的应用_第1张图片

代码内容

1.pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.khy.boot</groupId>
  <artifactId>boot-profiles</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
   <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.4.RELEASE</version>
	</parent>
	
     <properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<!--含有多个main 需要指定某一个启动class-->
		<start-class>com.khy.MainApplication</start-class>
	</properties>
	
	 <dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency> 
		
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.6</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
			<version>3.4</version>
		</dependency>
		<dependency>
			<groupId>commons-collections</groupId>
			<artifactId>commons-collections</artifactId>
		</dependency>
  </dependencies>
  
  	<!-- 通过maven的profiles 来替换application.properties文件中的profiles -->
	<profiles>
		<profile>
			<id>dev</id>
			<properties>
				<profileActive>dev</profileActive>
			</properties>
		</profile>
		<profile>
			<id>prod</id>
			<properties>
				<profileActive>prod</profileActive>
			</properties>
			<!-- 默认线上的配置是生效的怕设置忘记了 -->
			<activation>
				<activeByDefault>true</activeByDefault>
			</activation>
		</profile>
		<profile>
			<id>test</id>
			<properties>
				<profileActive>test</profileActive>
			</properties>
		</profile>
	</profiles>
  
	<build>
	    <plugins>
	        <plugin>
	            <groupId>org.springframework.boot</groupId>
	            <artifactId>spring-boot-maven-plugin</artifactId>
	        </plugin>
	    </plugins>
	</build>
</project>

2.application.properties

server.port=8080
spring.profiles.active=@profileActive@

3.IpAddressInInterceptor.java

/**
 * ip白名单拦截器
 * @author khy
 * @createTime 2020年6月15日下午2:27:37
 */
public class IpAddressInInterceptor extends HandlerInterceptorAdapter {
	// 模拟添加的白名单内容 可以配置到对于的数据库或者缓存文件中
    private final static List<String>WHITELIST = new ArrayList<String>(){{
    	add("127.0.0.1");
    }};
    
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        StringBuffer requestURL = httpServletRequest.getRequestURL();
        boolean res= handleMessage(httpServletRequest);
        if (res == false) {
        	httpServletResponse.setCharacterEncoding("UTF-8");
        	httpServletResponse.setContentType("application/json;charset=utf-8");
			String msg = " 未授权的客户端IP: " + getRealIp(httpServletRequest);
			JSONObject json = new JSONObject();
			json.put("code", "10000");
			json.put("msg", msg);
        	httpServletResponse.getWriter().write(json.toString());
        }
        return res;
    }


    /**
     * 验证IP是否授权
     *
     */
    private boolean handleMessage(HttpServletRequest request){
        // HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
        // 通过一个IpAddressConfig对象,从XML文件中读取预先设置的允许和拒绝的IP地址,这些值也可以来自数据库
        String ipAddr = getRealIp(request); // 取客户端IP地址

        boolean valid = false;
        if(WHITELIST.contains(ipAddr)){ //如果配置的集合中含有当前ip白名单则执行
        	valid = true;
        }
        if (valid) {
            return true;
        } else {
            return false;
        }
    }

	 /**
	  * 从Request对象中获得客户端IP,处理了HTTP代理服务器和Nginx的反向代理截取了ip
	  * @author  khy
	  * @createTime 2020年6月15日下午2:29:51
	  * @param request
	  * @return
	  */
    private String getRealIp(HttpServletRequest request) {
        //String ip = request.getHeader("cdn-src-ip");
        String ip = request.getHeader("X-Real-IP");
        if (StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
            return ip;
        }
        return request.getRemoteAddr();
    }

}

4.WebMvcConfig.java

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

	@Autowired(required=false)
	private IpAddressInInterceptor ipAddressInInterceptor;

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		if(null != ipAddressInInterceptor){
			registry.addInterceptor(ipAddressInInterceptor)
			.addPathPatterns("/**")//标识拦截所有
			.excludePathPatterns("/","/test/**");//标识设置的请求不被拦截;
		}
	}
 
	/**
	 * 标识只有spring.profiles.active = prod 的时间当前对象才会被初始化
	 * @author  khy
	 * @createTime 2020年6月15日下午2:44:15
	 * @return
	 */
	@Bean("ipAddressInInterceptor")
	@Profile(value="prod")
	public IpAddressInInterceptor initInterecptor() {
		IpAddressInInterceptor interceptor = new IpAddressInInterceptor();
		return interceptor;
	}
}

实现的原理内容

通过前面两篇文章我们通过maven打包实现加载不同环境的配置;通过maven 打包时指定 -P dev 我们选择使用dev环境的配置文件;同时application.properties文件中的
spring.profiles.active=@profileActive@
的profileActive 会被替换成打包指定的对于的环境的值

当前案例中默认的使用的是prod 的配置;
当我们打包的时间指定 -P dev ; application.properties文件中的spring.profiles.active=dev 在WebMvcConfig 中注入的
@Bean 注释的initInterecptor 方法并不会被执行;所以上面添加对于拦截器的时间给排除掉了;

你可能感兴趣的:(springboot,java,spring,maven)