过滤器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的访问流程1:

图filter的访问流程2:

4.Filter的配置

注意:flter是按照filter-mapping的顺序来执行的

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)公共代码的提取,例如request.setCharacterEncoding(“UTF-8”)

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

3)进行权限控制

二、案例

1.自动登录(核心代码)

public class AutoLoginFilter implements Filter{

   @Override

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

         throws IOException, ServletException {

      HttpServletRequest req = (HttpServletRequest) request;

      HttpServletResponse resp = (HttpServletResponse) response;

      HttpSession session = req.getSession();

      //获得cookie中用户名和密码 进行登录的操作

      //定义cookie_username

      String cookie_username = null;

      //定义cookie_password

      String cookie_password = null;

      //获得cookie

      Cookie[] cookies = req.getCookies();

      if(cookies!=null){

         for(Cookie cookie : cookies){

            //获得名字是cookie_username和cookie_password

            if("cookie_username".equals(cookie.getName())){

                cookie_username = cookie.getValue();

                //恢复中文用户名

                cookie_username = URLDecoder.decode(cookie_username, "UTF-8");

            }

            if("cookie_password".equals(cookie.getName())){

                cookie_password = cookie.getValue();

            }

         }

      }

      //判断username和password是否是null

      if(cookie_username!=null&&cookie_password!=null){

         //登录的代码

         UserService service = new UserService();

         User user = null;

         try {

            user = service.login(cookie_username,cookie_password);

         } catch (SQLException e) {

            e.printStackTrace();

         }

         //将登录的用户的user对象存到session中

         session.setAttribute("user", user);

      }

      //放行

      chain.doFilter(req, resp);

   }

   @Override

   public void init(FilterConfig filterConfig) throws ServletException {

   }

   @Override

   public void destroy() {

   }

}

2.解决全局的编码

1)解决中文登录名写入cookie的问题

解决方法:写入cookie的时候用utf-8编码,读出的时候再解码

//对中文张三进行编码

String username_code = URLEncoder.encode(username, "UTF-8");// %AE4%kfj

//恢复中文用户名

cookie_username = URLDecoder.decode(cookie_username, "UTF-8");

2)解决全局的编码问题(核心代码)

public class EncodingFilter implements Filter{

   @Override

   public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

         throws IOException, ServletException {

      //request.setCharacterEncoding("UTF-8");

      //在传递request之前对request的getParameter方法进行增强

      /*

       * 装饰者模式(包装)

       *

       * 1、增强类与被增强的类要实现统一接口

       * 2、在增强类中传入被增强的类

       * 3、需要增强的方法重写 不需要增强的方法调用被增强对象的

       *

       */

      //被增强的对象

      HttpServletRequest req = (HttpServletRequest) request;

      //增强对象

      EnhanceRequest enhanceRequest = new EnhanceRequest(req);

      chain.doFilter(enhanceRequest, response);

   }

   @Override

   public void destroy() {

   }

   @Override

   public void init(FilterConfig filterConfig) throws ServletException {

   }

}

class EnhanceRequest extends HttpServletRequestWrapper{

   private HttpServletRequest request;

   public EnhanceRequest(HttpServletRequest request) {

      super(request);

      this.request = request;

   }

   //对getParaameter增强

   //注意request中还有类似getParaameter的方法,

   //这些方法获取还是乱码,所以都建议进行重写

   @Override

   public String getParameter(String name) {

      String parameter = request.getParameter(name);//乱码

      try {

         parameter = new String(parameter.getBytes("iso8859-1"),"UTF-8");

      } catch (UnsupportedEncodingException e) {

         e.printStackTrace();

      }

      return parameter;

   }

}

【JAVAWEB学习笔记】24_filter实现自动登录和解决全局的编码问题的更多相关文章

  1. 吴裕雄--天生自然PYTHON学习笔记:python自动登录网站

    打开 www. 5 l eta . com 网站,如果己经通过某用户名进行了登录,那么先退出登录 . 登录该网站 的步骤一般如下 : ( 1 )单击右上角的“登录”按钮. ( 2 )先输入账号. ( ...

  2. javaweb学习笔记整理补课

    javaweb学习笔记整理补课 * JavaWeb: * 使用Java语言开发基于互联网的项目 * 软件架构: 1. C/S: Client/Server 客户端/服务器端 * 在用户本地有一个客户端 ...

  3. JavaWeb学习笔记总结 目录篇

    JavaWeb学习笔记一: XML解析 JavaWeb学习笔记二 Http协议和Tomcat服务器 JavaWeb学习笔记三 Servlet JavaWeb学习笔记四 request&resp ...

  4. ArcGIS案例学习笔记-CAD数据自动拓扑检查

    ArcGIS案例学习笔记-CAD数据自动拓扑检查 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 功能:针对CAD数据,自动进行拓扑检查 优点:类别:地理建模项目实例 ...

  5. UFLDL深度学习笔记 (一)反向传播与稀疏自编码

    UFLDL深度学习笔记 (一)基本知识与稀疏自编码 前言 近来正在系统研究一下深度学习,作为新入门者,为了更好地理解.交流,准备把学习过程总结记录下来.最开始的规划是先学习理论推导:然后学习一两种开源 ...

  6. Javaweb学习笔记9—过滤器

      今天来讲javaweb的第9阶段学习.   过滤器,我在本次的思维导图中将过滤器和监听器放在一起总结了,监听器比较简单就不单独写了.   老规矩,首先先用一张思维导图来展现今天的博客内容.     ...

  7. Linux学习笔记总结--ssh认证登录

    原理简介 SSH证书认证登录的基础是一对唯一匹配密钥: 私钥(private key)和公钥(public key).公钥用于对数据进行加密,而且只能用于加密.而私钥只能对使用所匹配的公钥,所加密过的 ...

  8. 【JAVAWEB学习笔记】06_jQuery基础

    接05的学习笔记. 四.使用JQ完成省市二级联动 1.需求分析 使用jquery完成省市二级联动 2.技术分析 2.1数组的遍历操作 方式一: $(function(){ // 全选/ 全不选 $(& ...

  9. 【JAVAWEB学习笔记】网上商城实战:环境搭建和完成用户模块

    网上商城实战 今日任务 完成用户模块的功能 1.1      网上商城的实战: 1.1.1    演示网上商城的功能: 1.1.2    制作目的: 灵活运用所学知识完成商城实战. 1.1.3    ...

随机推荐

  1. POPTEST老李分享session,cookie的安全性以及区别 2

    四,session和cookie谁更安全 就个人而言,我觉得session更安全一点,我以下几点看法. 1,如果session和cookie一样安全的话,二者就没有并要同时存在了,只要cookie就好 ...

  2. 老李分享:MySql的insert语句的性能优化方案

    老李分享:MySql的insert语句的性能优化方案   性能优化一直是测试人员比较感兴趣的内容,poptest在培训学员的时候也加大了性能测试调优的方面的内容,而性能优化需要经验的积累,经验的积累依 ...

  3. android.util.Log常用方法

    android.util.Log常用的方法有以下5个: Log.v() Log.d() Log.i() Log.w() 以及 Log.e() .根据首字母分别对应VERBOSE,DEBUG,INFO, ...

  4. Java第二章 变量

    1.什么是变量? 存储数据的基本单位. 2.数据类型分为: 基本类型和引用数据 3.基本数据类型和引用数据类型的区别: 基础数据:不同的变量会分配不同的存储空间,改变一个变量不会影响另一个变量 引用数 ...

  5. ZEROC ICE 跨平台间程序调用 java版

    前言: 本来建博客是为了和大家分享一些前端的开发经验和心得呢,但是阴差阳错,第一篇技术博客确实关于跨平台,跨语言服务端调用的解决方案---ZEROC ICE. 最近一个项目涉及到java.python ...

  6. 1133: 零起点学算法40——多组测试数据(a+b)II

    1133: 零起点学算法40--多组测试数据(a+b)II Time Limit: 1 Sec  Memory Limit: 64 MB   64bit IO Format: %lldSubmitte ...

  7. AES算法,DES算法,RSA算法JAVA实现

    1     AES算法 1.1    算法描述 1.1.1      设计思想 Rijndael密码的设计力求满足以下3条标准: ① 抵抗所有已知的攻击. ② 在多个平台上速度快,编码紧凑. ③ 设计 ...

  8. 一些IO流的知识

    IO流: 输入流:输出流: 字节流:字符流:为了处理文字数据方便而出现的对象. 其实这些对象的内部使用的还是字节流(因为文字最终也是字节数据) 只不过,通过字节流读取了相对应的字节数,没有对这些字节直 ...

  9. openMP编程(上篇)之指令和锁

    openMP简介 openMP是一个编译器指令和库函数的集合,主要是为共享式存储计算机上的并行程序设计使用的. 当计算机升级到多核时,程序中创建的线程数量需要随CPU核数变化,如在CPU核数超过线程数 ...

  10. Android 代码库(自定义一套 Dialog通用提示框 )

          做Android开发五年了,期间做做停停(去做后台开发,服务器管理),当回来做Android的时候,发现很生疏,好些控件以前写得很顺手,现在好像忘记些什么了,总要打开这个项目,打开那个项目 ...