Filter和Listener(简单介绍)。web分区学习,延续MVC和三层架构。

1.为什么需要过滤器

比如说,之前做的MVC案例,直接访问这个Servlet就可以查看信息。那登录功能就白写了。

所以,在访问资源时,需要有一个过滤器

比如说有些字符处理可以用在过滤器里。

注解里,写的路径,是要过滤的路径。别处请求这个路径资源,就会通过过滤器。

用法类似Servlet,都是实现一个接口,加注解,然后用重写的方法。 

实现的接口就是javax.servlet包里的接口。

这里不放行,在控制台只有一个输出。请求就被拦截。

 chain,这个参数使用doFilter就能转发请求。 到要访问的那个页面。

 

2  filter执行流程

放行前对request数据处理。

response等到访问到资源之后,才会有数据。

在放行后对response处理。

 

3.Filter使用细节

 3.1 拦截路径配置

 

3.2 过滤器链

怎么安排过滤器之间的顺序?

 filter1比filter2先执行,按名字的字符串比较。

 

4.案例

4.1 登录验证

怎么判断用户是否登录呢?

登录之后就放在session里存了个user对象。

如果session里面有这个对象就放行。

 创建filter。

 

不能拦截所有。如果拦截/ *,那么浏览器的css也加载不出来。注册的界面也加载不出来。

先判断访问的路径是否和登录注册相关。

 

4.2 过滤器代码

​
package com.itheima.web.filter;




@WebFilter("/*")
public class LoginFilter implements Filter {
    public void destroy() {
    }

    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
       //强转
        HttpServletRequest request=(HttpServletRequest) req;

        //判断哪些路径可以直接放行。
        String[] urls={"/Login.jsp","LoginServlet","/imgs/","/css/","/register.jsp","/registerServlet","/CheckCodeServlet"};

        //得到当前路径,然后挨个判断是否在直接放行里。
        String url = request.getRequestURL().toString();
        for(String u :urls)
        {
            if(url.contains(u)){
                //如果包含,直接放行。
                chain.doFilter(req, resp);
                return;
                //放行了,就结束这个方法。

            }

        }

        /*1.判断session里是否有user*/
        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if(user != null){
            chain.doFilter(req, resp);

        }else{
            //提示信息,尚未登录。
            request.setAttribute("Login_msg","您尚未登录");
            request.getRequestDispatcher("/Login.jsp").forward(request,resp);
        }



    }

    public void init(FilterConfig config) throws ServletException {

    }

}

​

5. Listener

对三种对象的行为进行监听,发现有举动就自动执行代码。 

5.1 使用方法

 

后面学Spring的时候深入学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值