尚硅谷JavaWeb学习:Filter过滤器

一、Filter过滤器简介

1.Filter过滤器它是JavaWeb的三大组件之一。三大组件分别是:Servlet程序,Listener监听器,Filter过滤器。

2.Filter过滤器它是JavaEE的规范,也就是接口

3.Filter过滤器它的作用是:拦截请求,过滤响应

拦截请求常见的应用场景有:

        1.权限检查

        2.日常操作

        3.事务管理

        ..........等等

二、初体验(filter的引入)

要求:在你的web工程下,有一个admin目录,在这个admin目录下的所有资源(html页面,jpg图片,jsp文件,等等)都必须是用户登录之后才允许访问。

思路:根据之前我们学过的内容,可以知道,用户登陆之后都会把用户登陆的信息保存到Session域中,所以用户要检查是否登录,可以判断Session中是否包含用户登陆的信息即可。

【准备工作】创建一个项目(添加Web Application架构支持),配置项目结构的模块和修改Tomcat配置。

1)在web目录下新建admin文件夹,在admin下编写a.html和a.jsp文件

<body>
    这是a.html文件
</body>
<body>
    这是a.jsp文件
</body>

点击运行,可以正常访问文件内容:

 2)添加login.jsp,若用户未登录,进入a.jsp页面时会跳转到该login页面

<body>
<%
    Object user = session.getAttribute("user");
    //如果user = null,说明还没有登录
    if(user == null){
        request.getRequestDispatcher("login.jsp").forward(request,response);
    }
%>
    这是a.jsp文件
</body>
<body>
    这是登陆页面login.jsp。
</body>

访问a.jsp,会自动跳转到login页面,由此实现了一个简单了登录功能。

【注意,request.getRequestDispatcher("login.jsp")中直接写文件名,不要写成‘/login.jsp’,会无法访问网页】

【但是,这样的方法有局限性,就是只能在jsp页面当中,因为只有在jsp文件中才能写java代码去判断,在html和对于图片则行不通,所有我们可以使用Filter】

3)新建一个类,编写filter实现过滤功能 

package com.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class AdminFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    //doFilter方法,专门用于拦截请求。可以做权限检查
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        HttpSession session = HttpServletRequest.getSession();
        Object user = session.getAttribute("user");
        //如果user = null,说明还没有登录
        if(user == null){
            servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse);
            return;
        }
        else {
            //让程序继续往下访问用户的目标资源
            filterChain.doFilter(servletRequest,servletResponse);
        }
    }

    @Override
    public void destroy() {

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_56264090/article/details/127853906