sendRedirect()函数的问题

时间:2013-12-08 14:37:29

标签: java jsp session tomcat

我有sendRedirect函数这个奇怪的问题我无法解释。 我有一个标题页作为Header.jsp:

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*,java.util.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Online Exam Portal</title>
<style type="text/css">
    body{
        background-color : lightgreen;
    }
    </style>
</head>
<body>
<%
if(session.getAttribute("userid")==null)
{
   response.sendRedirect("signup.html");
}
%>
<img src="exam_header01.jpg"/>
<br />
Welcome <%=session.getAttribute("userid")+"This is Working"%>
<a href="ChangePassword.jsp">Change Password</a> 
<a href="logout.jsp">Logout</a> 

<hr/>

我在所有页面中都有包含此标题页,我之所以这样做,是因为我想阻止没有有效会话的用户并重定向到注册页面,但没有'重定向 相反,它显示欢迎null以及:
1 GT;如果我在if语句中写任何内容它工作正常! ,像:

if(session.getAttribute("userid")==null)
{
   response.sendRedirect("signup.html");//this is not executed
   out.println("This Runs");//this String is printed
}

2 - ;如果我在主页面内写入相同的代码(即在页眉页面之后),它可以正常工作! 3 GT;最重要的是,代码在我用以下代码替换时起作用:

<jsp:forward page="signup.html"/>

这可能是什么问题。如果有人能用例子解释,我们将非常感激。

<小时/> 更新: - 即使我在重定向后打印到我的页面,如果我在包含标题后使用if语句,它也会起作用:

<jsp:include page="Header.jsp"/>
        <%if(session.getAttribute("userid")==null)
{ 
response.sendRedirect("signup.html");
out.println("I cant See this because page is redirected ");
} 
%>
    </body>
</html>

3 个答案:

答案 0 :(得分:0)

来自javadoc:

  

使用此方法后,应认为响应已提交且不应写入。

您不尊重这一点,因为您继续在sendRedirect()之后打印回复。

主要问题在于您的架构。 JSP是视图组件。它们不应包含scriptlet,也不应重定向。它们应该只通过用Java编写的控制器从存储在请求属性中的bean生成HTML标记,作为首选MVC框架的servlet或动作。要生成此标记,它们应该只使用JSP EL,JSTL和其他自定义标记。

不要在每个JSP中重复登录检查,这非常容易出错且重复,你应该有一个servlet过滤器,它拦截所有请求,进行检查,让下一个组件(控制器)完成它的工作用户的身份验证。

request --> authentication filter --- if authenticated ---> controller --- forward to ---> JSP
                  |
                  |--- if not authenticated --- redirect to --> authentication controller --- forward to ---> login.jsp

答案 1 :(得分:0)

出于身份验证的目的,请使用过滤器。
过滤器只是一个Java类,用于在将请求转发到用户要求的资源之前对其进行预处理。
例如。如果您已经使用servlet映射过滤器类,那么当请求进入此servlet时,它最初被过滤器类(包含您的身份验证代码)拦截,如果它成功进行身份验证,然后只将请求转发给servlet。这使得身份验证更加简单灵活 为此,您需要使用web.xml中的servlet映射过滤器类 简而言之,response.sendRedirect()无法满足您的目的,您必须最终依赖过滤器。

答案 2 :(得分:0)

正如其他人所说,这不是达到你想要达到目标的最好方式。

那就是说,你看到的问题是由于使用了错误的include类型。您正在使用请求时间include(<jsp:include page="..." />)来处理包含的页面并将输出(如果有)插入当前页面。如果您从包含的页面中调用response.sendRedirect(),则会被忽略。因此,您当前的解决方案不起作用。

您需要使用转换时间include(<%@ include file=... %>),它包含所包含页面的源,将其插入当前页面的源,然后处理当前页面,就像它是单个JSP一样