访问权限过滤器
当中涉及Filter(过滤器)的内容,不清楚的可查看Filter基础讲解篇
当用户访问某网站时,有些页面或Servlet在不登录的情况下是可以访问的,例如首页、登录页面等。但有些资源是必须要登录后才能访问的。此时,可以定义一个权限过滤器,对每一个访问该应用的请求进行过滤:若具有访问权限,则直接跳转到相应资源即可;若不具有访问权限,则跳转到登录页面。
本例中,以user开头的请求,是需要登录后才可访问的。其中有/user目录下的浏览页面userList.jsp、退出页面logout.jsp 等必须登录后才可看到。另外,还有OneServlet,也需要登录后才可访问。而/index.jsp与/login.jsp 是无需登录的。
1、定义界面
(1)index.jsp(首页) :
<body>
$END$ 无需登录即可访问
</body>
(2)login.jsp(登录页面):
<form action="/myWeb/two.do" method="post">
用户名:<input type="text" name="username" /><br>
<input type="submit" value="登录">
</form>
(3)logout.jsp(退出页面):
<%
session.invalidate();
%>
退出页面。需要登录后才可访问。
(4)userList.jsp(用户浏览页面):
<body>
用户浏览页面,需要登录后才可访问。
</body>
(5)OneServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("OneServlet...需要登录后才可访问");
}
OneServlet的路径:
<servlet-mapping>
<servlet-name>oneServlet</servlet-name>
<url-pattern>/user/one.do</url-pattern>
</servlet-mapping>
(6)TwoServlet:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String user = request.getParameter("username");
request.getSession().setAttribute("user",user);
response.getWriter().println("欢迎 " + user + " 的到来!");
}
(7)TwoFilter(重点掌握):
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String servletPath = request.getServletPath();
//若servletPath以/user开头,那么,这个请求的资源必须登录后才可访问
if (servletPath.startsWith("/user")){
HttpSession session = request.getSession(false);
//若session不为null,则需要判断user
//若session为null,则一定没有登录,那么跳转到登录页面
if (session != null){
String user = (String) session.getAttribute("user");
//若user不为null,则说明已经登录,那么放行
//若user为null,则说明没有登录,那么跳转到登录页面
if (user != null){
chain.doFilter(req,resp);
}else {
request.getRequestDispatcher("/login.jsp").forward(req,resp);
return;
}
else {
request.getRequestDispatcher("/login.jsp").forward(req,resp);
return;
}
}else {
//若servletPath不以/user开头,那么其所访问的资源不需登录也可访问
chain.doFilter(req, resp);
}
}
TwoFilter的路径:
<filter-mapping>
<filter-name>TwoFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(8)在web下创建一个user目录,把需要登录才能访问的 jsp 页面放进去
2、测试(注意看路径)
(1)未登录的情况下访问index.jsp(首页)
(2)未登录的情况下无法访问OneServlet
(3)未登录的情况下也无法访问 userList.jsp(用户浏览页面)
(4)登录后跳转到TwoServlet
(5)此时再访问 userList.jsp(用户浏览页面)即可成功
(6)此时再访问 OneServlet 即可成功
(7)登录后退出登录,之后在访问需要登录才能查看的页面则需再次登录了
(8)在保持 logout.jsp(退出页面)下,进行刷新,刷新过后则无法再次进行退出登录了