我正在使用基于表单的身份验证(JBOSS / JAAS),但我的表单是将数据发送到我的Servlet,因此我可以在尝试登录之前执行一些检查。
现在我需要转发到j_security_check,但我尝试的不起作用(404错误)......
如何重定向/转发到j_security_check(请注意应用程序是通过https / sssl运行的)?
我可以使用重定向和params进入URL,但这不安全(因为用户/ pass保留在浏览器历史记录中等)...
有什么想法吗?
答案 0 :(得分:3)
如果Tomcat在该会话之前启动了登录过程,则它仅接受j_security_check
的请求。首先,您需要尝试访问安全约束资源。然后Tomcat会将您重定向到登录表单。只有这样,您才能访问j_security_check
。
答案 1 :(得分:2)
我看到这是一篇旧帖子,但我想分享一个答案。
如果原始请求是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 );
}
答案 2 :(得分:0)
我知道这是一个太老的问题,但我遇到了同样的问题,我发现解决它的独特方式是使用这样的东西:
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);
}
答案 3 :(得分:0)
由于我遇到了同样的问题,并且其他答案都没有证明对我有用,我想分享我自己的解决方案:
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;