从jsp提交按钮寻址jsps会更改请求URL

时间:2013-12-06 10:11:01

标签: jsp spring-mvc

我正在开发一个Spring Mvc应用程序,当我将它发送到控制器时我正在制作一个基本的登录应用程序它很好并且当登录失败时显示错误页面当我点击重新登录按钮这是一个提交按钮我必须将路径命名为/jsps/Logn.jsp,因为我的jsp在jsps文件夹中再次提交请求,它创建一个URL为/jsps/Login.do,这不会到达我的控制器,因为它映射到/Login.do第一次没事了

有人可以用这个来取悦我吗?

这是我的登录页面

<%@ 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>Insert title here</title>
</head>
<body>
    <form action="Login.do">
        Enter Login Details <br> 
        UserName::  <input type="text" name = "username"><br>
        Password::  <input type="password" name = "password"><br>
        <input type= "submit" value = "Login">
    </form>
</body>
</html>

这是我的错误页面

<%@ 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>Insert title here</title>
</head>
<body>
Error While logging in please try again <br>`enter code here`
<form action = "jsps/Login.jsp">
<input type = "submit" value  = "try again">
</form>

</html>

这是我的控制器代码

package controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/Login.do")
public class LoginController {



    @RequestMapping("/Login.do")
    public ModelAndView checkLoginDetails(HttpServletRequest request , HttpServletResponse response){


        if(request.getParameter("username") != null && request.getParameter("password") != null){

        if(request.getParameter("username").equalsIgnoreCase("admin") && request.getParameter("password").equalsIgnoreCase("admin")){
            return new ModelAndView("Home" );
        }else{
            return new ModelAndView("Error" );
        }
        }else{
            return new ModelAndView("Error" );
        }

    }

}

显示的网址是

当我第一次点击登录按钮时,网址是

本地主机/ SpringLoginExample / Login.do用户名=安培;密码=

当我在错误页面上再次尝试按钮时,它会将我带回登录页面,然后如果我点击登录按钮,则生成的网址为

本地主机/ SpringLoginExample / JSP的/ Login.do用户名=安培;密码=

2 个答案:

答案 0 :(得分:0)

如果您的jsps位于war / jsps

,您的XML配置应该如下所示
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/jsps/" />
    <property name="suffix" value=".jsp" />
</bean>

您应该避免在控制器中进行双重注释。在类级别有一个全局注释,其中所有的@RequestMapping方法都被映射到,但您还使用另一个方法级别映射,这是多余的,因为它是相同的URL。我还要区分登录检查和登录页面的纯加载,2个不同的URL(如下所示)或使用GET请求进行页面显示和POST进行凭证检查。

@Controller
public class LoginController {
    @RequestMapping("/Login")
    public String loginPage(){
        return "Login"; // display a page that is named Login.jsp in your jsps folder
    }

    @RequestMapping("/Check")
    public ModelAndView checkLoginDetails(HttpServletRequest request , HttpServletResponse response){
    ...
    }
}

现在,您可以使用<form action = "/Check"> ...向控制器发送验证请求。不仅来自您的登录页面,还来自其他每个页面。虽然:在登录失败后,您执行重新登录的方式并不是为用户提供另一种登录方式的常用方法。

我推荐4种可能性:

  1. 只需提供一个简单的html链接返回登录页面<a href="/Login"> try again </a>
  2. 还在错误页面中提供用户名和密码字段,并使用与原始登录页面<form action = "/Check">
  3. 相同的“操作”
  4. 使用普通的Spring MVC的最佳解决方案是查看Spring提供的Form Validation,这将允许您检查表单属性并返回页面之前为每个字段添加自定义错误消息(此处为用户名)或密码)
  5. 如果是登录,则无需重新发明轮子。查看最适合在Spring Web应用程序中添加安全性/登录的Spring Security

答案 1 :(得分:0)

您应该首先看到xml配置。检查其中的以下代码。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/jsps/" />
    <property name="suffix" value=".jsp" />
</bean>

如果它仍然不起作用,请告诉我,我会给出一个不同的解决方案来解决这个问题。