Filter常见应用

Filter常见应用

1、禁止浏览器缓存所有动态页面的过滤器:

1)有 3 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

response.setDateHeader("Expires",-1);   

 Expires数据头:值为GMT时间值,为-1指浏览器不要缓存页面

response.setHeader("Cache-Control","no-cache"); 

Cache-Control响应头有两个常用值:

no-cache指浏览器不要缓存当前页面。

max-age:xxx指浏览器缓存页面xxx秒。

response.setHeader("Pragma","no-cache"); 

2)所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头。

3)代码:

//禁止浏览器缓存所有动态页面的过滤器

publicclassNoCacheFilter implements Filter {

    publicvoiddestroy() {    }

    publicvoiddoFilter(ServletRequest request, ServletResponse response,

            FilterChainchain) throws IOException,ServletException {

        //转换成HttpServlet

        HttpServletRequestreq=(HttpServletRequest) request;

        HttpServletResponseresp=(HttpServletResponse) response;

        //3http响应头

        //过期时间,-1为不缓存页面

        resp.setDateHeader("expires",-1);

        //没有缓存控制,nochche为没有缓存

        resp.setHeader("Cache-Control","no-cache");

        //也相当于无缓存

        resp.setHeader("Pragma","no-cache");

        //过滤器链 ,寻找目标资源

        chain.doFilter(req,resp);

    }

publicvoidinit(FilterConfig filterConfig) throws ServletException {}

}

2、控制浏览器缓存页面中的静态资源的过滤器:

有些动态页面中引用了一些图片或css文件以修饰页面效果,这些图片和css文件经常是不变化的,所以为减轻服务器的压力,可以使用filter控制浏览器缓存这些文件,以提升服务器的性能。

代码:

//控制浏览器缓存页面中的静态资源过滤器

publicclassExpiresFilter implements Filter {

    FilterConfigconfig;

    publicvoiddestroy() {}

    publicvoiddoFilter(ServletRequest request, ServletResponse response,

            FilterChainchain) throws IOException,ServletException {

            HttpServletRequestreq=(HttpServletRequest) request;

        HttpServletResponseresp=(HttpServletResponse) response;

        //获取请求的URl

        Stringuri=req.getRequestURI();

        //判断是什么结尾

        if(uri.endsWith(".css")){

            longtime=Integer.parseInt(config.getInitParameter("css"))*1000;

            resp.setDateHeader("expires",System.currentTimeMillis()+time);

        }elseif(uri.endsWith(".js")){

            longtime=Integer.parseInt(config.getInitParameter("js"))*1000;

            resp.setDateHeader("expires",System.currentTimeMillis()+time);

        }elseif(uri.endsWith(".jpg")){

            longtime=Integer.parseInt(config.getInitParameter("jpg"))*1000;

            resp.setDateHeader("expires",System.currentTimeMillis()+time);

        }

        chain.doFilter(req,resp);

    }

    publicvoid init(FilterConfig filterConfig) throws ServletException {

        // 获取参数值

        this.config =filterConfig;

    }

}

3、实现用户自动登陆的过滤器

        题目:

1)在用户登陆成功后,发送一个名称为usercookie给客户端,cookie的值为用户名和md5加密后的密码。

2)编写一个AutoLoginFilter,这个filter检查用户是否带有名称为usercookie来,如果有,则调用dao查询cookie的用户名和密码是否和数据库匹配,匹配则向session中存入user对象(即用户登陆标记),以实现程序完成自动登陆。

代码:

publicclassAutoLoginFilter implements Filter {

    publicvoiddestroy() {    }

    publicvoid doFilter(ServletRequestrequest, ServletResponse response,

            FilterChainchain) throws IOException,ServletException {

        HttpServletRequestreq = (HttpServletRequest) request;

        HttpServletResponseresp = (HttpServletResponse) response;

        //1.检查用户是否登录

        Useruser = (User) req.getSession().getAttribute("user");

        if(user!=null){

            chain.doFilter(req,resp);

            return;

        }

        //2.检查用户是否带cookie

        Stringusername = null;

        Stringpassword = null;

        Cookie[]cookies = req.getCookies();

        for(inti=0;cookies!=null &&i<cookies.length;i++){

            if(cookies[i].getName().equals("username")){

                username= cookies[i].getValue();

            }

            if(cookies[i].getName().equals("password")){

                password= cookies[i].getValue();

            }

        }

        if(username==null&& password==null){

            chain.doFilter(req,resp);

            return;

        }

        UserDaodao = new UserDao();

        Useruser1 = dao.find(username);

        Stringsave_password = user1.getPassword();

        if(!password.equals(save_password)){

            chain.doFilter(req,resp);

            return;

        }

        req.getSession().setAttribute("user",user1);

        chain.doFilter(req,resp);

    }

    publicvoidinit(FilterConfig filterConfig) throws ServletException { }

}

 

publicclass LoginServletextends HttpServlet {

    publicvoiddoGet(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        Stringusername = request.getParameter("username");

        Stringpassword = request.getParameter("password");

    IntautoLoginTime=Integer.parseInt(request.getParameter("autoLoginTime"));

        UserDaodao = new UserDao();

        Useruser = dao.find(username, password);

        if(user!=null){

            request.getSession().setAttribute("user",user);

            //Stringpassword1 = user.getPassword();

            //Stringmd5password = md5(password1);

            //System.out.println(md5password);

            Cookiecookie1 = new Cookie("username",user.getUsername());

            Cookiecookie2 = new Cookie("password",user.getPassword());

            //Cookiecookie2 = new Cookie("password",md5password);

            cookie1.setMaxAge(autoLoginTime);

            cookie2.setMaxAge(autoLoginTime);

            cookie1.setPath("/FilterDemo");

            cookie2.setPath("/FilterDemo");

            response.addCookie(cookie1);

            response.addCookie(cookie2);

            response.sendRedirect("/FilterDemo/welcome.jsp");

        }else{

            request.setAttribute("message","用户名密码错");

            request.getRequestDispatcher("/message.jsp").forward(request,response);

        }

    }

    privateString md5(String input){

        try {

            MessageDigest md = MessageDigest.getInstance("md5");

            byte[] result =md.digest(input.getBytes());

            BASE64Encoderencoder = new BASE64Encoder();

            returnencoder.encode(result);

        }catch (NoSuchAlgorithmException e) {

            thrownewRuntimeException();

        }

    }

    publicvoiddoPost(HttpServletRequest request, HttpServletResponse response)

            throwsServletException, IOException {

        doGet(request,response);

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java常见的设计模式有23种,它们分别是: 1. 工厂模式(Factory Pattern) 2. 抽象工厂模式(Abstract Factory Pattern) 3. 单例模式(Singleton Pattern) 4. 建造者模式(Builder Pattern) 5. 原型模式(Prototype Pattern) 6. 适配器模式(Adapter Pattern) 7. 桥接模式(Bridge Pattern) 8. 过滤器模式(Filter Pattern) 9. 组合模式(Composite Pattern) 10. 装饰器模式(Decorator Pattern) 11. 外观模式(Facade Pattern) 12. 享元模式(Flyweight Pattern) 13. 代理模式(Proxy Pattern) 14. 责任链模式(Chain of Responsibility Pattern) 15. 命令模式(Command Pattern) 16. 解释器模式(Interpreter Pattern) 17. 迭代器模式(Iterator Pattern) 18. 中介者模式(Mediator Pattern) 19. 备忘录模式(Memento Pattern) 20. 观察者模式(Observer Pattern) 21. 状态模式(State Pattern) 22. 策略模式(Strategy Pattern) 23. 模板方法模式(Template Method Pattern) 它们的应用场景如下: 1. 工厂模式:用于创建对象实例。 2. 抽象工厂模式:用于创建一组相关或相互依赖的对象实例。 3. 单例模式:用于保证系统中只有一个实例,例如系统配置等。 4. 建造者模式:用于创建复杂对象,将创建过程与表示分离。 5. 原型模式:用于创建对象的克隆,避免重复创建对象。 6. 适配器模式:用于将一个类的接口转换成客户端希望的另一个接口。 7. 桥接模式:用于将抽象部分与实现部分分离,使它们可以独立变化。 8. 过滤器模式:用于过滤一组对象,返回满足条件的子集。 9. 组合模式:用于将对象组合成树形结构,表示“整体-部分”关系。 10. 装饰器模式:用于为对象动态添加功能,避免使用继承方式扩展功能。 11. 外观模式:用于提供一个统一的接口,封装子系统中的一组接口。 12. 享元模式:用于共享一组细粒度对象,以减少内存使用和提高性能。 13. 代理模式:用于为其他对象提供一种代理以控制对这个对象的访问。 14. 责任链模式:用于将请求沿着处理链传递,直到有一个处理对象处理该请求。 15. 命令模式:用于将请求封装成一个对象,从而使不同的请求可以使用相同的处理方式。 16. 解释器模式:用于定义语言的文法,并解析语言中的句子。 17. 迭代器模式:用于提供一种方法顺序访问聚合对象中的各个元素。 18. 中介者模式:用于封装一组对象之间的交互,使其可以松耦合地改变交互方式。 19. 备忘录模式:用于保存对象的状态,以便恢复到之前的状态。 20. 观察者模式:用于在对象之间定义一对多的依赖关系,当一个对象状态改变时,所有依赖于它的对象都得到通知。 21. 状态模式:用于封装对象的状态,并定义对象状态之间的转换。 22. 策略模式:用于定义一组算法,并将每个算法封装起来,使其可以互换使用。 23. 模板方法模式:用于定义一个算法的骨架,并将一些步骤延迟到子类中实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值