Вопрос

Я использую аутентификацию на основе форм (JBOSS/JAAS), но моя форма отправляет данные в мой сервлет, поэтому я могу выполнить некоторые проверки, прежде чем пытаться войти в систему.

Теперь мне нужно перейти на j_security_check, но то, что я пробовал, не сработало (ошибка 404)...

Как я могу перенаправить/переслать на j_security_check (обратите внимание, что приложение работает через https/sssl)?

Я могу заставить его работать с перенаправлением, и параметры будут указаны в URL-адресе, но это небезопасно (поскольку пользователь/пароль остается в истории браузера и т. д.)...

Есть идеи?

Это было полезно?

Решение

Я вижу, что это старый пост, но я хотел поделиться ответом.

Если исходный запрос — POST, вы можете просто перенаправить его на j_security_check после некоторой обработки.

...
request.getParameterMap().put( "j_username", new String[]{ userId } );
request.getParameterMap().put( "j_password", new String[]{ password } );

try 
{
    request.getRequestDispatcher("/j_security_check").forward( request , response );
    return null;
} 
catch (ServletException e) 
{
    logger.error( e );
} 
catch (IOException e)
{
    logger.error( e );
}

Другие советы

Tomcat принимает запросы только на j_security_check если он инициировал процесс входа в систему ранее для этого сеанса.Поэтому сначала вам нужно попытаться получить доступ к ресурсу с ограничениями безопасности.Затем Tomcat перенаправит вас на форму входа.Только тогда вам будет разрешен доступ j_security_check.

Я знаю, что это слишком старый вопрос, но у меня была та же проблема, и единственный способ ее решения, который я нашел, заключался в следующем:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    String user = req.getParameter("j_username");
    String pass = req.getParameter("j_password");

    resp.sendRedirect("/Project-web/j_security_check?j_username=" + user    + "&j_password=" + pass);

}

Поскольку у меня была такая же проблема, а другие ответы мне не помогли, я хотел поделиться своим собственным решением:

1) Создайте новый JSP, скажем, loginForward.jsp, только для целей пересылки:

<%@ page language="java" %>
<%
    final String username = request.getParameter("j_username");
    final String password = request.getParameter("j_password");
%>
<body onload="document.getElementById('creds').submit()">
    <form name="creds" id='creds' method="POST" action="j_security_check">
        <input type="hidden" name="j_username" value="<%= username %>">
        <input type="hidden" name="j_password" value="<%= password %>">
    </form>
</body>

2) В вашем сервлете перейдите к этому JSP:

final String redirectURL = String.format("loginForward.jsp j_username=%s&j_password=%s", username, password);
RequestDispatcher requestDispatcher = request.getRequestDispatcher(redirectURL);
requestDispatcher.forward(request, response);
return;    
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top