Как опубликовать файл JSON с помощью AJAX, а затем вернуться на ту же страницу весной Mvc? - PullRequest
0 голосов
/ 24 января 2019

Я создаю систему, в которой, если заявка закрыта, появится модальное окно.

Модал попросит пользователя ввести все материалы, использованные в этой заявке.

Полядинамически добавляются, когда пользователь нажимает add row.

Если пользователь нажимает save, все значения полей будут сохранены в файле json.

Моя проблема заключается в том, что когда я публикую сообщениефайл json Я не получаю ответа от консоли, сети и apache.

Сначала было отказано в доступе, а метод 405 не разрешен.Я исправил это, и теперь нет ответа.См. Код ниже для справки.

 @Override
protected void configure(HttpSecurity http) throws Exception {
    System.out.println("###################################### REGISTERED WebSecurityConfiguration:configure");
    http
        .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
        .logout()
    .invalidateHttpSession(true)
            .permitAll()
            .and()
        .exceptionHandling().accessDeniedHandler(accessDeniedHandler());
    http
        .csrf()
            .disable();
           // .ignoringAntMatchers("/cnr/addMaterialsUsed");

}

Над моей веб-безопасностью я провел исследование, и мне следует отключить csrf, поэтому я сделал.

$('#modalAddMaterialButton').click(function (e) {
                                var arrayMaterials = [];
                                var headersMaterials = [];
                                $('#materialsUsedTable th').each(function (index, item) {
                                    headersMaterials[index] = $(item).html();
                                });
                                $('#materialsUsedTable tr').has('td').each(function () {
                                    var arrayItem = {};
                                    $('td input', $(this)).each(function (index, item) {
                                        arrayItem[headersMaterials[index]] = $(item).val();
                                    });
                                    arrayMaterials.push(arrayItem);
                                });
                                var materialsUsed = {"myrows": arrayMaterials};
                                var token = $("meta[name='_csrf']").attr("content");
                                var header = $("meta[name='_csrf_header']").attr("content");
                                $.ajax({
                                    beforeSend: function(xhr) {
                                        xhr.setRequestHeader(header, token);
                                    },
                                    type: "POST",
                                    contentType : 'application/json; charset=utf-8',
                                    dataType : 'json',
                                    url: "addMaterialsUsed?ticketNumber="+ticketNumber,
                                    data: JSON.stringify(materialsUsed), // Note it is important
                                    success :function(result) {
                                     // do what ever you want with data
                                    }
                                });
                            });

Код вышекогда пользователь нажимает save, значения формы помещаются внутри json и отправляются.

 @RequestMapping(value="/cnr/addMaterialsUsed", method=RequestMethod.POST)
//,consumes="application/json",produces="application/json"
@ResponseBody
@PreAuthorize(value = "hasAnyRole('ADMIN,CWO_ENCODER,DEPT_ENCODER,VIEW_ONLY')")
public ModelAndView saveMaterialsUsed(@RequestBody MaterialsUsed materialsUsed,
        @RequestParam(value = "ticketNumber", required = true) String ticketNumber,
        ModelMap model, HttpServletRequest request) {
    List<String> response = new ArrayList<String>();
    for (MaterialUsed materialUsed: materialsUsed.getMaterialUsed()){
        LOGGER.debug("MaterialUsed"+materialUsed);
     response.add("Saved person: " + materialUsed.toString());
    }
    return new ModelAndView("redirect:viewEditTicket?ticketNumber=" + ticketNumber);
}

Выше мой контроллер

    <meta name="_csrf" content="${_csrf.token}"/>
    <meta name="_csrf_header" content="${_csrf.headerName}"/>

Я добавил их внутриhead tag

Я мог бы предоставить другие файлы, которые вам, ребята, нужны, чтобы помочь мне.

TIA за вашу помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...