網站註冊模塊有個帶圖片驗證碼驗證的環節,實現思路爲:前端請求獲取圖片驗證碼的接口,接口裏生成圖片驗證碼,並保存在session;驗證圖片驗證碼時,從session中獲取圖片驗證碼與當前請求參數做比較,從而實現圖片驗證的過程。前端
涉及兩個接口:生成驗證碼和驗證驗證碼。生成時,沒有問題;到了驗證環節,獲取時,直接爲null,沒法完成驗證。vue
推測多是session過時的問題,而後在相關代碼處獲取了一下sessionid,而後測試了一下,果真sessionid在兩次請求時已經不同。更改了session的有效期java
package com.xxx.xxx; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.context.embedded.ConfigurableEmbeddedServletContainer; import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } /** * session時長設置 * @return */ @Bean public EmbeddedServletContainerCustomizer containerCustomizer(){ return new EmbeddedServletContainerCustomizer() { @Override public void customize(ConfigurableEmbeddedServletContainer Container) { Container.setSessionTimeout(12*60*60);//單位爲S } }; } }
在Spring boot的入口函數Application,經過EmbeddedServletContainerCustomizer設置session有效期。然而,試過以後發現,依然沒法解決個人問題。web
參考:https://segmentfault.com/q/1010000016003300/a-1020000016541534spring
修改後端文件WebMvcConfigurer,增長如下內容:apache
package com.xxx.xxx.configurer; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.method.HandlerMethod; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter; /** * Spring MVC 配置 */ @Configuration public class WebMvcConfigurer extends WebMvcConfigurerAdapter { private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class); //解決跨域問題 @Override public void addCorsMappings(CorsRegistry registry) { System.out.println("我是MyWebConfig跨域"); // 設置容許跨域的路徑 registry.addMapping("/**") // 設置容許跨域請求的域名 .allowedOrigins("*") // 是否容許證書,再也不默認開啓 .allowCredentials(true) // 設置容許的方法 .allowedMethods("*") // 跨域容許時間 .maxAge(3600); /*registry.addMapping("/**");*/ } }
因爲該方案須要前端在js或vue中設置請求,手邊沒有現成的前端項目,故做罷。json
請教大佬。segmentfault
因爲項目架構是大佬所搭,得空請教了一下,原來是項目裏對cookie設置了domain的屬性:設置domain以後,每次請求都會查看一下該次請求是否帶有domain裏對應的內容,有的話會帶上sessionid做爲一次會話;沒有的話不會帶上sessionid天然就成了兩次請求,故sessionid每次都不同。現階段開發階段暫時不須要爲cookie設置domain,故直接將相關配置註釋掉,問題解決。配置文件摘錄以下:後端
application-dev.properties跨域
# 開發環境配置 ##端口和前綴 server.port=8080 server.context-path= server.session.cookie.http-only=true server.session.cookie.path= -- 註釋掉該行以後,問題解決 -- # server.session.cookie.domain=xxx.com server.session.cookie.name=xxx
先記錄一下該次的經驗,深刻的原理和更多的知識之後再慢慢體會。