在 spring rest / spring boot 中添加自定义 header 响应

Adding custom header to response in spring rest / spring boot

我正在尝试发送 session ID 作为响应 header 在休息控制器中,但 excludepathpattern() 似乎不起作用

** 配置 class 未触发 **

i have tried changing the sevlet version but it didnt work

上下文监听器

@Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        Map<String, HttpSession> map = new HashMap<>();
        context.setAttribute("activeUsers", map);

HttpSessionListener

ServletContext context = session.getServletContext();
        Map<String, HttpSession> activeUsers = (Map<String, HttpSession>) context.getAttribute("activeUsers");

        activeUsers.put(session.getId(), session);

处理程序拦截器

ServletContext context = request.getServletContext();
        Map<String, HttpSession> activeUsers = (Map<String, HttpSession>) context.getAttribute("activeUsers");
        String sessionId = request.getHeader("sessionId");
        String requestUrl = request.getRequestURL().toString();
        if (requestUrl.contains("/getOtp") || requestUrl.contains("/validateOtp")) {
            return true;
        } else {
            if (activeUsers.containsKey(sessionId)) {
                return true;
            } else {
                response.setStatus(401);
                return false;
            }
        }

extendig websecurityconfigure 的拦截器配置

@Configuration
@EnableAutoConfiguration
public class SessionInterceptorConfig implements WebMvcConfigurer  {
@Autowired
    private SessionHanlderInterceptor sessionHandlerIntercepto;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//      List<String> paths = new ArrayList<String>();
//      paths.add("/auth/*");
        registry.addInterceptor(sessionHandlerIntercepto).excludePathPatterns("/auth/**");
    }

    @Bean
    public ServletListenerRegistrationBean<CustomSessionListener> filterRegistrationBean() {
        ServletListenerRegistrationBean<CustomSessionListener> registrationBean = new ServletListenerRegistrationBean<CustomSessionListener>();
        CustomSessionListener customURLFilter = new CustomSessionListener();

        registrationBean.setListener(customURLFilter);
        registrationBean.setOrder(1); // set precedence
        return registrationBean;
    }

    @Bean
    public ServletListenerRegistrationBean<CustomServletContextListener> filterContextRregistration() {
        ServletListenerRegistrationBean<CustomServletContextListener> registrationBean = new ServletListenerRegistrationBean<CustomServletContextListener>();
        CustomServletContextListener customURLFilter = new CustomServletContextListener();
        registrationBean.setListener(customURLFilter);
        registrationBean.setOrder(1); // set precedence
        return registrationBean;
    }

Sprinboot 主程序class

@SpringBootApplication
public class CustomerApplication extends SpringBootServletInitializer  {

我希望将 session id 添加到 header 作为响应,并检查请求

中的 sessionid

您可以使用 spring 网络组件 "OncePerRequestFilter"。您需要注入一个扩展 OncePerRequestFilter 的 bean。示例:

public class CustomHeaderFilter extends OncePerRequestFilter {

    @Override
    public void doFilterInternal(final HttpServletRequest request, final HttpServletResponse response,
                                 final FilterChain chain) throws IOException, ServletException {
           response.setHeader(customHeaderName, customHeaderValue);
        chain.doFilter(request, response);
    }
 }