A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同学们,今天讲的是过滤器Filter,Filter是JavaWeb三大组件(Servlet、Listener、Filter)之一,是很重要的一个概念,包括学习后面框架的时候,我们也离不开过滤器。

今日需要掌握的有:
  • 自动登录案例很经典也很重要,除了代码实现之外,实现思路希望大家整理一下
  • 规范网站编码过滤的案例重要的还是理解过滤器思想,代码辅助记忆

请同学们按照如上要求,总结今日所学。



23 个回复

倒序浏览
王刘锁
2018-6-15-->Filter-->过滤器-->在数据使用途中拦截数据来做一些操作判断数据的合法性一类的,
第一个案例是自动登录的案例,一开始写的时候发现没用到Filter过滤器,在学习了过滤器后思路一下
通了,第一次直接在jsp中用Java代码实现了自动登录,毕竟在jsp中写Java代码不好,因此又用过滤器敲
了一遍,代码没有陌生的地方,主要整理一下思路,我是自己重新写一个简单的登录页面和首页,然后提
交信息到后台,判断是否登陆成功,登陆成功就把user存到session域中,在首页取出判断是否登录,登录
了就显示页面,没登录跳到登录页面提示登录,在登录成功的时候我们还要判断用户是否勾选自动登录,
获取到复选框的值判断是否为true,为true就把用户的信息存到cookie中,这样就可以给cookie设置有
效路径和存活时间,这是实现自动登录的关键,当重新启动浏览器的时候会携带存储用户信息的cookie,
再次访问首页的时候就可以在访问前用过滤器拦截,在过滤器中先判断session中是否有user,如果没有
关闭浏览器session会有user这时直接放行到首页,因为在首页会先判断session中是否有user再去显示
页面,如果session中没有user再去cookie中查看,获取所有的cookie,利用之前定义的cookie工具类传
入cookie数组和cookie名返回一个cookie对象,判断这个对象是否为空,cookie为空说明没有存cookie,
当用户没有选择自动登录的时候就不会执行上面的存cookie的步骤,这时直接放行会提示登录并跳回登
录界面,如果cookie不是空说明选择了自动登录,为了防止传cookie的时候有意外发生或恶意串改了用
户信息,还需要获取cookie中的数据,根据数据去数据库确认是否有此数据,返回user对象,判断user是
否为空,不为空存道session中再放行就可以去首页了,user为空也可以直接放行会提示登录并跳转到登
录界面,这个过滤器的内容就这些,难点在于逻辑上的嵌套,把几个判断理清了就很简单的,
第二个案例是通用的处理编码问题的过滤器,这个案例要求理解思路,要知道我们再处理编码问题的时
候是根据请求方式不同处理的格式也有不同的,为了不每次都去处理编码,想要做到直接获取参数的效
果需要去重写增强获取参数的getParameter方法.在过滤器中把request强转成HTTPServletRequest才
能获取请求方式,但是不在过滤器中获取,需要定义一个类去继承HttpServletRequestWrapper这个模板
类,该类实现了HTTPServletRequest接口,因此继承该类不需要实现全部接口方法,只需要重写增强
getParameter方法,在方法中获取请求方式并判断,根据不同请求方式去做编码的处理,get方法处理完
后把数据return即可,post方式处理完调用父类getparameter方法获取数据即可,然后在过滤器中创建
这个自己定义的增强后的request对象,并用该对象放行,这时后台用的request就是增强后的了,
回复 使用道具 举报
颜林琳

Filter过滤器:
        1.作用:拦截从客户端向服务器发送的请求.(过滤器是在服务器中,在客户端向服务器发送请求时,还没到达目标资源时进行拦截)
        2.应用: 1. IP的过滤 2.敏感词过滤 3.自动登录 4.增强request的方法
        3.FilterChain:过滤链(过滤链中的过滤执行顺序和<filter-mapping>的配置顺序有关)
                doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
        4.FilterConfig:了解
                1.getFilterName()                        获取过滤器名称
                2.getInitParameter(String name)                获得初始化参数
                3.getInitParameterName(String name)        获取初始化参数名称
                4.getServletContext()                        获取ServletContext
        5.Filter配置:
                在filter的配置中若不配<url-patten>就配置<Servlet-name>进行配置根据Servlet名称拦截Servlet
                <dispatcher>的配置:
                        1.request:        默认值 (拦截请求)
                        2.forward:        转发        (拦截转发)
                        3.include:        包含
                        4.error:        错误页面跳转(全局错误页面)

基本的登录:
        Servlet中:
        1.接收参数
                request.getParameterMap();
        2.封装数据
                BeanUtils.populate(new User(),map)
        3.调用业务层处理数据
                UserService userService=new UserService();
                User existUser=userService.login(user);
        4.页面跳转
                判断用户是否存在
                    1.不存在,登录失败
                        向页面发送一个错误信息
                        request.setAttribute("msg","登录失败,用户名或密码有误!");
                        使用转发,跳回到登录页面
                        request.getRequestDispatcher("/login.jsp").forward(request, response);
                    2.存在,登录成功
                        将其值存入session中
                        request.getSession().setAttribute("existUser", existUser);
                        使用重定向到首页
                        response.sendRedirect(request.getContextPath()+"/index.jsp");
       
登录成功后再页面显示,登录的用户:
                                <c:if test="${empty existUser }">
                                                <li><a href="${pageContext.request.contextPath}/login.jsp">登录</a></li>
                                                <li><a href="register.htm">注册</a></li>
                                                </c:if>
                                <c:if test="${not empty existUser }">
                                                <li>您好,${existUser.nickname }</li>
                                                <li><a href="#">退出</a></li>
                                                </c:if>
自动登录:
        1.在页面"自动登录"的复选框,添加个name="autoLogin",value="true"
        2.在Servlet的判断登录成功后下边编写自动登录的代码
                1.记住用户名和密码:
                        获取复选框名称:
                        String autoLogin = request.getParameter("autoLogin");
                2.判断复选框是否被选中:
                        if("true".equals(autoLogin)){
                                将获取到的数据存到cookie中,携带到浏览器中
                                Cookie cookie=new Cookie("autoLogin", existUser.getUsername()+"#"+existUser.getPassword());
                               
                                cookie.setPath("/day23");
                                cookie.setMaxAge(60 * 60 * 24 * 7);
                                response.addCookie(cookie);
                                }
        3.自动登录过滤器:
                1.获取session
                2.判断session中是否有用户信息
                        1.有,放行
                        2.没有,就要到cookie中获取
                                1.cookie中没有,放行
                                2.cookie中有,到数据库中查询用户信息
                                        1.没有查询到,放行
                                        2.有,将信息存到session中,放行
回复 使用道具 举报
陈强
Filter的一天;
首先就是对于过滤器的学习:过滤从客户端向服务器发送的请求;
如何使用?
--编写一个类实现Filter接口-javax.servlet下,导包注意别导错了.
--编写配置
一个过滤器的生命周期是从服务器启动的时候就创建了,在服务器正常关闭的时候销毁.
如果同时有多个过滤器,即过滤器链的时候,执行的顺序由配置文件中mapping的先后顺序决定.
然后就是运用过滤器实现自动登录案例,以下是整体的一个思路:
1\编写一个servlet,完成正常的登录---接收参数\封装数据\调用业务层\页面跳转
2\到首页JSP中去引入JSTL,根据是佛登录成功,显示的信息做相应的处理;
        ----这里要注意,之前我们的登录成功与否,都是直接对从数据库查询时返回的对象进行判断来决定是否登录成功,但是现在我们是根据session中是否有用户信息来判断登录与否!!
3\登录成功后,判断是否有勾选自动登录复选框,是的话就要将用户信息存进cookie中
4\使用过滤器,在访问主页之前先进行判断,
        ----先是从session中去判断是否有用户信息,有的话,说明已经登录了,放行
        ----session中没有用户的信息的话,就要去cookie中去获取
        ----如果cookie中没有用户信息,则说明没有登录过,放行
        ----如果cookie中信息的话,还要进一步去匹配cookie中的信息是否可以匹配成功
        ----匹配不成功的话,说明用户名或者密码有被修改过
        ----匹配成功的话,就要将用户信息存到session中,并放行
!!!!!!!注意!!!!!!!一定记得配置web.xml
回复 使用道具 举报
常小天
今天学习的是过滤器——filter。过滤器可以对请求进行拦截和筛选,将符合指定条件的请求放行到请求的资源位置。过滤器在服务器启动的时候创建,在服务器关闭或者项目从服务器移除时销毁。过滤器的使用方法大致上有两步。第一步是编写一个类去实现filter接口,第二步是在web.xml中配置过滤器。实现filter接口后要重写接口中的方法。Filter接口中的方法有三个,init方法在过滤器创建时执行,它是初始化方法;destroy方法在过滤器销毁时执行;而我们最关注的方法是第三个方法——doFilter方法,在这个方法中我们可以设置筛选请求的条件,还可以进行各种操作,在这个方法的最后我们需要使用chain对象调用doFilter方法来放行符合指定条件的请求。过滤器的使用方法并不难,难的是它在具体案例中的应用。今天的自动登录案例中就使用了filter,而这个案例的难点就在它比较复杂的逻辑上。本案例中,我们首先实现一下完全体的登录操作,也就是在验证用户名密码正确后将user对象存进session中。接下来进行自动登录功能的代码编写。首先在登录页面的“自动登录”复选框上设置好属性,name属性一定要加,还可以给它设一个value,值为true。下一步就是在servlet中获取自动登录复选框的值,如果复选框被勾选,那获得的值就是true,这时候就将从参数中获得的username和password用#等特殊符号链接成一个字符串,将这个字符串存入一个cookie中,在给这个cookie设置一个合适的生命长度,最后添加cookie。Servlet中的后续步骤照常编写。在添加好cookie后,我们可以来编写一个filter,在这个filter中先获得一下session,判断session中是否有user对象,如果有,则直接放行,如果没有,则获取cookie数组,在cookie数组中获取存有username和password的那个cookie,如果没有获取到,则放行,获取到了,则转成字符串再以#号分割,将username和password封装进一个user对象,调用登录的service方法进行验证,如果验证失败,数据库中没有这个用户信息,则放行,如果验证成功,就将这个user对象存进session在放行。
回复 使用道具 举报
詹源

过滤器:

cookie记住用户的用户名和密码

Filter :
过滤器的使用:进行IP的过滤.脏话过滤,自动登录,响应压缩;;;
             在到达目的地之前进行拦截.

如何编写过滤器:
与监听器类似,建立类,实现接口过滤器接口
wb.xml中去配置下
配置
<filter>
<filter-name><filter-name>
<filter.class><filter.class>
<filtre>
<filter-mapping>

<filter-mapping>
//放行:
chai.doFilter(request,response);


过滤器的生命周期(了解.面试题servlet周期要掌握)
随服务器启动而创建,服务器关闭而销毁

FilterConfig:
//获得当前的Filter的名称
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
//获得初始化参数
String usernama = filterConfig.getInitParameter
String password = filterConfig.getInitParameter

过滤器链执行顺序:

<servlet-name><servlet-name>

<dispatcher>的配置

<dispatcher>FORWORD<dispatcher>转发
<dispatcher>REQUEST<dispatcher>默认值

(页面登录:把user存到session中,才能叫登录.判断session中有没有user,有说明登录成功.才能访问,没有,显示请登录)

自动登录JSP界面的JAVA代码,用过滤器拦截,由过滤器来完成数据处理

通用的字符集编码的过滤器:

作用:在一个网站上,通常会提交带有中文的数据,GET/POST请求都有可能提交中文数据.通常情况下,在某个Servlet中处理中文乱码.
现在能不能乱码的处理交给过滤器完成.只需要在Servlet中调用request,getParameter();接收参数就可以.

增强request中的getParameter方法
继承                :控制这个类构造.
装饰者模式        :增强的类和被增强类实现相同的接口,增强的类中获得到被增强的类的引用.
缺点                :接口中方法太多.
动态代理        :被增强的类实现接口就可以.
回复 使用道具 举报
张裕
Filter 过滤器
用来过滤客户端像服务器发送的请求 在访问网页之前进行一些操作
生命周期 服务器启动时创建 关闭时销毁 今天主要用来判断用户勾选自动登录后 二次校验Cookie来实现自动登录

过滤器链 根据xml中Filter mapping的配置顺序来执行 一个过滤器放行到下一个过滤器 其中一个没放行 后面的全部不执行
<dispatchar>配置拦截(重点)  可以用来配置拦截的操作类型
                Request:        请求        default
                Forward:        转发       
                Include:        包含
                Error:        全局错误页面跳转

利用过滤器来实现修改编码
创建增强类继承包装类HttpServletRequestWrapper
增强Parameter方法 在过滤器中创建增强类对象 增强Request对象
放行时传入增强过的Request对象

注意事项 Cookie中存中文需要使用URLEncoder来编码 URLDecoder解码 防止报错
回复 使用道具 举报
郑雪平

今天主要学习了filter这个过滤器,因为在以后框架的学习中还会经常使用filter,所以它就显得尤为重要。过滤器:可以过滤从客户端发送到服务器端的所有请求信息,它是利用cookie技术来记住用户名和密码信息的,要想使用过滤器就需要编写一个类实现filter接口,使用filter过滤器我们可以用来实现诸多过滤功能,譬如IP地址过滤,脏话、敏感信息过滤,网站自动登录等。
  过滤器的生命周期可分为创建和销毁的过程,服务器启动的时候被创建了,服务器关闭时被销毁了。一个类中有多个过滤器放在一起的叫过滤器链,过滤器链中多个过滤器执行是有一定顺序的,即根据XML文件中<filter-mapping>的存储位置的先后顺序来依次执行的,
  filter过滤器的代码实现步骤:1.创建数据库和表文件;2.导入JAR包和工具类;3.创建包结构及其常用类;4.自动登录;5.利用cookie记住用户名和密码;6.完成自动登录的过滤器。
回复 使用道具 举报
郑阳阳
自动登录Filter实现思路:
* 判断session是否为空
* 为空放行,显示未登录的主页面
* 不为空,获取cookie,判断cookie是否为空
* 为空放行,显示未登录的主页面
* 不为空,将cookie的数据拿到数据库查
* 返回值为空时,说明用户名或者密码被更改过,放行,显示未登录的主页面
* 不为空,将数据存入session,放行

编码过滤:
在Filter的doFilter中通过预处理request,重写getParameter方法,
分别对get和post得到的数据进行乱码处理.
                       
回复 使用道具 举报
谢洪彬:
今天学习了过滤器--Filter
过滤器,可以理解为对一扇门,Filter就守在这门口,每个需要经过这扇门的人都需要经过Filter的同意,满足要求则放行,不满足要求就不放行;
Filter的简单入门:
1.我们可以编写一个类去实现Filter接口,实现接口三个的方法
2.在web.xml中去配置Filter,配置方式和配置Servlet基本一样,只是Filter中URL的路径代表的拦截路径
实现Filter中的三个方法:
1.init : 可以记录Filter的创建(服务器加载被创建)
2.doFilter : Filter被执行则这个方法被执行,也是比较关键的一个方法,在这个方法中可以去放行要过滤的程序,
放行: chain.doFilter(request, response);
3.distroy:可以记录Filter的销毁(服务器关闭被销毁)

Filter的URL填写方式:
1.完全相对路径   以/开始,xxx结尾
2.目录路径                以/*开始xxx 以/*结尾
3.扩展民匹配                 以*.xxx格式
今天学习了自动登陆的案例:
思路分析:
1.利用代码完成普通登录案例
2.在登录成功需要将用户名和密码存入session中,同时还需要判断自动登陆的复选框是否被选中,如果被选中则需要将用户名和密码存入Cookie中.
3.这是我么需要利用过滤器去拦截首页,然后开始判断
Session存在
放行
Session不存在
获取登录成功存在Cookie中的值
有Cookie值,取出来去数据库在查询一遍,用户存在的话就把用户        存入session中.
没有Cookie值,直接放习惯
今天的第二个案例是编码过滤:
1.我们使用的是装饰者模式去加强request中的getparameter()方法,
2.在Filter中拦截可以所有的需要执行的程序
3.经过过滤器调用方法获取加强后的request
4.通过放行吧加强后的request放行给Servlet类
回复 使用道具 举报
侯玉林
.什么是过滤器Filter:
        可以过滤从客户端向服务器发送的请求.(无论是get还是post都过滤)
       
2.滤器的作用:
        * 进行IP的过滤,脏话过滤,自动登录,响应压缩...
       
        流程:浏览器向服务器发送数据,在到达目标之前,被服务器中的过滤器截获,然后进行相关过滤和更改操作

3.使用过滤器:
        1.编写一个类实现Filter接口:
        2.配置过滤器(web.xml):
                <filter>
                        <filter-name>aaa</filter-name>
                       
                        //过滤器所在类
                        <filter-class>com.itheima.Filter.FilterDemo</filter-class>
                 </filter>
                  
                 <filter-mapping>
                        <filter-name>aaa</filter-name>
                       
                        //拦截的页面
                        <url-pattern>/demo1/demo1.jsp</url-pattern>
                 </filter-mapping>
               
        3.运行通过
                public void doFilter(ServletRequest request, ServletResponse response,
                                FilterChain chain) throws IOException, ServletException {
                       
                        System.out.println("过滤器执行了");
                       
                        //放行后直接去找jsp,(相当于去访问jsp)
                        chain.doFilter(request, response);
                       
                        //如果有两个放行,就会访问两次jsp,两个jsp会被装到一个响应返回.
                        chain.doFilter(request, response);
                       
                        //执行完jsp后返回到这里
                        System.out.println("过滤器执行完毕了");
                }
       
回复 使用道具 举报
何平波
Filter(过滤器)
概述:可以过滤从客户端向服务器发送的请求.
功能:进行ip的过滤,敏感语言的过滤,自动登录,响应压缩...
配置过滤器xml文件,配置格式与Servlet差不多
<url-pattern>/*</url-pattern>  拦截的是全部响应与请求页面
<url-pattern>/指定jsp</url-pattern>  拦截的是指定jsp响应与请求页面
chain.doFilter(request,response) 放行

*监听器与过滤器是监控全局,比如你在某个页面执行某些操作,都会经过这些过滤器或者是监听器.

Filterchain  过滤器链
执行顺序:与<fiilter-maping>有关,谁先配置,谁先限制,然后服务器端返回的是相反的顺序
两个过滤器的执行顺序是:
过滤器1执行了
过滤器2执行了
过滤器限制对象执行了  
过滤器2再执行了      -服务器返回的顺序
过滤器1再执行了

案例步骤分析  自动登录
1.获得自动登录框的name属性,vlaue=true(判断复选框是否被选中),登录成功才做自动登录
2.判断自动登录的复选框被勾选了,将用户名和密码存入cookie中,用户名和密码用符号隔开,设置有效路

径和时长,添加到cookie中
3.利用过滤器实现自动登录
(1)判断session是否有用户的信息,有就放行,没有去找cookie,cookie没有的话放行,有的话就去数据

库查找,防止被串改  ,将查询到的用户信息存入到session中,放行

案例理解总结
将用户名和密码存入一个cookie中是比较关键的一点,然后为cookie设置生命周期和路径,这样cookie就

不会随着浏览器被关闭而被销毁.
获取到存入用户信息的session,如果有值的话就是代表登陆了,就放行到页面中去.如果sesion中没有的

话就是代表还没登陆,就去本地缓存Cookie找存入的用户信息,如果没有的话(没有登录信息)就放行,
如果Cookie有值的话将拼接起来的用户信息进行切割,将Cookie中的值拿去数据库进行匹配,如果匹配上

了,再将这些信息存入session中,这样下次不用登陆也可以直接在页面上看到登陆的信息了.
注意这里多加了一个防止信息被修改的功能,如果匹配不成功的话就是信息被修改过了
回复 使用道具 举报
郑志祥
过滤器的生命周期;
创建;服务器启动
销毁;服务器关闭的时候




自动登录案例
需要用到,
1.cookie可以保存用户名和密码,可以设置保存时间
2.过滤器;用来校验用户密码是否被篡改



使用过滤器对实现用户名密码的校验
1.先设置一个index.jsp的主页面(该主页面使用了两次,设置了一个判断{existUser},如果为空就显示登录,注册,购物车,如果不为空(说明账号密码正确,进入主页,显得的是你好xxx,退出)在登录的位置设置一个超链接,跳转到登录页面(记得在登陆的jsp中留下name值与id值,并在复选框给name值,与value=“true”)
2,编写一个登录的Servlet,从数据库拿到数据,进行校验登录   a。接收参数   b。封装数据 c。调用业务 (判断返回值existUser是不是有数据,如果没有,说明用户名或者密码错误。如果有,说明登录成功(且将返回的existUser,存在sesion中,这样主页面才可以获得进行判断显示),并在此处查看复选框是否有被选中,如果被选中接收复选框的参数,它的value应该是true,(如果为true,就将用户名和密码编写成字符串)将它保存在cookie中,并设置生命周期和路径,以便下次访问,(记得将cookie返回浏览器))
3.编写filter文件(目的是检查cookie中保存的用户名密码是否正确,它第二次从数据库中获得用户名密码,进行校验)注意;记得配置web.xml的filter文件
  先检查session是否有用户的信息 session中如果有:放行.
         * * session中没有:
         *    * 从Cookie中获取:
         *        * Cookie中没有:放行.
         *        * Cookie中有:
         *            * 获取Cookie中存的用户名和密码到数据库查询.
         *                * 没有查询到:放行.
         *                * 查询到:将用户信息存入到session . 放行.
         */
回复 使用道具 举报
汪志阳:
1.判断session中有无用户信息-
登陆成功:数据储存在session中,
自动登录案例思路:首先完成登录信息的校验.先定义一个map接收文本框提交的username和password键值对,将接受的map封装到domain对象里,在传输到Dao执行sql语句去
完成与数据库的信息校验,在对返回的数据进行判断,执行响应或者重定向,需要注意的是数据只有存入session中,才能算是一次校验的完成.
第二步就是写一个过滤器,Filter,对服务器上cookie数据和客户端session的数据进行过滤.首先判断session中是否有用户的信息:如果有就不需要判断cookie了,顺序不能倒着判断
只有数据存入session了,才算是完成一次登录,所以需要先进性session的判断.session中如果有:放行.显示的是欢迎用户的界面;session中没有,就要进行cookie中数据的获取,
Cookie中没有登录信息则:放行.显示注册,登录;Cookie中有信息,获取Cookie中存的用户名和密码到数据库查询.反之cookie防暑串改;没有查询到:放行.说明数据cookie发生变更
查询到:将用户信息存入到session . 放行.,显示欢迎界面,完成自动登录.
2.第二个案例并不理解,知识大致感觉更像是一个加强工具类,该工具类对get\post出入的数据进行判断,并且进行调用方法进行数据的接收,不会导致乱码的发生.
回复 使用道具 举报
陈叶隆
FilterChain:过滤器链
doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
<dispatcher>的配置:(在web.xml中的<filter-map>中配置)
* REQUEST        :默认值.
* FORWARD        :转发.
* INCLUDE        :包含.
* ERROR                :错误页面跳转.(全局错误页面)
使用过滤器完成自动登录的功能:
// 判断session中是否有用户的信息:
                HttpServletRequest req = (HttpServletRequest) request;
                HttpSession session = req.getSession();
                User existUser = (User) session.getAttribute("existUser");
                if(existUser != null){
                        // 1. session中有用户信息.
                        chain.doFilter(req, response);
                }else{
                        // 2. session中没有用户信息.
                        // 获得Cookie的数据:
                        Cookie[] cookies = req.getCookies();
                        Cookie cookie = CookieUtils.findCookie(cookies, "autoLogin");
                        // 判断Cookie中有没有信息:
                        if(cookie == null){
                                // 2.1 没有携带Cookie的信息过来:
                                chain.doFilter(req, response);
                        }else{
                                // 2.2 带着Cookie信息过来.
                                String value = cookie.getValue();// aaa#111
                                // 获得用户名和密码:
                                String username = value.split("#")[0];
                                String password = value.split("#")[1];
                                // 去数据库进行查询:
                                User user = new User();
                                user.setUsername(username);
                                user.setPassword(password);
                                UserService userService = new UserService();
                                try {
                                        existUser = userService.login(user);
                                        if(existUser == null){
                                                //2.2.1 用户名或密码错误:Cookie被篡改的.
                                                chain.doFilter(req, response);
                                        }else{
                                                //2.2.2 有该用户,将用户存到session中,放行
                                                session.setAttribute("existUser", existUser);
                                                chain.doFilter(req, response);
                                        }
                                } catch (SQLException e) {
                                        e.printStackTrace();
回复 使用道具 举报
郭明杰
过滤器链中的过滤器执行顺序跟配置的mapping先后顺序有关
deFilter 方法可以放行到下一个过滤器
[File的相关配置]
        <urlpattern>的配置方式有多种,完全路径匹配是以 /开头,加上文件名+文件类型 :/Demo1.jsp
                目录匹配:一/开始 以*结束. /demo/*
                扩展名匹配:以*开始 .  *.do
        <dispatcher>配置:REQUEST 拦截请求(默认)                       
                        :FORWARD 拦截转发
                        :INCLUDE 拦截包含
                        :ERROR   错误页面跳转
        默认拦截请求!!如果写了拦截转发等 要实现拦截请求,必须再写一个拦截请求的配置语句
回复 使用道具 举报
黄进安:


1.      放行* doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
--->放行相当于调用一个方法访问目标资源,访问完之后接着往下执行代码
--->过滤器链中的过滤器的执行的顺序与<filter-mapping>的配置顺序有关.
--->当所有的过滤器都执行且访问到目标资源后,从最后一个过滤器返回响应
2.      在自动登入的案例中遇见了cookie存中文出现异常的问题:
解决方案:
cookie存中文字符解决乱码问题:URLEncoder.encode(name, "utf-8");
读取cookie中的中文乱码问题: URLDecoder.decode(name,"utf-8");
Eg:
存:Cookie cookie = newCookie("autoLogin",URLEncoder.encode(exitsUser.getUsername()+"#"+exitsUser.getPassword(),"utf-8"));      
取: value =URLDecoder.decode(cookie.getValue(),"utf-8");
--->即name为存取cookie时的value值


回复 使用道具 举报
刘文峰
Filter(过滤器)可以在请求到达服务器后但还未到达目标资源前将其拦截,进行过滤然后放行;可以过滤ip,过滤文本,自动登录,压缩响应等.使用过滤器需要创建一个类实现Filter接口,重写doFilter()方法;然后在web.xml中配置属性就可以了,配置方式和servlet差不多,url里可以传入要过滤的资源的全路径,这样只有向该资源发送的请求会被过滤;也可以写”/*”过滤所有请求.
过滤器自动登录:
首先实现普通的登录功能(登陆成功时要将数据保存到session中);
自动登录就是通过获得自动登录复选框的值来判断是否需要自动登录;如果需要则在登录成功时将数据添加到cookie中.
过滤器实现自动登录:
1.获得session,判断session里是否有登录信息: 有则说明登录了,直接放行,因为在servlet中,只有登陆成功时才将信息保存到session中;
2.如果没有则判断Cookie里有没有信息,如果没有说明不需要自动登录功能,直接放行,因为只有勾选了自动登录复选框才会加cookie;
3.Cookie里有信息说明需要自动登录,将里面的信息取出来到数据库里进行查询,如果没有相同记录则说明信息变更过,直接放行;
4.数据库里有相同记录则将信息保存到session中,然后放行,此时页面上就可以显示你的信息了.
回复 使用道具 举报
Do1 中级黑马 2018-6-16 14:37:40
19#
本帖最后由 Do1 于 2019-11-23 00:36 编辑


Filter是一个在服务器的有过滤功能的类,当浏览器的请求发送过来时,首先会传到配置好的Fliter类中,Fliter中的doFilter方法如果没有使用chain方法的话,请求就到不到Servlet Jsp html中,如果使用了chain放行那么就会把请求放行然后服务器的处理完请求数据后再把响应给浏览器传过去,使用Filter时要实现一个Filter的接口,实现3个方法,销毁 创建 和拦截

Filter应用场景:
因为Filter也是在服务器内部的,所以这个Filter类的session req res等等都是和Servlet Jsp这些共享的,浏览器传过来的req要经过它,它也可以调用这些对象,所以Filter有点像是一个信息处理(比如编码转换)的小Servlet然后转发给主Servlet

1:编码处理,可以在Filter类先接收到req请求中的文本内容,统一进行编码处理后类似于转发形式的再传球给Servlet JSP等等应用中

2.IP地址过滤,因为req请求中携带有ip地址,因此可以指定ip段或者指定Ip放行

3.自动登录:自动登录是课堂上详细讲解的案例,它分为3个步骤

1.调用session 和requset对象   因为session是会话级别的浏览器每次请求cookie中都会携带sessionid
所以先判断session中的指定key存不存在,不存在的话去判断cookie中指定key存不存在,出于安全考虑对cookie进行用户名的二次判定,因为如果cookie被篡改了,那么你没有记住用户名的话也会自动登录这样的话,网页中的页面都拦截不了自动放行,在非管理人员情况下进入网站可能会对后台管理等数据造成威胁


回复 使用道具 举报
Filter
        概述
                可以过滤从客户端向服务器发送的请求
                具体应用
                        IP过滤
                        脏话过滤
                        自动登陆
                        响应压缩
        生命周期
                作用范围
                创建
                        服务器启动的时候创建
                销毁
                        服务器关闭的时候
                        项目从服务器中移除的时候
        使用
                编写一个类实现Filter接口
                通过配置文件配置过滤器
                        配置
                                在web.xml配置文件添加以下代码
<filter>
    <display-name>MyFilter</display-name>
    <filter-name>MyFilter</filter-name>
    <filter-class>mypackage.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/Servlet</url-pattern>
</filter-mapping>
                        <url-pattern>标签中写要过滤的路径
        Filter接口
                void init(FilterConfig filterConfig)
          Called by the web container to indicate to a filter that it is being placed into service.
                void destroy()
          Called by the web container to indicate to a filter that it is being taken out of service.
                void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          The doFilter method of the Filter is called by the container each time a request/response pair is passed through the chain due to a client request for a resource at the end of the chain.
                FilterChain接口
                         void doFilter(ServletRequest request, ServletResponse response)
          Causes the next filter in the chain to be invoked, or if the calling filter is the last filter in the chain, causes the resource at the end of the chain to be invoked.
导向下一个过滤器,如果该过滤器是链中最后一个过滤器,则导向目标资源
        FilterConfig
                String getFilterName()
          Returns the filter-name of this filter as defined in the deployment descriptor.
                String getInitParameter(String name)
          Returns a String containing the value of the named initialization parameter, or null if the parameter does not exist.
                Enumeration getInitParameterNames()
          Returns the names of the filter's initialization parameters as an Enumeration of String objects, or an empty Enumeration if the filter has no initialization parameters.
        相关配置
                <url-pattern>
                <dispatcher>
                        REQUEST默认值
                        FORWARD转发
                        INCLUDE包含
                        ERROR错误页面跳转(全局错误页面)
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马