过滤器的基本配置以及几个典型案例(实现自动登录,屏蔽脏词,禁止浏览器缓存动态页面,带缓存过滤器)
发布日期:2022-02-01 14:28:18 浏览次数:32 分类:技术文章

本文共 8469 字,大约阅读时间需要 28 分钟。

1.1 什么是过滤器

Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

  Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。

1.2 如何编写过滤器

1、编写java类实现Filter接口

2、重写doFilter方法
3、设置拦截的url
入门案例:

@WebFilter(filterName = "myfilter1",value = "/hello.jsp") //拦截路径  /index.jsppublic class MyFilter1 implements Filter {    //初始化方法init    @Override    public void init(FilterConfig filterConfig) throws ServletException {        System.out.println("----初始化myfilter1-------");        String username = filterConfig.getInitParameter("username");        String age = filterConfig.getInitParameter("age");        System.out.println(username+"---"+age);    }    //执行过滤 request  response  chain过滤器链    @Override    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {        System.out.println("过滤前处理myfilter1......");        //放行(执行目标资源)(判断后面还有没有过滤器,如果有则执行过滤器,如果没有则执行目标资源)        chain.doFilter(request, response);        System.out.println("过滤后处理myfilter1-----------------");    }    //销毁 tomcat关闭,是否资源    @Override    public void destroy() {        System.out.println("销毁了myfilter1...................");    }}
1.3 过滤器的配置
1.3.1 注解式配置

在自定义的Filter类上使用注解@WebFilter(“/*”)

1.3.2 xml配置

在web.xml中进行过滤器的配置:

sf
com.qf.web.filter.SecondFilter
sf
/*

过滤器的拦截匹配路径通常有三种形式:

(1)精确拦截地址匹配 ,比如/index.jsp
(2)后缀拦截地址匹配,比如*.jsp、.html、.jpg
(3)通配符匹配/*,表示匹配所有、注意过滤器不能使用/匹配

1.4 过滤器链

在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。这些过滤器的执行顺序由filter-mapping的顺序决定,前面filter-mapping优先级高于后面的。
注意:
(1)如果为注解的话,是按照类名的字符串顺序进行起作用的
(2)如果web.xml,按照 filter-mapping注册顺序,从上往下
(3)web.xml配置高于注解方式
(4)如果注解和web.xml同时配置,会创建多个过滤器对象,造成过滤多次。
在进行过滤时候 先进行代码判断 然后放行,返回浏览器时候 不会继续拦截。
1.5过滤器的优点
可以实现 Web 应用程序中的预处理和后期处理逻辑
1.6典型案例
实现自动登录:
1.注册表单界面 将数据送到注册LoginServlet

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    Title
用户名:
密码:
记住密码

LoginServlet接收表单传过来的数据

@WebServlet(name = "LoginServlet",value = "/login")public class LoginServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {      request.setCharacterEncoding("utf-8");//设置请求编码 防止乱码      response.setContentType("text/html;charset=utf-8");//设置响应编码        String username = request.getParameter("username");//接收用户名        String password = request.getParameter("password");//密码        String auto = request.getParameter("auto");//是否勾选记住密码        if(username.equals("admin")&&password.equals("123")){        //若账号密码正确将用户名放到session中,用于自动登录显示用户名和过滤器判断是否是登录状态            request.getSession().setAttribute("username",username);            if(auto!=null){               //auto不为空代表勾选自记住密码                String info=username+"#"+password;//封装用户信息                //加密                info= Base64.getEncoder().encodeToString(info.getBytes());                Cookie cookie=new Cookie("info",info);//创建cookie保存用户信息                //设置cookie存在时间  一周                cookie.setMaxAge(60*60*24*7);                cookie.setPath("/");//设置路径  相对于当前项目                cookie.setHttpOnly(true);//仅支持http                response.addCookie(cookie);//将cookie放到服务器响应中  给浏览器缓存                       }                 response.sendRedirect("index.jsp");//重定向到目标页面  及登陆成功页面        }else {            response.getWriter().write("用户名或者密码错误!");        }    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {      doPost(request,response);    }}

3.设置拦截器 拦截访问index.jsp页面的请求

@WebFilter(filterName = "AutoLoginFilter"/*,value = "/index.jsp"*/)public class AutoLoginFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {    //将req和resp转换成http类型        HttpServletRequest request= (HttpServletRequest) req;        HttpServletResponse response= (HttpServletResponse) resp;        //获取session中的username信息        Object username = request.getSession().getAttribute("username");        if(username!=null){            //不为空 则说明已经登陆是状态 直接放行 结束            chain.doFilter(req,resp);            return;        }else{        //若为空,说明本次会话结束 窗口关闭  看缓存中是否有用户名密码 实现自动登录        //获取所有cookie,若cookie不为空 遍历  查找是否有用户信息的cookie            Cookie[] cookies = request.getCookies();            if(cookies!=null){                for (Cookie cookie : cookies) {                    //判断是不是自己的cookie                    if(cookie.getName().equals("info")){                    //是用户信息的cookie  获取cookie值  (值为用户名和密码)                        String value = cookie.getValue();                        //解码                        byte[] decode = Base64.getDecoder().decode(value);                        String info = new String(decode);                        String[] infos = info.split("#");                        if(infos[0].equals("admin")&&infos[1].equals("123")){                        //如果cookie中的用户名和密码和设置的一致,则放行到达index.jsp目标页面                        //并且再将用户名放进session中                            request.getSession().setAttribute("username",infos[0]);                            chain.doFilter(req,resp);                            return;                        }else{                        //若用户名和密码不对 则说明被人篡改 或者其他原因 这时候 删除该cookie                            //删除cookie                            Cookie cookie1=new Cookie("info","");                            cookie1.setMaxAge(0);                            cookie1.setPath("/");                            response.addCookie(cookie1);                        }                    }                }            }        }    }    public void init(FilterConfig config) throws ServletException {    }}

最后就是 到达目标页面index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>      $Title$      

网站首页,欢迎您${username}

<% System.out.println("index.jsp....."); %>

案例2 过滤脏词

1.首先是聊天界面的html 想servlet发送数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>    聊天框
用户名:
聊天内容:

2.然后servlet接收聊天数据并打印在控制台

@WebServlet(name = "ChatServlet",value = "/chat")public class ChatServlet extends HttpServlet {    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        request.setCharacterEncoding("utf-8");        response.setContentType("text/html;charset=utf-8");        //因为request是封装好的,在过滤时候 只能是重写getParameter方法        String username = request.getParameter("username");        String content = request.getParameter("content");        System.out.println(username+"说:"+content);    }    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   doPost(request,response);    }}

3.创建过滤器 对聊天的servlet进行拦截 过滤藏脏词 然后放行

注意这里要过滤脏词 只能在servlet接收前端传来的数据时候 进行过滤 因为request是封装好的 座椅我们只能在.getParameter(“username”)下手,重写这个方法 实现过滤

@WebFilter(filterName = "DrityFilter" ,value = "/chat")public class DrityFilter implements Filter {    public void destroy() {    }    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {        //z这里需要将中重写后的Myrequest类放行  而不是放行默认的req        MyRequest myRequest=new MyRequest((HttpServletRequest) req);        chain.doFilter(myRequest,resp);    }    public void init(FilterConfig config) throws ServletException {    }//这里创建内部类继承HttpServletRequestWrappe(包装类)  并重写该子类中的getParameter    static class MyRequest extends HttpServletRequestWrapper{        //定义集合  存放要替换的脏话       private List
dirtyWords=null; //初始化构造方法 public MyRequest(HttpServletRequest request) { super(request); //初始化脏话集合 dirtyWords= Arrays.asList("臭不要脸","憨憨","狗蛋"); } @Override //重写getParameter方法 public String getParameter(String name) { System.out.println("开始过滤..."); //获取 原始聊天信息 String value = super.getParameter(name); //遍历集合 将聊天信息中包含的脏话替换 for (String dirtyWord : dirtyWords) { value=value.replace(dirtyWord,"***"); } return value; } }}

转载地址:https://blog.csdn.net/shunshizhen120412/article/details/100587757 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:mysql的多表查询
下一篇:javaweb 实现数据的增删改查及其分页(使用数据库连接池和工具类)

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月07日 10时30分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

Flink在美团的应用与实践听课笔记 2019-04-27
Java多线程的11种创建方式以及纠正网上流传很久的一个谬误 2019-04-27
JDK源码研究Jstack,JMap,threaddump,dumpheap的原理 2019-04-27
Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现 2019-04-27
javac编译原理和javac命令行的使用 2019-04-27
Unity使用UnityWebRequest实现本地日志上传到web服务器 2019-04-27
Unity使用RenderTexture实现裁切3D模型 2019-04-27
美术和程序吵架,原来是资源序列化格式设置不统一 2019-04-27
Unity iOS接SDK,定制UnityAppController 2019-04-27
Unity iOS接SDK前先要了解的知识(Objective-C) 2019-04-27
python遇到了‘module‘ object has no attribute ‘socket‘问题,大概率是这个原因 2019-04-27
记一次iOS闪退问题的定位:NSLog闪退 2019-04-27
Unity打开照相机与打开本地相册然后在Unity中显示照片(Android与iOS) 2019-04-27
无需接入SDK即可在Unity中获取经纬度(Android/iOS),告诉我你的坐标 2019-04-27
Unity获取系统信息SystemInfo(CPU、显卡、操作系统等信息) 2019-04-27
Unity中获取物体的尺寸(size)的三种方法 2019-04-27
Unity中的关节组件和绳子效果的实现 2019-04-27
Unity可视化编程插件: Bolt,可以像UE4的蓝图那样啦 2019-04-27
Android使用adb logcat时日志中文乱码问题,使用chcp 65001设置编码即可 2019-04-27
Android的.dex、.odex与.oat文件扫盲 2019-04-27