JavaWeb的学习--Filter

一、过滤器Filter

1.filter的简介

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理

2.快速入门

步骤:

1)编写一个过滤器的类实现Filter接口

2)实现接口中尚未实现的方法(着重实现doFilter方法)

3)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)

 

3.Filter的API详解

(1)filter生命周期及其与生命周期相关的方法

Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法

init(Filterconfig):代表filter对象初始化方法 filter对象创建时执行

doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法

destory():代表是filter销毁方法 当filter对象销毁时执行该方法

 

Filter对象的生命周期:

Filter何时创建:服务器启动时就创建该filter对象

Filter何时销毁:服务器关闭时filter销毁

 

(2)Filter的AP详解

1)init(FilterConfig)

其中参数config代表 该Filter对象的配置信息的对象,内部封装是该filter的配置信息。

2)destory()方法

filter对象销毁时执行

3)doFilter方法

doFilter(ServletRequest,ServletResponse,FilterChain)

其中的参数:

ServletRequest/ServletResponse:每次在执行doFilter方法时 web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request个该response就是在访问目标资源的service方法时的request和response。

FilterChain:过滤器链对象,通过该对象的doFilter方法可以放行该请求

 

/**
 * Filter过滤器
 * init(FilterConfig):代表filter对象初始化方法 filter对象创建时执行
 * doFilter(ServletRequest,ServletResponse,FilterChain):
 * 代表filter执行过滤的核心方法,如果某资源已经被配置到这个filter进行过滤的话,
 * 那么每次访问该资源都会执行这个方法
 * destory():代表filter销毁方法 当filter对象销毁时执行该方法
 * 
 * Filter对象的生命周期:
 * 何时创建:服务器启动时,创建filter对象
 * 何时销毁:服务器关闭时,filter销毁
 * @author vanguard
 *
 */
public class QuickFilter01 implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        //获得filter的名称
        String filterName = filterConfig.getFilterName();
        System.out.println(filterName);
        //获得ServletContext对象
        ServletContext context = filterConfig.getServletContext();
        //获得初始化配置信息
        String initParameter = filterConfig.getInitParameter("aaa");
        System.out.println(initParameter);
    
        System.out.println("filter init...");
    }
    
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("filter01 running...");
        //放行
        chain.doFilter(arg0, arg1);
    }
    
    @Override
    public void destroy() {
        System.out.println("filter destory...");
    }    
}

 


4.Filter的配置


url-pattern配置时

1)完全匹配  /sertvle1

2)目录匹配  /aaa/bbb/* ----最多的

/user/*:访问前台的资源进入此过滤器

/admin/*:访问后台的资源时执行此过滤器

3)扩展名匹配  *.abc  *.jsp

 

注意:url-pattern可以使用servlet-name替代,也可以混用

 

 

dispatcher:访问的方式(了解)

REQUEST:默认值,代表直接访问某个资源时执行filter

FORWARD:转发时才执行filter

INCLUDE: 包含资源时执行filter

ERROR:发生错误时 进行跳转是执行filter

 

 

 

总结Filter的作用?

1)公共代码的提取

2)可以对request和response中的方法进行增强(装饰者模式/动态代理)

3)进行权限控制

自动登录分析:

 

 代码实现:

 

 1 /**
 2  * 过滤器实现自动登录
 3  * @author vanguard
 4  *
 5  */
 6 public class AutoLoginFilter implements Filter {
 7 
 8     @Override
 9     public void doFilter(ServletRequest request, ServletResponse response,
10             FilterChain chain) throws IOException, ServletException {
11         
12         HttpServletResponse res = (HttpServletResponse) response;
13         //解决全局中文乱码问题
14         //POST方式
15         request.setCharacterEncoding("UTF-8");
16         //在传递request之前对reqeust的getParameter()方法进行增强
17         /**
18          * 装饰者模式(包装)
19          * 1、增强类和被增强类要实现统一接口
20          * 2. 在增强内中传入被增强的类
21          * 3. 需要增强的方法,不需要增强的方法调用被增强对象的方法
22          */
23         //被增强的对象
24         HttpServletRequest req = (HttpServletRequest) request;
25         //增强的对象
26         EnhanceRequest enhanceRequest = new EnhanceRequest(req);
27         
28         HttpSession session = req.getSession();
29         //1. 获取客户端携带的cookie
30         Cookie[] cookies = req.getCookies();
31         String username_cookie = null;
32         String password_cookie = null;
33         if(cookies != null) {
34             //2. 遍历cookie数组
35             for(Cookie cookie : cookies) {
36                 if(cookie.getName().equals("username")) {
37                     username_cookie = cookie.getValue();
38                     //中文用户名进行解码
39                     username_cookie = URLDecoder.decode(username_cookie, "UTF-8");
40                 }
41                 if(cookie.getName().equals("password")) {
42                     password_cookie = cookie.getValue();
43                 }
44             }
45         }
46         if(username_cookie !=null && password_cookie != null) {
47             //3. 用户登录
48             UserService service = new UserService();
49             User user = null;
50             try {
51                 user = service.login(username_cookie, password_cookie);
52             } catch (SQLException e) {
53                 
54                 e.printStackTrace();
55             }
56             //4. 将user存入session域中
57             session.setAttribute("user", user);
58         }
59         //5. 放行
60         chain.doFilter(enhanceRequest, res);
61     }
62     
63     @Override
64     public void destroy() {
65     }
66 
67 
68     @Override
69     public void init(FilterConfig arg0) throws ServletException {
70     }
71 }

 

 

 

解决全局乱码

在传递request之前对reqeust的getParameter()方法进行增强

  装饰者模式(包装)

  1、增强类和被增强类要实现统一接口

  2. 在增强内中传入被增强的类

  3. 需要增强的方法,不需要增强的方法调用被增强对象的方法

代码实现:

 

 1 /**
 2  * 解决全局乱码问题
 3  * 在传递request之前对reqeust的getParameter()方法进行增强
 4  * 装饰者模式(包装)
 5  * 1、增强类和被增强类要实现统一接口
 6  * 2. 在增强内中传入被增强的类
 7  * 3. 需要增强的方法,不需要增强的方法调用被增强对象的方法
 8  * @author vanguard
 9  *
10  */
11 public class EncodingFilter implements Filter {
12 
13 
14     @Override
15     public void doFilter(ServletRequest request, ServletResponse response,
16             FilterChain chain) throws IOException, ServletException {
17         //POST方式
18         request.setCharacterEncoding("UTF-8");
19         //在传递request之前对reqeust的getParameter()方法进行增强
20         /**
21          * 装饰者模式(包装)
22          * 1、增强类和被增强类要实现统一接口
23          * 2. 在增强内中传入被增强的类
24          * 3. 需要增强的方法,不需要增强的方法调用被增强对象的方法
25          */
26         //被增强的对象
27         HttpServletRequest req = (HttpServletRequest) request;
28         //增强的对象
29         EnhanceRequest enhanceRequest = new EnhanceRequest(req);
30         //放行
31         chain.doFilter(enhanceRequest, response);
32     }
33 
34     @Override
35     public void destroy() {
36     }
37     @Override
38     public void init(FilterConfig arg0) throws ServletException {
39     }
40 
41 }

 

 1 /**
 2  * 装饰者模式
 3  * 增强的Request类
 4  * @author vanguard
 5  *
 6  */
 7 class EnhanceRequest extends HttpServletRequestWrapper  {
 8     private HttpServletRequest request;
 9     
10     public EnhanceRequest(HttpServletRequest request) {
11         super(request);
12         this.request = request;
13     }
14     //重写要增强的方法
15     @Override
16     public String getParameter(String name) {
17         String parameter = request.getParameter(name);
18         if(parameter != null) {
19             try {
20                 parameter = new String(parameter.getBytes("ISO-8859-1"), "UTF-8");
21             } catch (UnsupportedEncodingException e) {
22                 
23                 e.printStackTrace();
24             }
25         }
26         return parameter;
27     }
28     
29     @Override
30     public Map<String, String[]> getParameterMap() {
31         Map<String, String[]> parameterMap = request.getParameterMap();
32         for(String key : parameterMap.keySet()) {
33             String[] parameters = parameterMap.get(key);
34             for(int i = 0; i < parameters.length; i++) {
35                 String parameter = null;
36                 if(parameters[i] != null) {
37                     try {
38                         parameter = new String(parameters[i].getBytes("ISO-8859-1"), "UTF-8");
39                     } catch (UnsupportedEncodingException e) {
40                         
41                         e.printStackTrace();
42                     }
43                 }
44                 parameters[i] = parameter;
45             }47         }
48         return parameterMap;
49     }
50 }

 

 

 

posted @ 2017-08-20 22:06  Vanguard  阅读(296)  评论(0)    收藏  举报