JavaWeb过滤器的应用
一:粗粒度权限控制(拦截是否登录、拦截用户名admin权限)
思路:过滤器能够在Web组件被调用之前检查ServletRequest对象,修改请求头或者请求的正文;过滤器能够在被Web组件调用之后检查ServletResponse对象,修改响应头或者响应的内容,所以判断是否进入那个页面 就应该写在Filter
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
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
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中的数据
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
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中文编码问题)
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
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
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过滤器的应用相关推荐
- javaweb过滤器_JavaWeb技术(2):SpringMVC中的Filter
Filter顾名思义就是过滤器,在JavaWeb体系中,他在服务端,卡在请求/响应与Servlet之间做一些操作: 过滤器相关的类的顶层接口如下,以下方法都由Web容器自动调用: package 你可 ...
- JavaWEB过滤器和监听器技术
过滤器介绍 什么是过滤器 生活中的例子: 滤水器,口罩,杯子上滤网,渔网 生活中的过滤器:留下我们想要的,排除,我们不想要的. 高考: 只有分数够高的同学才能进入理想的大学.有一部分同学被拦截在大学之 ...
- JavaWeb过滤器(Filter)
开发工具与关键技术:javaWeb,过滤器(Filter) 撰写时间:2019-05-26 总结下述所有表达 第一点:过滤器是什么 第二点:客户端到服务端的流程 第三点:过滤器如何编写 第四点:Fil ...
- JavaWeb过滤器解决中文乱码问题
文章目录 前言 一.创建过滤器的类 二.实现接口 1.EncodingFilter implements Filter 2.web.xml注册过滤器 3. 重新运行项目即可 前言 Javaweb三大组 ...
- struts2 javaweb 过滤器、监听器 拦截器 原理
转: 过滤器.监听器 拦截器 过滤器 创建一个 Filter 只需两个步骤: (1)创建 Filter 处理类: (2)在 web.xml 文件中配置 Filter . 创建 Filter 必须实现 ...
- JavaWeb过滤器(Filter)详解,是时候该把过滤器彻底搞懂了(万字说明)
注意:这篇文章很长,学习完后将会解决你对于过滤器(Filter)的所有疑惑,下面将通过理论和代码的结合来进行讲解演示..... 目录 基本介绍 过滤器原理 过滤器(Filter)接口 ...
- javaweb项目中的过滤器的使用
翻阅博客园的的时候,看到两篇关于javaweb过滤器的帖子写的很好,这里备忘一下: 过滤器基础:http://www.cnblogs.com/xdp-gacl/p/3948353.html 获取器案例 ...
- JavaWeb Filter 过滤器
参考:JavaWeb过滤器(Filter)详解 1.简介 顾名思义就是对事物进行过滤的,在Web中的过滤器,当然就是对请求进行过滤,我们使用过滤器,就可以对请求进行拦截,然后做相应的处理,实现许多特殊 ...
- java中高级大公司多线程面试题
点击上方"好好学java",选择"置顶公众号" 优秀学习资源.干货第一时间送达! 精彩内容 java实战练习项目教程 2018微服务资源springboot.s ...
最新文章
- 工作能力强的人有哪些共同特征?
- MySQL 5.1 分区技术初探(一)
- CentOS7.5 -- Ansible部署与应用
- Kinect 动作识别组件概要设计
- ORACLE纯SQL实现多行合并一行
- CF1325D:Ehab the Xorcist(位运算)
- 1012 The Best Rank (25)
- 哈希表的最差复杂度是n2_给定数组A []和数字X,请检查A []中是否有对X | 使用哈希O(n)时间复杂度| 套装1...
- bzoj2463 [中山市选2009]谁能赢呢?
- 【吴恩达机器学习】学习笔记——1.3机器学习的定义
- Maven(一):Maven安装及Eclipse配置
- csv数据源的创建(一)
- gcc -l:手动添加链接库
- Linux下使用libevent库实现服务器端编程
- 电力前沿:Hightopo 助力贵州院打造智慧能源生态系统
- 阿里巴巴官方:明年今日马云将不再担任董事局主席
- 有关世界上第一台计算机的知识,计算机基础知识 1、世界上第一台电子计算机诞生于 A) 1943年 B) 1946年.doc...
- AutoCAD Civil 3D贴图
- 小白对于Linux的学习
- 整理任正非思想:英雄好汉站出来-1995