`
sanry
  • 浏览: 37099 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

现有web系统替换成Spring Boot2框架 之21 同时支持带项目名和不带项目名访问,web访问强制https,接口保持http访问

阅读更多

由于历史原因项目需要同时支持带项目名访问和不带项目名访问,并且web访问需要强制转换成https,但是原有接口是http,需要同时支持。使用了现有方法和自己在过滤器中实现的部分逻辑完成

1. 配置文件application.properties

 

#https port
server.port=8443
#http port
server.http.port=8080
#是否启用https,代码中也用到此配置作为判断依据
server.ssl.enabled=true
#SSL证书路径,如果证书是打包在resource路径下的写classpath:xxxx.jks
server.ssl.key-store=/usr/local/work/smallbss/config/baicells.cloudapp.net.jks
server.ssl.key-store-password=1pcs4f7r78h
server.ssl.key-store-type=JKS
#项目路径默认设置成不带项目名
server.servlet.context-path=/

 

 配置中server.port=8443是https使用的端口,server.http.port=8080是http使用的端口。

项目路径默认设置成不带项目名是为了用户使用项目名访问时可以在过滤器中处理url,如果默认带项目名,再使用不带项目名访问就进不了过滤器,无法自己增加处理逻辑。此处将项目名去掉后还遇到了一些琐碎的问题,需要慢慢处理。

 

 

2. 配置过滤器和支持同时支持http和https访问:

 

import javax.servlet.DispatcherType;

import org.apache.catalina.connector.Connector;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.ConfigurableWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.DelegatingFilterProxy;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SystemWebMvcConfig  implements WebMvcConfigurer {

	@Value("${server.http.port}")
    private int serverHttpPort;
	
	/**
	 * 支持http和https同时访问
	 * @return
	 * 
	 */
	@Bean
    public WebServerFactoryCustomizer<ConfigurableWebServerFactory> webServerFactoryCustomizer() {
        return new WebServerFactoryCustomizer<ConfigurableWebServerFactory>() {

            @Override
            public void customize(ConfigurableWebServerFactory factory) {
                if (factory instanceof TomcatServletWebServerFactory) {
                    TomcatServletWebServerFactory webServerFactory = (TomcatServletWebServerFactory)factory;
                    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
                    // 设置http访问的端口号,不能与https端口重复,否则会报端口被占用的错误
                    connector.setPort(serverHttpPort);
                    webServerFactory.addAdditionalTomcatConnectors(connector);
                }
            }
        };
    }
	
	/**
	 * 添加过滤器
	 * @return
	 * 
	 */
	@Bean
    public FilterRegistrationBean<DelegatingFilterProxy> testFilterRegistration() {

        FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<DelegatingFilterProxy>();
        registration.setFilter(new DelegatingFilterProxy("cloudFilter"));
        registration.addUrlPatterns("/*");
        registration.addInitParameter("paramName", "paramValue");
        registration.setEnabled(true);
        registration.setDispatcherTypes(DispatcherType.REQUEST);
        registration.setOrder(1);
        return registration;
    }
    
    @Bean(name="cloudFilter")
    public cloudFilter createBssFilter() {
        return new cloudFilter();
    }
    
}

 WebServerFactoryCustomizer()是设置http和https同时支持,原有接口调用http,web访问也可以用http,强制跳转到https在下边过滤器中实现。

3. 过滤器实现强制转换https和项目名转换

 

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Value;

public class cloudFilter implements Filter {
	private static Logger logger = Logger.getLogger(cloudFilter.class);
    
	 //配置文件中配置的项目名
	 @Value("${server.servlet.context-path}")
	 private String context_path;
	 
	 //https的访问端口
	 @Value("${server.port}")
	 private int https_port;
	 
	 //https的访问端口
	 @Value("${server.http.port}")
	 private int http_port;
	 
	 //是否启用SSL
	 @Value("${server.ssl.enabled}")
	 private boolean server_ssl_enabled;

   @Override
   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
           throws IOException, ServletException {
   	
       HttpServletRequest httpRequest = (HttpServletRequest) request;
       HttpServletResponse httpResponse = (HttpServletResponse) response;
       String path = httpRequest.getRequestURI();
       
       //访问首页即登陆时,如果启用ssl需要强制转换成https,并且处理项目名,支持带项目名和不带项目名同时访问
      	if("/mywebobject".equals(path) || "/mywebobject/".equals(path) || "/".equals(path)) {
      		String scheme = httpRequest.getScheme();
      		int port = http_port;
            logger.info("==============httpRequest.getRequestURL()=============="+httpRequest.getRequestURL());
            if(!context_path.replace("/", "").equals(path.replace("/", "")) || (server_ssl_enabled && !"https".equals(scheme))) {
            	URI reqUri = null;
          		try {
                    //启用SSL之后,登录页如果是http访问强制转换成https
          			if(server_ssl_enabled) {
                  	   scheme = "https";
                  	   port = https_port;
                     }
          			if(httpRequest.getQueryString()!=null && !"".equals(httpRequest.getQueryString())){
          				reqUri = new URI(httpRequest.getRequestURL()+"?"+httpRequest.getQueryString());
          			}else{
          				reqUri = new URI(httpRequest.getRequestURL().toString());
          			}
          			
          			//生成新的的跳转路径,注意端口和请求协议
              		URI newUri = new URI(scheme, reqUri.getUserInfo(),
          	                reqUri.getHost(), port, context_path,
          	                reqUri.getQuery(), reqUri.getFragment());
              		logger.info("=============new uri========"+newUri);
              		httpResponse.sendRedirect(newUri.toString());
              		return;
          		}catch(URISyntaxException e) {
          			logger.error(e.getMessage(),e);
          		}
            }
      	} else if (path.startsWith("/mywebobject")) {
      	//由于系统去掉默认项目名,接口访问时为了不需要客户端修改,再这将接口中的项目名去掉,转换成配置文件中的项目名
      		logger.info("=============path========"+path);
           	path = path.replaceFirst("/mywebobject", context_path).replace("//", "/");
           	logger.info("=============new path========"+path);
           	httpRequest.getRequestDispatcher(path).forward(request, response);
           	return;
      	}
      	chain.doFilter(request, response);//执行请求
      	return;
   }
}

 通过上边的过滤器处理,就实现了浏览器访问web将http强制转换成https,接口调用还是使用http。并且将带项目名的url处理成不带项目名。直接将项目名配置成“/”原代码可能会遇到一些问题需要根据实际情况来处理

 

 

分享到:
评论

相关推荐

    Spring boot web 访问

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化Spring应用的初始搭建以及开发过程。它集成了大量常用的第三方库配置,如数据库、日志、安全等,极大地提高了开发效率。在"Spring Boot web 访问"这个主题中...

    spring boot 项目框架

    Spring Boot 是一个基于 Spring 框架的快速开发工具,旨在简化初始设置和常见的配置问题,使得开发者可以更快地启动和运行应用程序。Spring Boot 的核心理念是“约定优于配置”,它通过内建默认配置,降低了项目的...

    Spring Boot 2 Recipes

    获取Spring Boot 2微框架的可重用代码配方和代码段 了解Spring Boot 2如何与其他Spring API,工具和框架集成 访问Spring MVC和新的Spring Web Sockets,以实现更简单的Web开发 使用微服务进行Web服务开发并与Spring ...

    spring boot+mybatis+layui实现的项目基本框架

    《基于Spring Boot、MyBatis与Layui的项目基础框架构建详解》 在现代Web应用开发中,Spring Boot以其简化配置、快速启动的优势成为首选的框架。MyBatis作为轻量级持久层框架,提供了灵活的数据访问能力,而Layui则...

    Spring boot访问jsp页面

    在本文中,我们将深入探讨如何使用Spring Boot框架访问JSP页面,同时介绍如何结合Maven插件和MyBatis来自动生成Mapper、Model和相关的XML配置文件,以便于简化开发流程。 首先,让我们来理解Spring Boot与JSP的集成...

    Spring-boot web项目实例

    在本项目中,"Spring-boot web项目实例" 是一个基于Spring Boot框架构建的Web应用程序。Spring Boot是由Pivotal团队提供的一个开源框架,其目的是简化Spring应用的初始搭建以及开发过程,它集成了大量常用的第三方库...

    spring boot 全套示例框架源码 几十套

    在Spring Boot项目中,可以使用Spring Security OAuth2 来实现这一功能,提供安全的API访问和第三方应用接入。 5. **FastDFS**:FastDFS 是一个开源的分布式文件系统,特别适合于存储大量小文件。它支持负载均衡和...

    spring-boot-maven的web完整项目框架

    **Spring Boot Maven Web 完整项目框架详解** Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目标是用来简化新 Spring 应用的初始搭建以及开发过程。它集成了大量的常用组件,如数据源、JPA、WebSocket、...

    spring boot web项目

    【标题】"Spring Boot Web项目"是基于Spring Boot框架构建的Web应用程序,它极大地简化了传统Spring项目的配置和启动过程,使得开发人员可以快速搭建功能丰富的应用系统。Spring Boot的核心特性在于“约定优于配置”...

    web,spring boot 集成帆软,finereport

    Spring Boot以其简洁、高效和自动配置的特性,成为Java领域开发微服务和Web应用的首选框架。而Finereport作为一款强大的报表设计工具,能够帮助开发者轻松地创建和展示各种复杂的业务报表。下面我们将详细讲解集成...

    普通javaweb项目调用springCloud接口(超级实用,很详细)

    ### 普通JavaWeb项目调用Spring Cloud接口详解 #### 前言 在现代软件开发中,微服务架构已成为构建大型复杂系统的主流选择之一。Spring Boot 和 Spring Cloud 作为构建微服务的重要工具,其易用性和强大的功能受到...

    spring_boot_web 微服务项目

    Spring Boot Web微服务项目是基于Spring Boot框架实现的一种高效开发微服务的方式,它简化了配置,提高了开发效率,并且支持快速部署。 一、Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,旨在简化...

    spring boot入门的第一个项目

    本篇文章将深入探讨Spring Boot入门项目的构建过程,以及它如何与微服务和分布式系统相结合。 **1. Spring Boot基础知识** Spring Boot 的核心理念是“约定优于配置”。它通过内置的Tomcat服务器、自动配置的Spring...

    Spring Boot + Vue3 完整开发全栈项目附资料.zip

    2. 模板引擎:Spring Boot支持Thymeleaf、Freemarker等模板引擎,但Vue3通常用于构建SPA,不直接与服务器渲染模板。 3. 自动配置:通过@SpringBootApplication注解启动自动配置,简化配置文件。 五、Vue3核心特性 1...

    idea 创建的Spring boot 空框架

    2. **依赖管理**:Spring Boot通过`pom.xml`(Maven项目)或`build.gradle`(Gradle项目)文件管理依赖,这些文件已经包含了Spring Boot Starter Parent,它提供了默认的依赖版本管理和构建配置。 3. **启动器...

    spring Boot 2精髓带源码带书签目录高清版

    《Spring Boot 2精髓》是一本深度探讨Spring Boot 2框架的权威指南,结合源码与高清书签目录,为读者提供了丰富的学习资源。这本书详细介绍了如何利用Spring Boot简化Java应用开发,提升效率,以及如何在实际项目中...

    简单的spring boot项目

    【标题】"简单的spring boot项目"是一个基于Java的Web应用程序,使用了流行的Spring Boot框架作为基础。Spring Boot简化了创建独立、生产级别的基于Spring的应用程序的过程,它集成了大量常用的第三方库配置,如数据...

    spring_boot 框架代码原型设计

    Spring Boot 是一个由 Pivotal 团队开发的框架,旨在简化 Spring 应用程序的初始搭建以及开发过程。它提供了“开箱即用”的功能,通过预设配置,使得开发者能够快速启动并运行项目,减少了大量的配置工作。在本文中...

    LEARNING SPRING BOOT 3.0 - THIRD EDITION

    Spring Boot是Spring生态系统中的一个核心组件,它通过自动化配置、起步依赖和内嵌式Web服务器等功能,极大地简化了Java应用的开发。 在Spring Boot 3.0版本中,我们可以期待一系列更新和改进,包括性能提升、新...

    基于Vue和Spring Boot的校园记录管理Web App的设计与实现.pdf

    2. Vue和Spring Boot框架的应用:本文介绍了Vue和Spring Boot框架在校园记录管理Web App中的应用,包括框架的选择、框架的优点、框架的实现等方面。 3. HTML5的应用:本文介绍了HTML5在校园记录管理Web App中的应用...

Global site tag (gtag.js) - Google Analytics