Spring MVC Spring Web络流应用程序:HTTP 302已临时移动

5vf7fwbs  于 2023-01-31  发布在  Spring
关注(0)|答案(1)|浏览(132)

Java应用程序中的每个请求都会产生另外两个带有HTTP 302错误的请求。
例如,如果请求查看名为 * board.html * 的网页,则此请求是从 * home.html * 发出的。我得到按以下顺序生成的3个请求:

POST home.html - 302 Moved Temporarily
GET board.html - 302 Moved Temporarily
GET board.html - 200 OK

我希望只得到最后的请求,不能找出为什么其他2个正在发生。
这种模式发生在所有导致我的过滤器触发3次的请求上。
该项目使用spring webflow。

dzhpxtsq

dzhpxtsq1#

在大量reading最终能够更改默认行为(默认行为是-获取请求,发布(302/303 -根据每个请求附加的位置重定向),最后是一个获取调用。
因此,对于一个请求,我们将发送一个获取请求,然后服务将返回带有位置属性的302/303(即,使用查询参数重定向),并且作为响应,通常加载带有QueryString的HTML。示例项目位于此link中,以下是为避免此默认行为而实施的更改,如下所示
为避免303/302出现不可预测的行为,我已停止重定向,并在配置类中添加了以下内容

@Configuration
public class WebFlowWithMvcConfig extends AbstractFlowConfiguration  {
    //implements WebMvcConfigurer
    @Autowired
    private LocalValidatorFactoryBean localValidatorFacotryBean;
    /*
    @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LogInterceptor());
        }
     */
    
    @Bean
    public FlowDefinitionRegistry flowRegistry() {
        return getFlowDefinitionRegistryBuilder() //
                .setBasePath("classpath:flows") //
                .addFlowLocationPattern("/**/*-flow.xml") //
                .setFlowBuilderServices(this.flowBuilderServices()) //
                .build();
    }

    @Bean
    public FlowExecutor flowExecutor() {
        return getFlowExecutorBuilder(this.flowRegistry()) 
                .setAlwaysRedirectOnPause(false)
                .setRedirectInSameState(false) 
                .build();
    }

    @Bean
    public FlowBuilderServices flowBuilderServices() {
        return getFlowBuilderServicesBuilder() //
                .setViewFactoryCreator(this.mvcViewFactoryCreator()) // Important!
                .setValidator(this.localValidatorFacotryBean)
                .build();
    }
    // ----------------------------------------------------------

    @Bean
    public FlowHandlerMapping flowHandlerMapping() {
        FlowHandlerMapping handlerMapping = new FlowHandlerMapping();
        handlerMapping.setOrder(-1);
        handlerMapping.setFlowRegistry(this.flowRegistry());
        //handlerMapping.setInterceptors(new LogInterceptor());
        return handlerMapping;
    }

    @Bean
    public FlowHandlerAdapter flowHandlerAdapter() {
        FlowHandlerAdapter handlerAdapter = new FlowHandlerAdapter();
        handlerAdapter.setFlowExecutor(this.flowExecutor());
        handlerAdapter.setSaveOutputToFlashScopeOnRedirect(true);
        //handlerAdapter.setStatusCode(HttpStatus.SEE_OTHER);
        //handlerAdapter.setStatusCode(HttpStatus.TEMPORARY_REDIRECT);
        return handlerAdapter;
    }

    @Bean
    public ViewFactoryCreator mvcViewFactoryCreator() {
        MvcViewFactoryCreator factoryCreator = new MvcViewFactoryCreator();
        factoryCreator.setViewResolvers(Collections.singletonList(this.thymeleafViewResolver()));
        factoryCreator.setUseSpringBeanBinding(true);
        return factoryCreator;
    }

    @Bean
    @Description("Thymeleaf AJAX view resolver for Spring WebFlow")
    public AjaxThymeleafViewResolver thymeleafViewResolver() {
        AjaxThymeleafViewResolver viewResolver = new AjaxThymeleafViewResolver();
        viewResolver.setViewClass(FlowAjaxThymeleafView.class);
        viewResolver.setTemplateEngine(this.templateEngine());
        viewResolver.setCharacterEncoding("UTF-8");
        return viewResolver;
    }

    @Bean
    @Description("Thymeleaf template resolver serving HTML 5")
    public ClassLoaderTemplateResolver templateResolver() {
        ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
        templateResolver.setPrefix("templates/");
        templateResolver.setCacheable(false);
        templateResolver.setSuffix(".html");
        templateResolver.setTemplateMode("HTML5");
        templateResolver.setCharacterEncoding("UTF-8");
        return templateResolver;
    }

    @Bean
    @Description("Thymeleaf template engine with Spring integration")
    public SpringTemplateEngine templateEngine() {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine();
        templateEngine.setTemplateResolver(this.templateResolver());
        return templateEngine;
    }
}

因此我们将以下内容设置为false

.setAlwaysRedirectOnPause(false)
            .setRedirectInSameState(false)

这将避免位置重定向,现在类似的变化也必须在模板html中实现。因此,变化是添加一个操作url到html模板,无论表单存在于何处,如下所示

<form ..  th:action="${flowExecutionUrl}">

它成功地完成了表单提交,并以200 Ok http状态和html页面响应。因此,没有更多(GET - 200到302重定向到200),而是直接使用Get 200/Post 200进行单个请求调用,并将响应绑定到Html页面。
这样,只有最后的请求才有回应。我希望这对其他人有帮助。

相关问题