一:粗粒度权限控制(拦截是否登录、拦截用户名admin权限)

    思路:过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查ServletResponse对象,修改响应头或者响应的内容,所以判断是否进入那个页面 就应该写在Filter

UserFilter

 1 public class UserFilter implements Filter {
 2     public void destroy() {}
 3     public void doFilter(ServletRequest request, ServletResponse response,
 4             FilterChain chain) throws IOException, ServletException {
 5         /*
 6          * 1. 得到session
 7          * 2. 判断session域中是否存在admin,如果存在,放行
 8          * 3. 判断session域中是否存在username,如果存在,放行,否则打回到login.jsp,并告诉它不要瞎留达
 9          */
10         HttpServletRequest req = (HttpServletRequest) request;
11         String name = (String)req.getSession().getAttribute("admin");
12         if(name != null) {
13             chain.doFilter(request, response);
14             return;
15         }
16
17         name = (String)req.getSession().getAttribute("username");
18         if(name != null) {
19             chain.doFilter(request, response);
20         } else {
21             req.setAttribute("msg", "您啥都不是,不要瞎溜达!");
22             req.getRequestDispatcher("/login.jsp").forward(request, response);
23         }
24     }
25     public void init(FilterConfig fConfig) throws ServletException { }
26 }

View Code

AdminFilter.java

 1 public class AdminFilter implements Filter {
 2     public void destroy() {}
 3     public void doFilter(ServletRequest request, ServletResponse response,
 4             FilterChain chain) throws IOException, ServletException {
 5         /*
 6          * 1. 得到session
 7          * 2. 判断session域中是否存在admin,如果存在,放行
 8          * 3. 判断session域中是否存在username,如果存在,放行,否则打回到login.jsp,并告诉它不要瞎留达
 9          */
10         HttpServletRequest req = (HttpServletRequest) request;
11         String name = (String)req.getSession().getAttribute("admin");
12         if(name != null) {
13             chain.doFilter(request, response);
14         } else {
15             req.setAttribute("msg", "您可能是个啥,但肯定不是管理员!");
16             req.getRequestDispatcher("/login.jsp").forward(request, response);
17         }
18     }
19
20 }

View Code

LoginServlet

 1 public class LoginServlet extends HttpServlet {
 2     public void doPost(HttpServletRequest request, HttpServletResponse response)
 3             throws ServletException, IOException {
 4         request.setCharacterEncoding("utf-8");
 5         response.setContentType("text/html;charset=utf-8");
 6
 7         /*
 8          * 1. 获取用户名
 9          * 2. 判断用户名中是否包含itcast
10          *   3. 如果包含,就是管理员
11          *   4. 如果不包含,就是普通会员
12          * 5. 要把登录的用户名称保存到session中
13          * 6. 转发到index.jsp
14          */
15         String username = request.getParameter("username");
16         if(username.contains("itcast")) {
17             request.getSession().setAttribute("admin", username);
18         } else {
19             request.getSession().setAttribute("username", username);
20         }
21         request.getRequestDispatcher("/index.jsp").forward(request, response);
22     }
23 }

View Code

二: 分ip统计网站的访问次数

统计工作需要在所有资源之前都执行,那么就可以放到Filter中了。

我们这个过滤器不打算做拦截操作!因为我们只是用来做统计的。

用什么东西来装载统计的数据。Map<String,Integer>

整个网站只需要一个Map即可!

Map什么时候创建(使用ServletContextListener,在服务器启动时完成创建,并只在到ServletContext中),Map保存到哪里!(Map保存到ServletContext中!!!)

  • Map需要在Filter中用来保存数据

  • Map需要在页面使用,打印Map中的数据

AListener.java

 1 public class AListener implements ServletContextListener {
 2     /**
 3      * 在服务器启动时创建Map,保存到ServletContext
 4      */
 5     public void contextInitialized(ServletContextEvent sce) {
 6         // 创建Map
 7         Map<String,Integer> map = new LinkedHashMap<String,Integer>();
 8         // 得到ServletContext
 9         ServletContext application = sce.getServletContext();
10         // 把map保存到application中
11         application.setAttribute("map", map);
12     }
13
14
15     public void contextDestroyed(ServletContextEvent sce) {
16     }
17 }

View Code

AFilter.java

 1 public class AFilter implements Filter {
 2     private FilterConfig config;
 3     public void destroy() {
 4     }
 5     public void doFilter(ServletRequest request, ServletResponse response,
 6             FilterChain chain) throws IOException, ServletException {
 7         /*
 8          * 1. 得到application中的map
 9          * 2. 从request中获取当前客户端的ip地址
10          * 3. 查看map中是否存在这个ip对应访问次数,如果存在,把次数+1再保存回去
11          * 4. 如果不存在这个ip,那么说明是第一次访问本站,设置访问次数为1
12          */
13         /*
14          * 1. 得到appliction
15          */
16         ServletContext app = config.getServletContext();
17         Map<String,Integer> map = (Map<String, Integer>) app.getAttribute("map");
18         /*
19          * 2. 获取客户端的ip地址
20          */
21         String ip = request.getRemoteAddr();
22         /*
23          * 3. 进行判断
24          */
25         if(map.containsKey(ip)) {//这个ip在map中存在,说明不是第一次访问
26             int cnt = map.get(ip);
27             map.put(ip, cnt+1);
28         } else {//这个ip在map中不存在,说明是第一次访问
29             map.put(ip, 1);
30         }
31         app.setAttribute("map", map);//把map再放回到app中
32
33         chain.doFilter(request, response);//肯定放行
34     }
35
36
37     /**
38      * 在服务器启动时就会执行本方法,而且本方法只执行一次!
39      */
40     public void init(FilterConfig fConfig) throws ServletException {
41         this.config = fConfig;
42     }
43 }

View Code

show.jsp

1 <table align="center" border="1" width="50%">
2   <tr><td>ip</td><td>次数</td></tr>
3    <c:forEach items="${applicationScope.map}"  var="entry">
4      <tr>
5      <td>${entry.key }</td>
6      <td>${entry.value }</td>
7      </tr>
8    </c:forEach>
9 </table>

View Code


三:解决全站字符乱码(POST和GET中文编码问题)

RequestFilter

 1     public void doFilter(ServletRequest request,  ServletResponse response, FilterChain chain) throws  IOException, ServletException {
 2          request.setCharacterEncoding("utf-8");
 3
 4          HttpServletRequest req =  (HttpServletRequest)request;
 5          if(req.getMethod().equals("GET")){
 6               EncodingRequest er = new  EncodingRequest(req);
 7               chain.doFilter(er, response);
 8          }else if(req.getMethod().equals("POST")){
 9               chain.doFilter(request, response);
10          }
11
12      }

View Code

EncodingServlet

1     public void doPost(HttpServletRequest request,  HttpServletResponse response)
2               throws ServletException, IOException {
3           response.setContentType("text/html;charset=utf-8");
4          String username=  request.getParameter("username");
5          response.getWriter().print(username);
6      }
7  

View Code

EncodingRequest

 1 public class EncodingRequest  extends  HttpServletRequestWrapper{
 2      private HttpServletRequest req;
 3      public EncodingRequest(HttpServletRequest request)  {
 4          super(request);
 5          // TODO Auto-generated constructor stub
 6          this.req=request;
 7      }
 8      public String getParameter(String name){
 9          String value = req.getParameter(name);
10          try {
11          value =new  String(value.getBytes("iso-8859-1"),"utf-8");
12
13          } catch (UnsupportedEncodingException e) {
14               // TODO Auto-generated catch block
15               e.printStackTrace();
16          }
17          return value;
18      }
19 }

View Code

效果图:

         

转载于:https://www.cnblogs.com/Yzengxin/p/11204585.html

JavaWeb过滤器的应用相关推荐

  1. javaweb过滤器_JavaWeb技术(2):SpringMVC中的Filter

    Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作: 过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用: package 你可 ...

  2. JavaWEB过滤器和监听器技术

    过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...

  3. JavaWeb过滤器(Filter)

    开发工具与关键技术:javaWeb,过滤器(Filter) 撰写时间:2019-05-26 总结下述所有表达 第一点:过滤器是什么 第二点:客户端到服务端的流程 第三点:过滤器如何编写 第四点:Fil ...

  4. JavaWeb过滤器解决中文乱码问题

    文章目录 前言 一.创建过滤器的类 二.实现接口 1.EncodingFilter implements Filter 2.web.xml注册过滤器 3. 重新运行项目即可 前言 Javaweb三大组 ...

  5. struts2 javaweb 过滤器、监听器 拦截器 原理

    转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...

  6. JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)

            注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示.....  目录 基本介绍 过滤器原理 过滤器(Filter)接口 ...

  7. javaweb项目中的过滤器的使用

    翻阅博客园的的时候,看到两篇关于javaweb过滤器的帖子写的很好,这里备忘一下: 过滤器基础:http://www.cnblogs.com/xdp-gacl/p/3948353.html 获取器案例 ...

  8. JavaWeb Filter 过滤器

    参考:JavaWeb过滤器(Filter)详解 1.简介 顾名思义就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊 ...

  9. java中高级大公司多线程面试题

    点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...

最新文章

  1. 工作能力强的人有哪些共同特征?
  2. MySQL 5.1 分区技术初探(一)
  3. CentOS7.5 -- Ansible部署与应用
  4. Kinect 动作识别组件概要设计
  5. ORACLE纯SQL实现多行合并一行
  6. CF1325D:Ehab the Xorcist(位运算)
  7. 1012 The Best Rank (25)
  8. 哈希表的最差复杂度是n2_给定数组A []和数字X,请检查A []中是否有对X | 使用哈希O(n)时间复杂度| 套装1...
  9. bzoj2463 [中山市选2009]谁能赢呢?
  10. 【吴恩达机器学习】学习笔记——1.3机器学习的定义
  11. Maven(一):Maven安装及Eclipse配置
  12. csv数据源的创建(一)
  13. gcc -l:手动添加链接库
  14. Linux下使用libevent库实现服务器端编程
  15. 电力前沿:Hightopo 助力贵州院打造智慧能源生态系统
  16. 阿里巴巴官方:明年今日马云将不再担任董事局主席
  17. 有关世界上第一台计算机的知识,计算机基础知识 1、世界上第一台电子计算机诞生于 A) 1943年 B) 1946年.doc...
  18. AutoCAD Civil 3D贴图
  19. 小白对于Linux的学习
  20. 整理任正非思想:英雄好汉站出来-1995

热门文章

  1. 【DB2】NULLS LAST与NULLS FIRST
  2. 07_Python的控制判断循环语句1(if判断for循环)_Python编程之路
  3. 软件工程网络15个人阅读作业1(201521123062 杨钧宇)
  4. Oracle视图分类及各种操作讲解(超级好文)
  5. css常用或不熟悉的
  6. 动态生成ContextMenuStrip
  7. vue-cli3.0项目的安装、创建和启动
  8. 零基础带你学习MySQL—查询数据库(二)
  9. JavaScript学习(十五)—内部样式与外部样式的修改与设置
  10. win10我的电脑在哪里找到