JavaWeb基础系列(十二)过滤器

一、过滤器简介

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目 标资源访问前后进行逻辑处理。

二、过滤器快速入门

实现步骤:
(1)编写一个过滤器的类实现Filter接口
(2)实现接口中尚未实现的方法(着重实现doFilter方法)
(3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)

@WebFilter(filterName = "Filter1",urlPatterns={"/*"})
public class Filter1 implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        System.out.println("过滤器入门");
        //放行
        chain.doFilter(req,resp);
    }
    public void init(FilterConfig config) throws ServletException {

    }
}

三、过滤器的API

Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法:
init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行。
doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法。
destory():代表是filter销毁方法 当filter对象销毁时执行该方法。
Filter对象的生命周期:
Filter何时创建:服务器启动时就创建该filter对象
Filter何时销毁:服务器关闭时filter销毁
总结Filter的作用?
公共代码的提取
可以对request和response中的方法进行增强(装饰者模式/动态代理)
进行权限控制

四、案例:自动登录

首先是正常的登录,检查是否勾选了自动登录:

@WebServlet(name = "Login",
        urlPatterns = {"/Login"})
public class Login extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");

        //验证码校验
        //获得页面输入的验证
        String checkCode_client = request.getParameter("checkCode");
        //获得生成图片的文字的验证码
        String checkCode_session = (String) request.getSession().getAttribute("checkcode_session");
        //比对页面的和生成图片的文字的验证码是否一致
        if(!checkCode_session.equals(checkCode_client)){
            request.setAttribute("loginInfo", "您的验证码不正确");
            request.getRequestDispatcher("/login.jsp").forward(request, response);
            return;
        }

        request.setCharacterEncoding("UTF-8");
        //1、获得用户名和密码
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //2、调用一个业务方法进行该用户查询
        User login1 = null;
        try {
            login1 = login(username,password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        //3、通过user是否为null判断用户名和密码是否正确
        if(login1!=null){

            //判断用户是否勾选自动登录
            String autoLogin = request.getParameter("autoLogin");
            if(autoLogin!=null){
                //对中文张三进行编码
                String username_code = URLEncoder.encode(username, "UTF-8");// %AE4%kfj
                javax.servlet.http.Cookie cookie_username = new javax.servlet.http.Cookie("cookie_username",username_code);
                javax.servlet.http.Cookie cookie_password = new javax.servlet.http.Cookie("cookie_password",password);
                //设置cookie的持久化时间
                cookie_username.setMaxAge(60*60);
                cookie_password.setMaxAge(60*60);
                //设置cookie的携带路径
                cookie_username.setPath(request.getContextPath());
                cookie_password.setPath(request.getContextPath());
                //发送cookie
                response.addCookie(cookie_username);
                response.addCookie(cookie_password);
            }

            //用户名和密码正确
            //登录成功 跳转到网站的首页
            response.sendRedirect(request.getContextPath()+"/index.jsp");
            //用户登录成功之后放入到Session中
            HttpSession session = request.getSession();
            session.setAttribute("user",login1);

        }else
        {
            //用户名或密码错误
            //跳回当前login.jsp
            request.setAttribute("loginInfo","用户名或密码错误");
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
    }
    public User login(String username,String password) throws SQLException {
        QueryRunner runner = new QueryRunner(DataSourceUtils.getDataSource());
        String sql = "select * from user where username=? and password=?";
        User user = runner.query(sql,new BeanHandler<User>(User.class),username,password);
        return user;
    }
}

编写过滤器:

@WebFilter(filterName = "Filter2",urlPatterns={"/*"})
public class AutoLoginFilter implements Filter {
    public void destroy() {
    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest req1 = (HttpServletRequest) req;
        HttpServletResponse resp1 = (HttpServletResponse) resp;
        HttpSession session = req1.getSession();

        //获得cookie中用户名和密码 进行登录的操作
        //定义cookie_username
        String cookie_username = null;
        //定义cookie_password
        String cookie_password = null;
        //获得cookie
        Cookie[] cookies = req1.getCookies();
        if(cookies!=null){
            for(Cookie cookie : cookies){
                //获得名字是cookie_username和cookie_password
                if("cookie_username".equals(cookie.getName())){
                    cookie_username = cookie.getValue();
                    //恢复中文用户名
                    cookie_username = URLDecoder.decode(cookie_username, "UTF-8");
                }
                if("cookie_password".equals(cookie.getName())){
                    cookie_password = cookie.getValue();
                }
            }
        }
        //判断username和password是否是null
        if(cookie_username!=null&&cookie_password!=null){
            //登录的代码
            UserService service = new UserService();
            User user = null;
            try {
                user = service.login(cookie_username,cookie_password);
            } catch (SQLException e) {
                e.printStackTrace();
            }
            //将登录的用户的user对象存到session中
            session.setAttribute("user", user);
        }
        //放行
        chain.doFilter(req, resp);
    }
    public void init(FilterConfig config) throws ServletException {

    }
}

转载请标明出处,原文地址:https://blog.csdn.net/weixin_41835916 如果觉得本文对您有帮助,请点击支持一下,您的支持是我写作最大的动力,谢谢。
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41835916/article/details/80866437