Filter接口实现的过滤器

本文介绍了一个Web应用需求,即只有登录用户才能访问特定资源。首先创建了User实体类和UserService接口及其实现类。接着通过Servlet处理请求,并重点讲解了过滤器的概念。过滤器在客户端和Web应用间起预处理作用,拦截并筛选请求。重点讨论了Filter接口的init、doFilter和destroy方法。最后,通过实例展示了如何实现过滤器,使得登录用户能直接访问已授权的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先我们有一个需求:当用户访问某个资源,需要先登录才能访问

拿到需求后我们先要编写一个User实体类。

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String username;
    private String password;
}

再编写userService接口

public interface userService {
//    登录操作
    boolean Login(User user);
}

其次编写userServiceImpl实现类

public class userServiceImpl implements userService {
    public boolean Login(User user) {
        if (user.getUsername().equals("admin")&&user.getPassword().equals("admin")){
            return true;
        }
        return false;
    }
}

再编写一个Servlet

@WebServlet(value = "/login")
public class LoginServlet extends HttpServlet {
    private com.lcp.service.userService userService;
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        userService = new userServiceImpl();
        if (!StringUtils.isNullOrEmpty(username)&& !StringUtils.isNullOrEmpty(password)){
//            if (userService.Login(new User(username,password))) {
//                req.getRequestDispatcher("/page/Home.html").forward(req, resp);
            req.getSession().setAttribute("user",new User(username,password));
            req.getRequestDispatcher("/page/Home.html").forward(req,resp);

        }
    }
}

 下面就需要编写过滤器了。再编写之前我们先了解一下。

       过滤器,顾名思义就是起到过滤筛选作用的一种事物,只不过相较于现实生活中的过滤器,这里的过滤器过滤的对象是客户端访问的web资源,也可以理解为一种预处理手段,对资源进行拦截后,将其中我们认为的杂质(用户自己定义的)过滤,符合条件的放行,不符合的则拦截下来 。

       滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求;在请求到达Servlet/JSP之前,过滤器截获请求。

       过滤器中常用的是Filter接口。

       Filter接口是过滤器类必须实现的接口,该接口中有三个方法:

1.init(FilterConfig filterConfig):该方法是对filter对象进行初始化的方法,仅在容器初始化filter对象结束后被调用一次,参数FilterConfig可以获得filter的初始化参数;


2.doFilter(ServletRequest request,ServletResponse response,FilterChain chain):该方法是filter进行过滤操作的方法,是最重要的方法。过滤器实现类必须实现该方法,方法体中可以对request和response进行预处理。其中FilterChain可以将处理后的request和response对象传递到过滤链上的下一个资源。


3.destroy():该方法在容器销毁对象前被调用。

下面我们就来实现一下

public class MyFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");

//        用户名不为空,就能访问page下的资源
        if (request.getSession().getAttribute("user")!=null){
            chain.doFilter(request,response);
        }else {//用户名为null,跳转到登录界面
            response.sendRedirect("/HelloFilter/login.html");
        }
    }

    public void destroy() {

    }
}
    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.lcp.config.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/page/*</url-pattern>
    </filter-mapping>

 

        这时访问http://localhost:8888/HelloFilter/page/Home.html跳转到登录界面,登录成功后,跳转到Home界面。再次访问http://localhost:8888/HelloFilter/page/Home.html直接跳转,不用登录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值