JavaWeb学习笔记九 过滤器、注解
过滤器Filter
filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理。
步骤:
- 编写一个过滤器的类实现Filter接口
- 实现接口中尚未实现的方法(着重实现doFilter方法)
- 在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学习笔记九 过滤器、注解相关推荐
- javaweb学习笔记2(jquery的使用,以及常用的方法,选择器,过滤器)
javaweb学习笔记2 javascript正则表达式 regfxp对象 方式1: var putt=new RegExp("e");//表示要求字符串中必须包含字符串evar ...
- B站狂神说JavaWeb学习笔记
JavaWeb学习笔记(根据b站狂神说java编写) 1.基本概念 1.1 前言 静态Web: 提供给所有人看数据不会发生变化! HTML,CSS 动态Web: 有数据交互,登录账号密码,网站访问人数 ...
- JavaWeb学习笔记(5)-B站尚硅谷
文章目录 十四.书城项目第三阶段--优化 (1)页面jsp动态化 (2)抽取页面中相同的内容 A.登录成功的菜单 B.base.css.jQuery标签 C.每个页面的页脚 D.manager模块的菜 ...
- 【javaweb学习笔记】servlet-api,filter和Listener
javaweb学习笔记 1. servlet-api 1.1 servlet初始化 1.2 ServletContext和context-param 2. 什么是业务层 3. IOC 3.1 耦合/依 ...
- JavaWeb学习笔记-目录(待完成)
JavaWeb学习笔记-目录(待完成) 01-基础加强(注解+反射) 02-mysql基础 03-mysql约束 04-mysql多表事务 05-jdbc 06-jdbc连接池JDBCTemplate ...
- JavaWeb学习笔记(十)--HttpServletRequest
1. HttpServletRequest简介 HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中 2. Ht ...
- IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...
IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...
- python3.4学习笔记(九) Python GUI桌面应用开发工具选择
python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...
最新文章
- 【BZOJ】3771: Triple FTT+生成函数
- php5.4.16执行shell脚本
- pipe 半双工_pipe 半双工_Linux管道PIPE的原理和应用
- npz文件转为npy_numpy的文件存储 .npy .npz 文件
- ~~朴素dijkstra算法
- Android桌面组件开发之实时文件夹(Live_Folders)
- 17级Biter的微机课程学习总结另外附上19年微机考试题型分布
- c语言代码题及答案,c语言编程题精选及答案
- 简单编译器的实现 (四)
- 热议:为什么近些年硕士生考博意愿偏低?
- 微信隐藏功能系列2:微信语音怎么转发?
- 中州韵输入法 linux 小鹤双拼,「Rime 鼠须管」小鹤双拼配置指南
- Java如何实现阶梯字符型输出
- 聊聊电商系统中红包活动设计
- python 视图对象_Python之路【第二十八篇】:django视图层、模块层
- 关于QTableWidget 表头设置无效的原因
- 一个关于计算分批进货按照先进先出规则的商品成本统计算法(js版本)
- cesium中限制地图浏览范围
- skinme找不到java_配置forge后,无法获取依赖
- Java程序员必看:Solr vip竞价排名
热门文章
- L1-011 A-B (20 分)(c语言实现)
- Shell(3)——截取某些字符、默认值处理
- 盒子滤波/均值滤波NEON优化
- 第十一届河南省赛--H : Attack City and Capture Territory
- [NOTE] sqli-labs Basic Challenges
- python3 文件模式
- 关于c++静态成员函数
- android微信朋友圈视频无法播放,微信朋友圈不能分享手机视频怎么回事?微信朋友圈大视频功能安卓不能用吗?...
- 5-简单选择排序C实现(递增递减的简单转换)
- 智能车大赛信标组_第十五届全国大学生智能汽车竞赛在南京信息工程大学圆满闭幕...