• 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>
  • 相关阅读:
    第四章5
    第四章4
    第四章3
    第四章2
    第四章1
    第四章例4-8
    第四章例4-7
    第四章例4-6
    第四章例4-5
    第四章例4-4
  • 原文地址:https://www.cnblogs.com/niujifei/p/15160787.html
Copyright © 2020-2023  润新知