Ошибка безопасности Spring при отображении пользовательской страницы

#java #spring #spring-mvc #spring-security

#java #spring #spring-mvc #spring-безопасность

Вопрос:

Я работаю над интеграцией безопасности Spring, мое приложение со встроенной страницей безопасности работает нормально. Но для пользовательской страницы входа в систему она выдает ошибку

 The localhost page isn’t working
  

Вот мой код для справки

внутри spring-security.xml

   <http use-expressions="true">
      >

        <intercept-url pattern="/**" access="isAuthenticated()"/> <!-- this means all URL in this app will be checked if user is authenticated -->

            <form-login
            login-page="/login"
            default-target-url="/"
            authentication-failure-url="/login?error"
            username-parameter="username"
            password-parameter="password" />


        <logout logout-url="/logout" logout-success-url="/"/> <!-- the logout url we will use in JSP -->
    </http>
  

В login.jsp

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Custom Login Page</title>
</head>
<body onload='document.loginForm.j_username.focus();'>
<h3>Custom Login Page</h3>

<%

String errorString = (String)request.getAttribute("error");
if(errorString != null amp;amp; errorString.trim().equals("true")){
out.println("Incorrect login name or password. Please retry using correct login name and password.");
}
%>

<form name='loginForm' action="<c:url value='j_spring_security_check' />"
method='POST'>

<table>
<tr>
<td>User:</td>
<td><input type='text' name='j_username' value=''>
</td>
</tr>
<tr>
<td>Password:</td>
<td><input type='password' name='j_password' />
</td>
</tr>
<tr>
<td><input name="submit" type="submit"
value="submit" />
</td>
<td><input name="reset" type="reset" />
</td>
</tr>
</table>

</form>
</body>
</html>
  

В контроллере:

 @RequestMapping(value = "/login", method = RequestMethod.GET)
    public ModelAndView login(ModelMap mode,
            @RequestParam(value = "error", required = false) String error,
            @RequestParam(value = "logout", required = false) String logout) {
        System.out.println("nt -------------");
        ModelAndView model = new ModelAndView("login");

        if (error != null) {
            model.addObject("error", "Invalid username and password!");
        }

        if (logout != null) {
            model.addObject("msg", "You've been logged out successfully.");
        }
        return model;

    }
  

Когда я запускаю проект с использованием встроенной формы pulgin, URL-адрес

 http://localhost:8080/SpringMvcSecurity/spring_security_login
  

и после входа в систему, если я вручную нажму URL

 http://localhost:8080/SpringMvcSecurity/login
  

Он показывает мне страницу входа в систему
Но я не понимаю, отображается ли страница на этот раз, тогда почему она не отображается в пользовательской конфигурации.
Пожалуйста, помогите.

Благодаря shazin есть 4 изменения

  1. Необходимо изменить имя URL-адреса в URL-адресе сопоставления запросов, например: customlogin
  2. то же имя необходимо заменить в spring-security.xml
  3. добавить строку в spring-security.xml
  4. замените имена атрибутов имени пользователя и пароля так, как они отображаются на странице jsp.

<intercept-url pattern="/customlogin" access="permitAll" />

Комментарии:

1. Пожалуйста, объясните проблему, с которой вы столкнулись. Возвращает ли он 404? Или исключение?

2. shazin не показывает ни исключения, ни 404, в котором отображается сообщение о том, что localhost перенаправлял вас слишком много раз.. вот и все. спасибо за ваш ответ

3. пожалуйста, не публикуйте решение в своем вопросе. Напишите новый ответ и примите его.

Ответ №1:

 shazin its shows neither exception nor 404 its displays message saying, localhost redirected you too many times..that's it. thanks for your reply 
  

Это потому, что у вас есть ваше @RequestMapping значение и имя .jsp как login . Измените хотя бы один, как показано ниже.

     @RequestMapping(value = "/customlogin", method = RequestMethod.GET)
    public ModelAndView login(ModelMap mode,
            @RequestParam(value = "error", required = false) String error,
            @RequestParam(value = "logout", required = false) String logout) {
        System.out.println("nt -------------");
        ModelAndView model = new ModelAndView("login");

        if (error != null) {
            model.addObject("error", "Invalid username and password!");
        }

        if (logout != null) {
            model.addObject("msg", "You've been logged out successfully.");
        }
        return model;

    }
  

И в вашей конфигурации

 <http pattern="/customlogin*" security="none"/>
<http use-expressions="true">
      >
        <intercept-url pattern="/**" access="isAuthenticated()"/> <!-- this means all URL in this app will be checked if user is authenticated -->

            <form-login
            login-page="/customlogin"
            default-target-url="/"
            authentication-failure-url="/customlogin?error"
            username-parameter="j_username"
            password-parameter="j_password" />


        <logout logout-url="/logout" logout-success-url="/"/> <!-- the logout url we will use in JSP -->
    </http>
  

Комментарии:

1. Shazin после добавления строки ниже начал работать <intercept-url pattern=»/ customlogin» access=»PermitAll» /> Пожалуйста, отредактируйте свой ответ, добавив эту строку, а также изменив j_username и j_password в security.xml

2. Обновлено. Вместо <intercept-url pattern=»/customlogin» access=»PermitAll» /> используйте <http pattern=»/customlogin*» security=»none»/>