过滤器Filter

filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理。

步骤:

  1. 编写一个过滤器的类实现Filter接口
  2. 实现接口中尚未实现的方法(着重实现doFilter方法)
  3. 在web.xml中进行配置(主要是配置要对哪些资源进行过滤)

例子,过滤器实现类:

package com.yyb.filter;import java.io.IOException;
import javax.servlet.*;/*** Created by Administrator on 2017/7/28.*/
public class FilterDemo implements Filter {@Override//Filter创建的时候执行init方法public void init(FilterConfig filterConfig) throws ServletException {//1、获得web.xml中filter 的名称<filter-name>FilterDemo</filter-name>
        System.out.println(filterConfig.getFilterName());//2、获得当前filter的初始化参数System.out.println(filterConfig.getInitParameter("aaa"));//3、获得servletContext
        filterConfig.getServletContext();System.out.println("init ....");}@Override//doFilter是Filter的核心过滤的方法/** request: 内部封装是客户端http请求的内容* response: 代表是响应* FilterChain: 过滤器链对象*/public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {System.out.println("quick1 running....");//放行请求
        chain.doFilter(request, response);}@Override//Filter对象销毁的时候执行destory方法public void destroy() {System.out.println("destroy...");}
}

web.xml

<filter><filter-name>FilterDemo</filter-name><filter-class>com.yyb.filter.FilterDemo</filter-class></filter><filter-mapping><filter-name>FilterDemo</filter-name><url-pattern>/*</url-pattern></filter-mapping>

Filter的API详解

filter生命周期及其与生命周期相关的方法,Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法:

  • init(Filterconfig):代表filter对象初始化方法,filter对象创建时执行。
  • doFilter(ServletRequest,ServletResponse,FilterCha):代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法。
  • destory():代表是filter销毁方法,当filter对象销毁时执行该方法。

Filter对象的生命周期

  • Filter何时创建:服务器启动时就创建该filter对象
  • Filter何时销毁:服务器关闭时filter销毁

init(FilterConfig):其中参数config代表该Filter对象的配置信息的对象,内部封装是该filter的配置信息。

destory()方法:filter对象销毁时执行。

doFilter方法:doFilter(ServletRequest,ServletResponse,FilterChain),其中的参数ServletRequest/ServletResponse是每次在执行doFilter方法时web容器负责创建一个request和一个response对象作为doFilter的参数传递进来。该request与response就是在访问目标资源的service方法时的request和response。FilterChain是过滤器链对象,通过该对象的doFilter方法可以放行该请求。chain对象根据配置的filter-mapping顺序依次执行filter。

Filter的配置

<filter><filter-name>FilterDemo</filter-name><filter-class>com.yyb.filter.FilterDemo</filter-class></filter><filter-mapping><filter-name>FilterDemo</filter-name><url-pattern>/*</url-pattern></filter-mapping>

url-pattern配置

  • 完全匹配

    /Servlet1,只有访问Servlet1时才执行

  • 目录匹配 /aaa/bbb/*

/user/*:访问前台的资源进入此过滤器

/admin/*:访问后台的资源时执行此过滤器

  • 扩展名匹配 *.abc *.jsp

注意:url-pattern可以使用servlet-name替代,也可以混用。

 <filter-mapping><filter-name>FilterDemo</filter-name><!--<url-pattern>/*</url-pattern>--><servlet-name>FilterTest</servlet-name><servlet-name>FilterTest1</servlet-name></filter-mapping>

dispatcher:访问的方式

  • REQUEST:默认值,代表直接访问某个资源时执行filter
  • FORWARD:转发时才执行filter
  • INCLUDE: 包含资源时执行filter
  • ERROR:发生错误时 进行跳转时执行filter

例子:web.xml

  <filter><filter-name>FilterDemo</filter-name><filter-class>com.yyb.filter.FilterDemo</filter-class></filter><filter-mapping><filter-name>FilterDemo</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher></filter-mapping>

在FilterTest中,添加转发代码  request.getRequestDispatcher("/index.jsp").forward(request, response); ,此时当访问FilterTest时,过滤器只会执行依次,而不是两次。转发时不会执行过滤器。

但是重定向会执行两次,在FilterTest中,添加转发代码  response.sendRedirect(request.getContextPath()+"/index.jsp"); ,可以看到执行结果。

Filter的作用

  • 公共代码的提取
  • 可以对request和response中的方法进行增强(装饰者模式/动态代理)
  • 进行权限控制

使用filter解决参数中文乱码

package com.ithiema.web.filter;import java.io.IOException;
import java.io.UnsupportedEncodingException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;public class EncodingFilter implements Filter{@Overridepublic 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);}@Overridepublic void destroy() {}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}}class EnhanceRequest extends HttpServletRequestWrapper{private HttpServletRequest request;public EnhanceRequest(HttpServletRequest request) {super(request);this.request = request;}//对getParaameter增强
    @Overridepublic 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;}
}

注解

注解就是符合一定格式的语法 @xxxx,是给jvm看的,给机器看的。注解在目前而言最主流的应用是代替配置文件。

关于配置文件与注解开发的优缺点:

  • 优点:开发效率高,成本低
  • 缺点:耦合性大,并且不利于后期维护

jdk5提供的注解

@Override:告知编译器此方法是覆盖父类的

@Deprecated:标注过时

@SuppressWarnings:压制警告

不同的注解只能在不同的位置使用(方法上、字段上、类上)

自定义注解

怎样去编写一个自定义的注解,使用@interface关键字。

public @interface MyAnno {//注解的属性
    String name();int age() default 28;
}

怎样去使用注解

 @MyAnno(name="",age=20)public  void  show(){}@MyAnno(name="")public  void  show1(){}

注意:如果属性的名字是value,并且注解的属性值只有一个,那么在使用注解时可以省略value。注解属性类型只能是以下几种:基本类型;String;枚举类型;注解类型;Class类型 ;以上类型的一维数组类型。

public @interface MyAnno2 {//String value();     String[]value();
}

    //@MyAnno2("aa")//public  void  show2(){//}@MyAnno3({"name","age"})public  void  show3(){}

怎样去解析注解-----使用反射知识

介入一个概念,元注解。代表修饰注解的注解,作用是限制定义的注解的特性。
@Retention

  • SOURCE: 注解在源码级别可见,在字节码文件中就没有了。
  • CLASS:注解在字节码文件级别可见
  • RUNTIME:注解在整个运行阶段都可见

@Target 代表注解修饰的范围:类上使用,方法上使用,字段上使用

  • FIELD:字段上可用此注解
  • METHOD:方法上可以用此注解
  • TYPE:类/接口上可以使用此注解
import java.lang.reflect.Method;/*** Created by Administrator on 2017/7/28.*/
public class MyAnnoParse {public static void main(String[]args) throws NoSuchMethodException {//解析show方法上面的@MyAnno//直接的目的是 获得show方法上的@MyAnno中的参数//获得show方法的字节码对象Class clazz = MyAnnoTest.class;Method method = clazz.getMethod("show", String.class);//获得show方法上的@MyAnnoMyAnno annotation = method.getAnnotation(MyAnno.class);//获得@MyAnno上的属性值System.out.println(annotation.name());//zhangsanSystem.out.println(annotation.age());//28//根据业务需求写逻辑代码
    }
}

注意:要想解析使用了注解的类 ,那么该注解的Retention必须设置成Runtime,注解解析的实质是从注解中解析出属性值

字节码对象存在于获得注解相关的方法

isAnnotationPresent(Class<? extends Annotation> annotationClass) : 判断该字节码对象身上是否使用该注解了
getAnnotation(Class<A> annotationClass) :获得该字节码对象身上的注解对象

转载于:https://www.cnblogs.com/ginb/p/7249442.html

JavaWeb学习笔记九 过滤器、注解相关推荐

  1. javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)

    javaweb学习笔记2 javascript正则表达式 regfxp对象 方式1: var putt=new RegExp("e");//表示要求字符串中必须包含字符串evar ...

  2. B站狂神说JavaWeb学习笔记

    JavaWeb学习笔记(根据b站狂神说java编写) 1.基本概念 1.1 前言 静态Web: 提供给所有人看数据不会发生变化! HTML,CSS 动态Web: 有数据交互,登录账号密码,网站访问人数 ...

  3. JavaWeb学习笔记(5)-B站尚硅谷

    文章目录 十四.书城项目第三阶段--优化 (1)页面jsp动态化 (2)抽取页面中相同的内容 A.登录成功的菜单 B.base.css.jQuery标签 C.每个页面的页脚 D.manager模块的菜 ...

  4. 【javaweb学习笔记】servlet-api,filter和Listener

    javaweb学习笔记 1. servlet-api 1.1 servlet初始化 1.2 ServletContext和context-param 2. 什么是业务层 3. IOC 3.1 耦合/依 ...

  5. JavaWeb学习笔记-目录(待完成)

    JavaWeb学习笔记-目录(待完成) 01-基础加强(注解+反射) 02-mysql基础 03-mysql约束 04-mysql多表事务 05-jdbc 06-jdbc连接池JDBCTemplate ...

  6. JavaWeb学习笔记(十)--HttpServletRequest

    1. HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中 2. Ht ...

  7. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  8. springmvc学习笔记(10)-springmvc注解开发之商品改动功能

    springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...

  9. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...

最新文章

  1. 【BZOJ】3771: Triple FTT+生成函数
  2. php5.4.16执行shell脚本
  3. pipe 半双工_pipe 半双工_Linux管道PIPE的原理和应用
  4. npz文件转为npy_numpy的文件存储 .npy .npz 文件
  5. ~~朴素dijkstra算法
  6. Android桌面组件开发之实时文件夹(Live_Folders)
  7. 17级Biter的微机课程学习总结另外附上19年微机考试题型分布
  8. c语言代码题及答案,c语言编程题精选及答案
  9. 简单编译器的实现 (四)
  10. 热议:为什么近些年硕士生考博意愿偏低?
  11. 微信隐藏功能系列2:微信语音怎么转发?
  12. 中州韵输入法 linux 小鹤双拼,「Rime 鼠须管」小鹤双拼配置指南
  13. Java如何实现阶梯字符型输出
  14. 聊聊电商系统中红包活动设计
  15. python 视图对象_Python之路【第二十八篇】:django视图层、模块层
  16. 关于QTableWidget 表头设置无效的原因
  17. 一个关于计算分批进货按照先进先出规则的商品成本统计算法(js版本)
  18. cesium中限制地图浏览范围
  19. skinme找不到java_配置forge后,无法获取依赖
  20. Java程序员必看:Solr vip竞价排名

热门文章

  1. L1-011 A-B (20 分)(c语言实现)
  2. Shell(3)——截取某些字符、默认值处理
  3. 盒子滤波/均值滤波NEON优化
  4. 第十一届河南省赛--H : Attack City and Capture Territory
  5. [NOTE] sqli-labs Basic Challenges
  6. python3 文件模式
  7. 关于c++静态成员函数
  8. android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...
  9. 5-简单选择排序C实现(递增递减的简单转换)
  10. 智能车大赛信标组_第十五届全国大学生智能汽车竞赛在南京信息工程大学圆满闭幕...