Spring Boot項目每次請求Session都不同的記錄

背景

網站註冊模塊有個帶圖片驗證碼驗證的環節,實現思路爲:前端請求獲取圖片驗證碼的接口,接口裏生成圖片驗證碼,並保存在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

先記錄一下該次的經驗,深刻的原理和更多的知識之後再慢慢體會。

相關文章
相關標籤/搜索