【问题标题】:simple AJAX JQuery example gives me 500 internal server error简单的 AJAX JQuery 示例给了我 500 内部服务器错误
【发布时间】:2022-01-14 07:13:41
【问题描述】:

您好,我正在从事一个 spring mvc 项目,当我点击表单中的按钮时出现此错误

500 (Internal Server Error)                                    jquery.min.js:6
x.ajaxTransport.x.support.cors.e.crossDomain.send  jquery.min.js:6 
x.extend.ajax                                      AddUser:19 
doAjaxPost                                         AddUser:41 
onclick

我正在尝试做一个简单的 AJAX JQuery 示例,将用户添加到列表中,但是当我按下表单中的添加按钮时出现该错误

这是我的控制器类:

@Controller
public class UserListController {

 private List<User> userList = new ArrayList<User>();

     @RequestMapping(value="AddUser",method=RequestMethod.GET)
     public String showForm(){

         return "AddUser";
     }

     @RequestMapping(value="AddUser",method=RequestMethod.POST)
     public @ResponseBody String addUser(@ModelAttribute(value="user") User user, BindingResult result ) 
     {
         String returnText;

         if(!result.hasErrors())
         {
             userList.add(user);
             returnText = "User has been added to the list. Total number of users are " + userList.size();

         }
         else
         {
             returnText = "Sorry, an error has occur. User has not been added to list.";
         }

         return returnText;
     }

     @RequestMapping(value="ShowUsers")
     public String showUsers(ModelMap model) 
     {
         model.addAttribute("Users", userList);

         return "ShowUsers";
     }

}

这是我的 AddUser.jsp 页面

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Add Users using ajax</title>

        <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.0.2/jquery.min.js"></script>

        <!-- <script src="resources/js/libs/jquery-2.0.2.min.js"></script> -->

        <script type="text/javascript">

        function doAjaxPost() {
        // get the form values
        var name = $('#name').val();
        var education = $('#education').val();

        $.ajax({
        type: "POST",
        url: "AddUser",
        data: "name=" + name + "&education=" + education,
        success: function(response){
        // we have the response
        $('#info').html(response);
        $('#name').val('');
        $('#education').val('');
        },
        error: function(e){
        alert('Error: ' + e);
        }
        });
        }
        </script>
    </head>
    <body>
        <h1>Add Users using Ajax ........</h1>
        <table>
            <tr><td>Enter your name : </td><td> <input type="text" id="name"><br/></td></tr>
            <tr><td>Education : </td><td> <input type="text" id="education"><br/></td></tr>
            <tr><td colspan="2"><input type="button" value="Add Users" onclick="doAjaxPost()"><br/></td></tr>
            <tr><td colspan="2"><div id="info" style="color: green;"></div></td></tr>
        </table>
        <a href="/views/ShowUsers">Show All Users</a>
    </body>
</html>

还有我的 MvcConfiguration 类,因为我使用的是基于 java 的配置,而不是使用 XML

@EnableWebMvc
@Configuration
@ComponentScan(basePackages = { "controllers" })
public class MvcConfig extends WebMvcConfigurerAdapter
{
     @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
       registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
       configurer.enable();
    }

//  JSP VIEW-RESOLVER
    @Bean
    public InternalResourceViewResolver jspViewResolver() {
       InternalResourceViewResolver bean = new InternalResourceViewResolver();
       bean.setOrder(2);
       bean.setPrefix("/WEB-INF/views/");
       bean.setSuffix(".jsp");
       return bean;
    }
}

编辑:我开始一个新项目只是为了想知道我遇到了什么错误,我在我的应用程序中删除了 spring secuirty,但我仍然可以找出问题所在。

1)我实际上并没有删除 spring security 我只是开始一个新项目来尝试解决我的 url 问题

2) 我在我的 ajax 脚本中更改了我的控制器和 URL 属性

新的 RequestMapping 控制器:

 @RequestMapping(value="AddUser",method=RequestMethod.GET)

我删除了 value="AddUser" 中的“/”

如果在控制器中放置“/”,我的任何控制器中都没有“/”,我有相同的 500 内部服务器错误

【问题讨论】:

    标签: java jquery ajax spring spring-security


    【解决方案1】:

    这可能是因为在 Java 配置中默认启用了 CSRF 保护。试试你的配置...

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // ...
            .csrf().disable();
    }
    

    让我知道这是否有效。

    编辑**

    要在 AJAX 请求中包含 CSRF 令牌,如果您使用的是 JSON,则需要将其放在 http 标头上。示例 JSP 示例通常是...

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

    然后在您的 javascript 调用中,获取此参数并将其添加到 XMLHttpRequest 的标头中。

    希望这会有所帮助。

    Further reading

    【讨论】:

    • 我把它放在我的 spring 安全配置类 .and() .csrf().disable(); 的末尾,我试过了,但它知道给出了 404 错误
    • 好消息。现在您正在使用 `url: "views/AddUser"` 从 Ajax 发帖。控制器映射在哪里?我只能在 Controller 中看到 /AddUser。
    • 我用这个 URL : AddUser 更新了 ajax 脚本,并在控制器中更新了控制器的映射从 value="/AddUser"value="AddUser" 现在它给了我 500 (internal server error)
    • 我相信应该是 /AddUser。现在这是一个一般性错误,您必须查看它发布到的 URL 是什么等等。但我相信您的主要问题已经解决。
    • 有点,但我不想禁用我的 csrf 令牌是否有另一种方法可以做到这一点而不必禁用 csrf 令牌
    【解决方案2】:

    就我而言,我必须将以下依赖项添加到我的 pom &lt;dependency&gt; &lt;groupId&gt;com.google.code.gson&lt;/groupId&gt; &lt;artifactId&gt;gson&lt;/artifactId&gt; &lt;version&gt;2.2.2&lt;/version&gt; &lt;/dependency&gt;

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2019-12-10
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多