先上图
说明
WEB-INF里内容只能由服务器级别才能访问,客户端级别不能访问。
服务器级别的例子就是请求转发
,转发是由服务器自己处理,跟客户端(浏览器)无关,所以浏览器上的地址栏也就不会改变。
客户端级别的例子就是重定向
,两次请求,两次响应。所以地址栏会改变。
为什么设置这种权限
为了安全。比如图中success.jsp在WEB-INF目录下,在页面中用超链接a标签或者js的location.href去直接转向它,会找不到。因为这种是客户端请求,设置这种权限就能保证一些文件的安全。
怎么让客户端级别可以访问
放在webapp下。
代码演示一波
- 看图可知,login.jsp文件在wepapp目录下,也就是项目名下。
login.jsp
<form method="post" action="${pageContext.request.contextPath}/login3.action">
用户名:<input type="text" name="username"><br>
密 码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
- 输入数据,提交到映射的处理器
UserController
@RequestMapping("login3.action")
public void login3(User user, HttpSession session, HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
if ("jack".equals(user.getUsername())&&"1234".equals(user.getPassword())){
request.getRequestDispatcher("WEB-INF/jsp/success.jsp").forward(request,response);
}else {
response.sendRedirect("WEB-INF/jsp/fail.jsp");
}
}
- 数据匹配正确,会请求转发。
注意,success.jsp页面在WEB-INF目录下,所以请求转发的路径参数要加上WEB-INF/jsp。 - 数据匹配不正确,会重定向。
注意,fail.jsp在WEB-INF目录下,所以该路径没写错。但是重定向的原理是让客户端再次访问,而WEB-INF目录下的文件不能被客户端访问,所以会报404-未找到。
有一些标签,可以访问到WEB-INF目录中的文件
如果符合要求的情况下也可以在jsp中使用,(原理也都是请求转发)如:
<a href="javascript:<jsp:forward page='WEB-INF/xxxx.jsp'/>"></a>
<jsp:forward page = "/WEB-INF/jsp/test/test.jsp" />
<jsp:include page="WEB-INF/xxx.jsp">