我使用基于形式的认证(JBOSS / JAAS),但我的形式被发送数据到我的Servlet所以我可以尝试登录之前执行一些检查。

现在我需要转发到j_security_check,但我试过没有工作(404错误)......

我如何可以重定向/转发到j_security_check(请注意应用程序运行时通过HTTPS /单片段代换系)?

我可以把它带重定向的工作和PARAMS走在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)在你的servlet,前进到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