如何对用户的访问进行拦截

访问权限过滤器

当中涉及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(退出页面)下,进行刷新,刷新过后则无法再次进行退出登录了
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值