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种方式获取的地址均不带请求参数?......&.......。既然是统一资源定位符,是标识互联网上的资源的,资源本身自然不带请求参数。

 

转载于:https://www.cnblogs.com/chy18883701161/p/11415960.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值