从 javascript 到 java servlet 的 HTTP POST

Div*_*tio 5 javascript java jsp servlets

如何通过 JavaScript 将参数发布到 Java Servlet?

这是我的 html 代码,它有效:

<div id="loginPanel">
<form action="/login" method="POST" class="form">
    <label>Login:</label>
    <input type="text" name="login" id="login">
    <label>Password:</label>
    <input type="text" name="password" id="password">
    <div id="loginLower">
        <input type="checkbox"><label memory="memory">Remember me</label>
        <input type="submit" value="Login">
    </div>
</form>
</div>
Run Code Online (Sandbox Code Playgroud)

现在,我想散列密码和 POST 到 /login hashPassword 像这样:

<form onsubmit="post()">
    <label>Login:</label>
    <input type="text" name="login" id="login">
    <label>Password:</label>
    <input type="text" name="password" id="password">
    <div id="loginLower">
        <input type="checkbox"><label memory="memory">Remember me</label>
        <input type="submit" value="Login">
    </div>
</form>

<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/md5.js"></script>

<script>
function post(){
 var passhash = CryptoJS.MD5(document.getElementById("password").value);
//post to /login login and passhash
}
</script>
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用 AJAX、JQuery,但这些解决方案在 /login 方面存在问题,因为它们在浏览器中调用 localhost:8080/?login 而我想调用 Java Servlet: web.xml

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>pl./*...*/.LogoutServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login/*</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

Mau*_*ähä 3

我承认我的回答在一定程度上是一种预感(因为我很久以前就写了它),但是对于 JSP,您通常应该将表单操作命名为配置的 servlet 的名称web.xml

我认为你的web.xml应该是这样的:

<servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>pl./*...*/.LogoutServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>
Run Code Online (Sandbox Code Playgroud)

并将您的HTML更改为:

<form action="LoginServlet" method="POST" class="form" id="loginForm">
Run Code Online (Sandbox Code Playgroud)

对于 JavaScript 部分,如果您使用 jQuery 提交表单,您可以修改要发布的参数并省略密码的发布(因为如果您想将其作为哈希值发布,则不需要密码),请参阅下面的使用代码:

JavaScript(使用 jQuery):

// Attach a submit handler to the form
$("#loginForm").submit(function( event ) {

    // Stop form from submitting normally
    event.preventDefault();

    // Get some values from elements on the page:
    var $form = $( this );

    // We want to customize what we post, therefore we format our data
    var data = "login="+ $('#login').val() +"&passwordHash=" + CryptoJS.MD5($('#password').val());

    // For debugging purposes... see your console:
    // Prints out for example: login=myLoginName&passwordHash=a011a78a0c8d9e4f0038a5032d7668ab
    console.log(data);

    // The actual from POST method
    $.ajax({
        type: $form.attr('method'),
        url:  $form.attr('action'),
        data: data,
        success: function (data) {
            console.log("Hey, we got reply form java side, with following data: ");
            console.log(data);

            // redirecting example..
            if(data === "SUCCESS") {

               window.location.replace("http://stackoverflow.com");

            }

        }
    });

});    
Run Code Online (Sandbox Code Playgroud)

最后,在 Java 端,您将需要doPost()捕获loginpasswordHash值等的方法。

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String login = request.getParameter("login");
    String password = request.getParameter("passwordHash");

   //
   // Do what ever you want with login and passwordHash here...
   //

   // Because we are using ajax we need to respond to it stating whether we can redirect or not to new location, see lines below

   // Content type of the response - You could also return application/json for example (which would be better in this case)
   response.setContentType("text/plain"); // Using text/plain for example
   response.setCharacterEncoding("UTF-8");

   // Change this as you like - it can also be url or anything else you want...
   response.getWriter().write("SUCCESS");

}
Run Code Online (Sandbox Code Playgroud)

阅读有关使用 json 响应的更多信息:json response with jsp