zoukankan      html  css  js  c++  java
  • JavaWeb Filter

     

    Servlet用于处理用户请求,Filter(过滤器)用于拦截request、response,对request、response对象进行修改,在Servlet处理请求前后实现某些功能。

    Filter接口

    Filter是一个实现了javax.servlet.Filter接口的类。

    Filter接口中的方法:

    • init(FilterConfig  filterFonfig)    //初始化Filter
    • doFilter(ServletRequest request, ServletResponse response, FilterChain  chain)     //拦截、过滤。chain对象表示Filter链。此方法是Filter的关键方法。
    • destroy()   //在web服务器移除Filter对象之前调用,释放Filter对象占用的资源
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
            //......    //去的时候拦截,做一些处理
            chain.doFilter(req, resp);  //放行
            //......    //回来的时候拦截,做一些处理
        }

    Filter示例   统一全站编码

     1 @WebFilter("/*")
     2 public class HandlerFilter implements Filter {
     3     public void init(FilterConfig config){
     4     }
     5 
     6     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
     7         req.setCharacterEncoding("utf-8");
     8         resp.setContentType("text/html;charset=utf-8");
     9         chain.doFilter(req, resp);
    10     }
    11 
    12     public void destroy() {
    13     }
    14 
    15 }

    Filter的配置

    Filter的配置方式和Servlet的配置方式差不多。

    (1)xml配置

      <filter>
            <filter-name>handlerFilter</filter-name>
            <filter-class>filter.HandlerFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>handlerFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

    如果有多个Filter同时拦截某个请求,这些Filter会组成一个FilterChain,拦截时,在xml配置中位置靠前的Filter先拦截。

    (2)注解配置

    @WebFilter("/*")
    @WebFilter(filterName = "handlerFilter",urlPatterns = "/*")

    Filter初始参数

    在xml中配置Filter的初始参数:

    <filter>
            <filter-name>handlerFilter</filter-name>
            <filter-class>filter.HandlerFilter</filter-class>
            <init-param>
                <param-name>name</param-name>
                <param-value>张三</param-value>
            </init-param>
            <init-param>
                <param-name>age</param-name>
                <param-value>20</param-value>
            </init-param>
        </filter>

    或者在注解中配置:

    @WebFilter(
            filterName = "handlerFilter",
            urlPatterns = "/*",
            initParams = {@WebInitParam(name = "name", value = "张三"),@WebInitParam(name="age",value = "12")}
            )

    我们注意到Filter的init(FilterConfig config)有参数FilterConfig,Web服务器创建此Filter的实例时,会自动把xml或注解中这个Filter的初始参数以FilterConfig对象的形式注入。

    在Filter中获取初始参数:

     1 public class HandlerFilter implements Filter {
     2     private FilterConfig filterConfig;   //需要创建一个成员变量
     3     public void init(FilterConfig config){
     4         this.filterConfig = config;  //需要我们手动初始化
     5     }
     6 
     7     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
     8         //获取单个初始参数的值
     9         String name = filterConfig.getInitParameter("name");  //返回值是String,不存在该参数时返回null
    10         String age = filterConfig.getInitParameter("age");
    11         System.out.println(name);
    12         System.out.println(age);
    13 
    14         //遍历
    15         Enumeration<String> initParameterNames = filterConfig.getInitParameterNames();
    16         while (initParameterNames.hasMoreElements()){
    17             String paramName = initParameterNames.nextElement();
    18             String paramValue = filterConfig.getInitParameter(paramName);
    19             System.out.println(paramValue);
    20         }
    21 
    22         chain.doFilter(req, resp);
    23     }
    24 
    25     public void destroy() {
    26     }
    27 
    28 }

      

    使用Filter检查用户权限

    用户要访问、下载某些资源,我们常常要检查用户权限是否足够,有的是检查用户是否已登录。

    我们可以在在session域中放入用户权限|状态,比如session.setAttrbute("group", "vip") ,使用Filter检查用户权限 | 是否已登录,如果权限够了,不做处理,放行。如果权限不够,使用request转发或response重定向转到提示页面,也可以response直接输出提示信息。

    Filter做前后增强,Servlet负责处理核心业务,业务逻辑不杂糅在一起,类似于Spring AOP。

    有时候需要获取所请求的URL,根据URL来判断,比如...../resource/vip/........,普通用户不能访问里面的资源。

     1 String requestURI = request.getRequestURI();
     2      /*
     3      String类型,所请求资源的相对地址,/项目名/页面
     4      比如 /StudentManagerSystem/handlerServlet
     5       */
     6 
     7 
     8      StringBuffer requestURL = request.getRequestURL();
     9      /*
    10      StringBuffer类型,所请求资源的绝对地址
    11      比如 http://localhost:8080/StudentManagerSystem/handlerServlet
    12       */

    这2种方式获取的地址均不带请求参数?......&.......。既然是统一资源定位符,是标识互联网上的资源的,资源本身自然不带请求参数。

  • 相关阅读:
    [RxSwift教程]14、其他操作符:delay、materialize、timeout等
    [RxSwift教程]13、连接操作符:connect、publish、replay、multicast
    Java虚拟机类加载机制及双亲委派模式分析
    面试系列-如何设计一个类
    谈谈 MySQL 的 JSON 数据类型
    Java 多线程编程(2-异步中包含同步)
    还堵在高速路上吗?带你进入Scratch世界带你飞
    SQL Server SSIS相关介绍
    SQL Server开启READ_COMMITTED_SNAPSHOT
    SqlServer中select语句引起的死锁
  • 原文地址:https://www.cnblogs.com/chy18883701161/p/11415960.html
Copyright © 2011-2022 走看看