小滴课堂-学习笔记: Javaweb开发核心知识之Filter过滤器

33 篇文章 0 订阅
14 篇文章 0 订阅

logo 愿景:"让编程不再难学,让技术与生活更加有趣"


更多架构课程请访问 xdclass.net

目录

第1集 初识Servlet过滤器Filter

第2集 Servlet Filter 配置参数详解

第3集 过滤器实战之Filter用户登录访问个人页面拦截

干货文档


第1集 初识Servlet过滤器Filter

简介:讲解JavaWeb核心知识之过滤器Filter

  • 什么是过滤器:(检验是否符合要求,或者 对内容做二次处理,设置编码响应等)

    • filter简单理解:人--->检票员(filter)---> 景点

     

  • Servlet里面的过滤器作用

    • 动态地拦截请求和响应,变换或使用包含在请求或响应中的信息
    • 在客户端的请求访问后端资源之前,拦截这些请求。
    • 在服务器的响应发送回客户端之前,处理这些响应。

     

  • Filter的生命周期

    • init(FilterConfig filterConfig) //只容器初始化的时候调用一次,即应用启动的时候加载一次
    • doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 只要命中过滤规则就触发,可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法, 即是否让目标资源执行
    • destroy() //只容器销毁的时候调用一次,即应用停止的时候调用一次

     

  • 元注解: @WebFilter




//该Filter是否支持异步操作模式
asyncSupported      
​
//指定Filter对那种dispatcher模式进行过滤 该属性支持 Async,Error Forward,include,request  
dispatcherType  
​
//Filter 显示的名称
displayName    
​
//Filter的名称
filterName    
​
//Filter的配置参数
initParams    
​
//过滤的Servlet可以指定多个,表示对这几个特定的的servlet 进行过滤
servletNames    
​
//指定 Filter拦截的 URL,和上面的servletNames配置一样,用*可以表示通配符,但是不用字母后加*,应该按照模块划分,比如/user/*
urlPatterns/value    


  • 过滤器拦截实战



@WebFilter(filterName = "xxx",urlPatterns = {"/*"})
public class CustomFilter implements Filter {
​
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
        System.out.println("CustomFilter init ");
    
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
        System.out.println("CustomFilter doFilter ");
    
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=utf-8");
    
        //让请求继续往下走
        chain.doFilter(request,response);
    }
    
    @Override
    public void destroy() {
    
        System.out.println("CustomFilter destroy ");
    }
}



第2集 Servlet Filter 配置参数详解

简介:讲解JavaWeb核心知识之过滤器Filter

  • FilterConfig类:

    • 过滤器配置类,可以通过这个获取过滤器基本信息

     

  • dispatcherTypes 参数

    • 指定Filter对那种dispatcher模式进行过滤,不符合的则不进行过滤

      • REQUEST:默认值,浏览器直接请求的资源会被过滤器拦截
      • FORWARD:转发访问资源会被过滤器拦截
      • INCLUDE:包含访问资源
      • ERROR:错误跳转资源
      • ASYNC:异步访问资源
  • 实操




@WebFilter(filterName = "xxx",urlPatterns = {"/*"},initParams = {
        @WebInitParam(name = "encoding",value = "UTF-8"),
        @WebInitParam(name = "loginPage",value = "/login.jsp"),
},dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
​
public class CustomFilter implements Filter {
    private FilterConfig filterConfig;
​
    private String encoding;
    
    private String loginPage;
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
        System.out.println("CustomFilter init ");
        this.filterConfig = filterConfig;
    
        String filterName = filterConfig.getFilterName();
        System.out.println("filterName="+filterName);
        this.encoding = filterConfig.getInitParameter("encoding");
        this.loginPage = filterConfig.getInitParameter("loginPage");
    }
    
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
        System.out.println("CustomFilter doFilter ");
    
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset=utf-8");
    
        //让请求继续往下走
        chain.doFilter(request,response);
    }
    
    @Override
    public void destroy() {
    
        System.out.println("CustomFilter destroy ");
    }
}


 

第3集 过滤器实战之Filter用户登录访问个人页面拦截

简介:过滤实战之用户登录访问订单页面

  • 开发登录Servlet



   @Override
      protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​
          String name = req.getParameter("name");
          String pwd = req.getParameter("pwd");
      
          if(name.equals("xdclass") && pwd.equals("123")){
      
              User user = new User();
              user.setId(121);
              user.setName(name);
              user.setHost("xdclass.net");
              req.getSession().setAttribute("loginUser",user);
              req.getRequestDispatcher("/WEB-INF/user.jsp").forward(req,resp);
      
          }else{
              req.setAttribute("msg","账号密码错误");
              req.getRequestDispatcher("/login.jsp").forward(req,resp);
          }
​
  
​
      }
  • 开发登录过滤器

    
    
    
    @WebFilter(filterName = "loginFilter",urlPatterns = {"/user/*","/order/*"},initParams = {
            @WebInitParam(name = "encoding",value = "UTF-8"),
            @WebInitParam(name = "loginPage",value = "/login.jsp"),
    })
    ​
    public class LoginFilter implements Filter {
    ​
        private FilterConfig filterConfig;
        
        private String encoding;
        
        private String loginPage;
    ​
    @Override
      public void init(FilterConfig filterConfig) throws ServletException {
      
          System.out.println("CustomFilter init ");
          this.filterConfig = filterConfig;
      
          this.encoding = filterConfig.getInitParameter("encoding");
          this.loginPage = filterConfig.getInitParameter("loginPage");
      
      }
      
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
      
          System.out.println("CustomFilter doFilter ");
      
          request.setCharacterEncoding(encoding);
          response.setCharacterEncoding(encoding);
          response.setContentType("text/html;charset=utf-8");
      
          HttpServletRequest httpServletRequest = (HttpServletRequest)request;
          HttpServletResponse httpServletResponse = (HttpServletResponse)response;
      
          //session里面有用户信息
          if(httpServletRequest.getSession().getAttribute("loginUser") !=null){
      
              chain.doFilter(request,response);
      
          }else {
              httpServletRequest.setAttribute("msg","非法访问,请登录");
              httpServletRequest.getRequestDispatcher(loginPage).forward(httpServletRequest,httpServletResponse);
          }
      
      }
    @Override
      public void destroy() {
      
          System.out.println("CustomFilter destroy ");
      }
      
        }
    

     

  • 登录界面 login.jsp

    
    
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    ​
    <head>
        <title>Title</title>
    </head>
    ​
    <body>
     <form action="<%=request.getContextPath()%>/loginServlet" method="post">
    名称:<input type="text" name="name"/>
    ​
    <br/>
    密码:<input type="password" name="pwd"/>
    ​
    <input type="submit" value="登录">
    ​
    消息提示 ${msg}
    ​
    </form>
    ​
    </body>
    </html>
    
    
    

     

  • 用户信息界面/user.jsp

    
    
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
      id:${loginUser.id}
      <br>
      name:${loginUser.name}
    ​
      <a href="/logout_servlet">退出</a>
      </body>
      </html>
    
    
    

     

干货文档

                                                        关注公众号发送:“CSDN干货文档”  即可领取

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dev666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值