-1

我有一个 Servlet 类,我在其中进行 NTLM 身份验证,如果成功,我将转发到 JSP 页面。

JSP 页面有一个用户表单,其中输入了很少的注册详细信息并提交了页面。在另一个名为 ServiceController 的 servlet 中,我正在使用

request.getParameter("");

我面临的问题是,如果我从 Servlet 重定向到 JSP 页面,request.getParameter("");全部为空,但如果我直接访问 JSP 页面,我可以成功地使用获取所有表单值request.getParameter("");

如果我从 Login Servlet 类重定向到 JSP 页面,为什么我无法在 Servlet 中获取表单值?

我要重定向的 Servlet 代码

public void doGet(HttpServletRequest request, 
                  HttpServletResponse response) throws ServletException, IOException {

    response.setContentType(CONTENT_TYPE);        
    String auth = request.getHeader("Authorization");
    ...

   if (findUsername(uname) == true) { 
   response.sendRedirect("myForm.jsp");
   return;
           } else {
        response.sendRedirect("accessdenied.jsp");
        return;

任何帮助都是非常可观的

4

4 回答 4

3

response.sendredirect() 方法将调用一个全新的请求,因此您无法访问之前请求中的任何值。您可以使用 requestdispatcher或者您可以在会话中设置值并在您的 jsp 页面中读取它们

于 2013-04-08T07:03:32.883 回答
3

这里有两个不同的概念,我认为你把它们混在一起了。

开始处理请求后,您有几个选择:

  • 停止响应(无论是否有意,尽管容器会为你做一些事情)
  • 使用 重定向请求HttpServletResponse.sendRedirect,它将以 HTTP 响应302以将浏览器发送到识别的页面。您甚至可以通过重定向将它们从您的服务器发送出去。
  • 使用RequestDispatcher.forwardRequestDispatcher可以从 访问ServletRequest.getRequestDispatcher)转发请求,这将重定向到不同的 servlet/JSP 来处理请求。这对用户来说是完全不可见的,并且请求的 URL 不会像重定向那样改变。转发的请求必须到达服务器上的某个地方,除非明确告知用户,否则用户无法知道该请求已被转发。转发的请求将维护它们的参数,包括Attributes,这是在 servlet 之间传递参数的一种干净的方式。

在您的情况下,您提到希望在成功登录后设置会话,然后检索。这些概念完全相互独立。

您可以在this.validUser检查中设置会话,然后转发/重定向。在 中else,您可以选择仍然重定向以真正调用失败。

于 2013-04-08T07:06:20.550 回答
2

重定向与转发请求/响应不同。如果控制任务的重定向转移由容器委托给浏览器,则浏览器会向指定的 url 生成新请求,旧的请求和响应对象会丢失。

于 2013-04-08T07:03:52.713 回答
0

我已经解决了所有表单元素都为空的问题,这是NTLM我在 Login 中的身份验证代码的问题servlet

我正在使用JCIFS(samba.org)解决方案来获取登录域的用户名。总共删除了我用来获取登录域并遵循此用户名的废话代码

于 2013-04-11T07:54:30.507 回答