day21过滤器.docx
- 文档编号:25250610
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:15
- 大小:27.58KB
day21过滤器.docx
《day21过滤器.docx》由会员分享,可在线阅读,更多相关《day21过滤器.docx(15页珍藏版)》请在冰豆网上搜索。
day21过滤器
目标:
过滤器:
1.过滤器
a)基于概念
b)写一个HelloWorld
c)总结Api及执行流程
2.过滤器案例
3.综合案例
1.过滤器
基本概念
(3W1H:
why,what,where,how)
为什么需用到过滤器?
项目开发中,经常会涉及到重复代码的实现!
注册----Servlet【1.设置编码】----JSP
修改----Servlet【1.设置编码】---JSP
其他,
如判断用户是否登陆,只有登陆才能有操作权限!
涉及到重复判断:
获取session,取出session数据,判断是否为空,为空说明没有登陆,不能操作;只有登陆后,才能操作!
如何解决:
1.抽取重复代码,封装
2.每个用到重复代码的地方,手动的调用!
过滤器,设计执行流程:
1.用户访问服务器
2.过滤器:
对Servlet请求进行拦截
3.先进入过滤器,过滤器处理
4.过滤器处理完后,在放行,此时,请求到达Servlet/JSP
5.Servlet处理
6.Servlet处理完后,再回到过滤器,最后在由tomcat服务器相应用户;
(过滤器就像回家的门!
)
过滤器,HelloWorld案例
Javax.servlet.*;
|--interfaceFilter及过滤器
开发步骤:
1.写一个普通java类,实现Filter接口
2.配置过滤器
过滤器执行流程
OOAD面向对象的分析与设计
使用RationRose时序图
过滤器相关Api
|--interfaceFilter过滤器核心接口
Voidinit(filterConfig);初始化方法,在服务器启动时候执行
VoiddoFilter(request,response,filterChain);过滤器拦截的业务处理方法
Voiddestroy();销毁过滤器实例时候调用
|--interfaceFilterConfig获取初始化参数信息
String
getInitParameter(java.lang.String name)
Enumeration
getInitParameterNames()
|--interfaceFilterChain过滤器链参数;一个个过滤器形成一个执行链;
voiddoFilter(ServletRequestrequest,ServletResponseresponse);执行下一个过滤器或放行
/**
*过滤器,测试
*@authorJie.Yuan
*
*/
publicclassHelloFilterimplementsFilter{
//创建实例
publicHelloFilter(){
System.out.println("1.创建过滤器实例");
}
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
System.out.println("2.执行过滤器初始化方法");
//获取过滤器在web.xml中配置的初始化参数
Stringencoding=filterConfig.getInitParameter("encoding");
System.out.println(encoding);
//获取过滤器在web.xml中配置的初始化参数的名称
Enumeration
while(enums.hasMoreElements()){
//获取所有参数名称:
encoding、path
Stringname=enums.nextElement();
//获取名称对应的值
Stringvalue=filterConfig.getInitParameter(name);
System.out.println(name+"\t"+value);
}
}
//过滤器业务处理方法:
在请求到达servlet之前先进入此方法处理公用的业务逻辑操作
@Override
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainchain)throwsIOException,ServletException{
System.out.println("3.执行过滤器业务处理方法");
//放行(去到Servlet)
//如果有下一个过滤器,进入下一个过滤器,否则就执行访问servlet
chain.doFilter(request,response);
System.out.println("5.Servlet处理完成,又回到过滤器");
}
@Override
publicvoiddestroy(){
System.out.println("6.销毁过滤器实例");
}
}
--过滤器配置-->
--配置初始化参数-->
/...
--内部名称-->
--过滤器类的全名-->
--filter内部名称-->
--拦截所有资源-->
对指定的请求拦截
/*表示拦截所有的请求
默认拦截的类型:
(直接访问或者重定向)
拦截转发:
拦截包含的页面(RequestDispatcher.include(/page.jsp);对page.jsp也执行拦截)
拦截声明式异常信息:
--配置第二个过滤器-->
--演示:
拦截指定的请求-->
--1.拦截所有
-->
--2.拦截指定的jsp
-->
--拦截所有的jsp
-->
--3.根据servlet的内部名称拦截
-->
--拦截指定的servlet
-->
--4.指定拦截指定的类型-->
共性问题:
1.过滤器:
方法参数没有自动命名,说明没有关联源码
--关联tomcat或servlet源代码
2.连接池:
多刷新几次,报错!
-连接没关
QueryRunnerqr=newQueryRunner();
qr.update(con,sql);
//这里con一定要关闭
-注意:
dataSource确定一个项目创建一次
QueryRunnerqr=newQueryRunner(dataSource);
修改连接池参数配置
3.编码
//设置POST提交的请求的编码
request.setCharacterEncoding("UTF-8");
//设置相应体的编码
response.setCharacterEncoding("UTF-8");
//设置页面打开时候时候的编码格式、设置相应体的编码
response.setContentType("text/html;charset=UTF-8");
开发中:
工作区间编码、项目编码、request/response、数据库编码一致!
2.案例
过滤器-编码统一处理
几乎每一个Servlet都要涉及编码处理:
处理请求数据中文问题!
【GET/POST】
每个servlet都要做这些操作,把公用的代码抽取-过滤器实现!
代码实现思路:
1.Login.jsp登陆,输入“中文”
2.LoginServlet.java直接处理登陆请求
3.EncodingFilter.java过滤器处理请求数据编码:
GET/POST
过滤器:
/**
*编码处理统一写到这里(servlet中不需要再处理编码)
*@authorJie.Yuan
*
*/
publicclassEncodingFilterimplementsFilter{
//过滤器业务处理方法:
处理的公用的业务逻辑操作
@Override
publicvoiddoFilter(ServletRequestreq,ServletResponseres,
FilterChainchain)throwsIOException,ServletException{
//转型
finalHttpServletRequestrequest=(HttpServletRequest)req;
HttpServletResponseresponse=(HttpServletResponse)res;
//一、处理公用业务
request.setCharacterEncoding("UTF-8");//POST提交有效
response.setContentType("text/html;charset=UTF-8");
/*
*出现GET中文乱码,是因为在request.getParameter方法内部没有进行提交方式判断并处理。
*Stringname=request.getParameter("userName");
*
*解决:
对指定接口的某一个方法进行功能扩展,可以使用代理!
*对request对象(目标对象),创建代理对象!
*/
HttpServletRequestproxy=(HttpServletRequest)Proxy.newProxyInstance(
request.getClass().getClassLoader(),//指定当前使用的累加载器
newClass[]{HttpServletRequest.class},//对目标对象实现的接口类型
newInvocationHandler(){//事件处理器
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
//定义方法返回值
ObjectreturnValue=null;
//获取方法名
StringmethodName=method.getName();
//判断:
对getParameter方法进行GET提交中文处理
if("getParameter".equals(methodName)){
//获取请求数据值【
Stringvalue=request.getParameter(args[0].toString());//调用目标对象的方法
//获取提交方式
StringmethodSubmit=request.getMethod();//直接调用目标对象的方法
//判断如果是GET提交,需要对数据进行处理(POST提交已经处理过了)
if("GET".equals(methodSubmit)){
if(value!
=null&&!
"".equals(value.trim())){
//处理GET中文
value=newString(value.getBytes("ISO8859-1"),"UTF-8");
}
}
returnvalue;
}
else{
//执行request对象的其他方法
returnValue=method.invoke(request,args);
}
returnreturnValue;
}
});
//二、放行(执行下一个过滤器或者servlet)
chain.doFilter(proxy,response);//传入代理对象
}
@Override
publicvoidinit(FilterConfigfilterConfig)throwsServletException{
}
@Override
publicvoiddestroy(){
}
}
过滤器配置:
--编码处理过滤器配置-->
Servlet:
publicclassLoginServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取请求数据
Stringname=request.getParameter("userName");
System.out.println("用户:
"+name);
}
过滤器-无效数据过滤
模拟:
论坛过滤敏感词汇!
实现思路:
1.Dis.jsp讨论区页面
2.DisServlet.java处理提交
---》获取请求参数
---》保存到request域
-----》跳转dis.jsp【从request取数据显示(处理后)】
3.DataFilter.java过滤器
----》编码
---》无效数据处理
即:
在上一个案例基础上,再添加无效数据过滤的相关代码!
JSP引入ckeditor组件:
客户端组件,便于用户输入内容!
JSP
--引入ckeditor组件(给用户输入提供方便)-->
${requestScope.content}
发表评论:
Filter:
在上个过滤器案例的基础上,增加如下代码:
//中文数据已经处理完:
下面进行无效数据过滤
//【如何value中出现dirtyData中数据,用****替换】
for(Stringdata:
dirtyData){
//判断当前输入数据(value),是否包含无效数据
if(value.contains(data)){
value=value.replace(data,"*****");
}
}
登陆权限判断
登陆,提交到登陆Servlet处理其业务!
-登陆成功,跳转到首页,显示欢迎信息+列表信息
-登陆失败,跳转到登陆!
要求:
只有登陆后,才可以访问首页,显示列表
如果没有登陆,直接访问首页列表,要跳转到登陆!
实现思路:
1.Login.jsp登陆页面
2.List.jsp列表显示
3.LoginServlet.java登陆处理servlet
4.IndexServlet.java首页列表查询Servlet
5.LoginFilter.java登陆验证过滤器
(用之前的表:
admin存储登陆用户,登陆用
employee存储员工信息,列表显示用!
)
实现步骤:
1.建库、建表、建项目、引入jar文件
2.entity
a)Admin.java
b)Employee.java
3.Dao
a)AdminDao
b)EmployeeDao
4.Servcie
5.Servlet
6.Jsp
http:
//localhost:
8080/emp_sys/login.jsp可以直接访问
http:
//localhost:
8080/emp_sys/login可以直接访问
http:
//localhost:
8080/emp_sys/index不能直接访问
http:
//localhost:
8080/emp_sys/list.jsp不能直接访问
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- day21 过滤器