今天在做BBS的时候,因为需要为每个页面增加登录检查所以每个页面都要上如下代码

<%

String login = (String)session.getAttribute("login");

if(login != null && login.equals("true")) {

}

else {

response.sendRedirect("Login.jsp");

return;

}

%>

但是要是页面太多的话,实在是麻烦,因此我想到了把这段代码单独写到一个jsp文件中,命名为CheckLogin.jsp,

CheckLogin.jsp的代码如下:

<%

String login = (String)session.getAttribute("login");

if(login != null && login.equals("true")) {

}

else {

response.sendRedirect("Login.jsp");

return;

}

%>

其他需要进行登录检查的页面在一开始就包含CheckLogin.jsp,所以我在需要检查登录的页面中使用了如下包含指令:


<jsp:include page="CheckLogin.jsp" flush="true"/>


但出乎我的意料,当我没有登录直接访问其他页面时,他竟然不跳转到Login.jsp页面,依然停留在访问的页面,后来我使用

debug发现当执行到CheckLogin.jsp页面中的代码时,从session中去到的login值确实是"false",但是在执行完response.sendRedirect("Login.jsp")

之后,执行return语句的时候,这个return语句并没有起作用,正确的情况是执行return语句之后返回被访问的页面,然后

被访问的页面应该停止往下执行了,该界面到此结束。没想到当执行完CheckLogin.jsp之后返回到被访问的界面,程序继续执行,

因此没有跳转到Login.jsp。

这个时候我就感到很疑惑,不知道是怎么回事,我开始猜测,肯定是<jsp:include page="CheckLogin.jsp" flush="true"/>

这句包含语句有问题,但是我还不知道什么问题,接着我直接把CheckLogin.jsp中的代码复制到一个页面中做测试,结果是对的

,符合预期。所以我确定是<jsp:include page="CheckLogin.jsp" flush="true"/>这条包含语句的问题。

带着这个疑问,我google了一下,我发现了另外还有一种包含语句<%@ include file="CheckLogin.jsp">,严格来说这种属于include指令

前面那种属于jsp的标签,我尝试使用了include指令的包含语句,结果是对的,符合预期。因此我接着google了这两种包含语句的区别,

不过只是明白了个大概,希望有非常了解的朋友及时回复,给我讲解讲解,甚是期待。