JavaWeb 案例5— Filter 案例

案例一:验证用户登录案例

1、需求

1、 访问一个网站的资源。验证其是否登录
2、 如果登录了,则直接放行。
3、 如果没有登录,则跳转到登录页面,提示"您尚未登录,请先登录"。

2、代码实现

 1 import javax.servlet.*;
 2 import javax.servlet.annotation.WebFilter;
 3 import javax.servlet.http.HttpServletRequest;
 4 import java.io.IOException;
 5 
 6 @WebFilter("/*") // 拦截所有的访问
 7 public class LoginFilter implements Filter {
 8     public void destroy() {
 9     }
10 
11     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
12         // 强转为HttpServletRequest 对象
13 
14         HttpServletRequest request = (HttpServletRequest) req;
15         // 1 .获取资源请求路径
16         String uri = request.getRequestURI();
17 
18         // 2 判断是否包含登录相关资源路径
19         // login.jsp,要排除图片,验证码等资源
20         if(uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")) {
21             // 包含,用户想登录,放行与登录相关的资源
22             chain.doFilter(req, resp);
23         } else {
24             // 不包含,验证用户是否登录
25             // 3 从session 中获取 user
26             Object user = request.getSession().getAttribute("user");
27 
28             if(user != null) {
29                 // 登录成功,放行
30                 chain.doFilter(req,resp);
31             } else {
32                 request.setAttribute("login_msg","尚未登录,请登录");
33                 request.getRequestDispatcher("/login.jsp").forward(request,resp);
34             }
35         }
36 
37 
38     }
39 
40     public void init(FilterConfig config) throws ServletException {
41 
42     }
43 
44 }

3、

案例二:敏感词汇过滤案例

1、需求:

1、 对day17_case案例录入的数据进行敏感词汇过滤
2、 敏感词汇参考 src路径下的《敏感词汇.txt》
3、 如果是敏感词汇,替换为 ***

2、分析

1、 对request对象进行增强。增强获取参数相关方法
2、 放行。传递代理对象

3、代码实现

 1 import org.springframework.cglib.proxy.InvocationHandler;
 2 import org.springframework.cglib.proxy.Proxy;
 3 
 4 import javax.servlet.*;
 5 import javax.servlet.annotation.WebFilter;
 6 import java.io.BufferedReader;
 7 import java.io.FileReader;
 8 import java.io.IOException;
 9 import java.lang.reflect.Method;
10 import java.util.ArrayList;
11 import java.util.List;
12 
13 /**
14  * 敏感词汇过滤器
15  */
16 @WebFilter("/*")
17 public class SensitiveWordsFilter implements Filter {
18 
19 
20     public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
21         // 1 创建代理对象,增强 getparameter 方法
22         ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
23             @Override
24             public Object invoke(Object o, Method method, Object[] args) throws Throwable {
25 
26                 // 增强 getparameter 方法
27                 // 判断是否是该方法
28                 if(method.getName().equals("getParameter")) {
29                     // 增强返回值
30                     // 获取返回值
31                     String value = (String) method.invoke(req,args);
32 
33                     if(value != null) {
34                         for (String str : list) {
35                             if(value.contains(str)){
36                                 value = value.replaceAll(str,"***");
37                             }
38                         }
39                     }
40 
41                     return  value;
42                 }
43 
44                 return method.invoke(req,args);
45             }
46         });
47         // 2 放行,传递增强的代理对象
48 
49         chain.doFilter(proxy_req, resp);
50     }
51 
52 
53     private List<String> list = new ArrayList<String>();  // 敏感词汇集合
54     public void init(FilterConfig config) throws ServletException {
55 
56 
57         try {
58             // 1 加载文件
59             // 获取文件的真实路径
60             ServletContext servletContext = config.getServletContext();
61             String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
62             // 2 读取文件
63 
64             BufferedReader br = new BufferedReader(new FileReader(realPath));
65 
66             // 3 将文件的每一行添加到 list 中
67 
68             String line = null;
69             while((line =  br.readLine()) != null) {
70                 list.add(line);
71             }
72 
73             br.close();
74 
75             System.out.println(list);
76         } catch (Exception e) {
77             e.printStackTrace();
78         }
79 
80     }
81 
82 
83     public void destroy() {
84     }
85 
86 }

4、

5、

案例三:使用字符过滤器解决乱码

  字符过滤器:

 1 /**
 2  * 解决中文乱码
 3  */
 4 public class CharacterFilter implements Filter {
 5 
 6     private String charset = "UTF-8";
 7 
 8     public CharacterFilter() {}
 9 
10     @Override
11     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
12             throws IOException, ServletException {
13         // 设置请求响应编码
14         request.setCharacterEncoding(charset);
15         response.setCharacterEncoding(charset);
16         // 将HttpSerlvetRequest替换成我们包装后的。
17         chain.doFilter(new MyHttpServletRequestWapper((HttpServletRequest) request), response);
18     }
19 
20     /**
21      * 创建一个HttpServletRequest的包装类
22      * 
23      * @author njf
24      *
25      */
26     static class MyHttpServletRequestWapper extends HttpServletRequestWrapper {
27 
28         private HttpServletRequest request;
29 
30         public MyHttpServletRequestWapper(HttpServletRequest request) {
31             super(request);
32             this.request = request;
33         }
34 
35         @Override
36         public String getParameter(String name) {
37             // 如果是get请求
38             if ("get".equalsIgnoreCase(request.getMethod())) {
39                 // 先获取原来的乱码值
40                 String value = super.getParameter(name);
41                 if (value != null) {
42                     try {
43                         // 然后编码,解码
44                         value = new String(value.getBytes("ISO-8859-1"),
45                                 request.getCharacterEncoding());
46                     } catch (UnsupportedEncodingException e) {
47                         e.printStackTrace();
48                     }
49                 }
50                 return value;
51             } else {
52                 return super.getParameter(name);
53             }
54         }
55 
56     }
57 
58     @Override
59     public void init(FilterConfig fConfig) throws ServletException {
60         // 获取初始化配置的编码
61         String t = fConfig.getInitParameter("charset");
62         if (t != null) {
63             charset = t;
64         }
65     }
66 
67     @Override
68     public void destroy() {}
69 
70 }

  web.xml 中配置信息:

  <filter>
        <filter-name>CharacterFilter</filter-name>
        <filter-class>com.njf.filter.CharacterFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
原文地址:https://www.cnblogs.com/niujifei/p/15160787.html