本帖最后由 谷粒姐姐 于 2018-6-5 11:41 编辑
1.1 案例一:自动登录案例.1.1.1 需求:在各式网站都会看到自动登录的功能,在登录页面中勾选了自动登录的复选框,那么下次访问网站首页的时候,可以不需要进行登录. 1.1.2 分析:1.1.2.1 技术分析:【Cookie技术】 * 利用Cookie记住用户的用户名和密码. 【Filter:过滤器的概述】 Ø 什么是过滤器Filter:可以过滤从客户端向服务器发送的请求. Ø 过滤器的使用: * 进行IP的过滤,脏话过滤,自动登录,响应压缩... Ø 使用过滤器: * 编写一个类实现Filter接口: * 配置过滤器: 【过滤器的生命周期】:了解 Ø 过滤器的创建和销毁: * 创建:服务器启动的时候. * 销毁:服务器关闭的时候. 【FilterConfig:过滤器的配置对象】: 代码: [AppleScript] 纯文本查看 复制代码 public void init(FilterConfig filterConfig) throws ServletException {[/align] // 获得当前的Filter的名称:
String filterName = filterConfig.getFilterName();
System.out.println(filterName);
// 获得初始化参数:
String username = filterConfig.getInitParameter("username");
String password = filterConfig.getInitParameter("password");
System.out.println(username+" "+password);
// 获得所有的初始化参数的名称:
Enumeration<String> en = filterConfig.getInitParameterNames();
while(en.hasMoreElements()){
String name = en.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println(name+" "+value);
}
}
【FilterChain:过滤器链】
过滤器链中的过滤器的执行的顺序与<filter-mapping>的配置顺序有关.
* doFilter(request,response); -- 放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
【Filter相关的配置】
Ø <url-pattern>的配置:
* 完全路径匹配 :以 / 开始 /demo4/demo1.jsp
* 目录匹配 :以 / 开始 以 * 结束. /* /demo1/*
* 扩展名匹配 :不能以 / 开始 以 * 开始. *.do *.action
Ø <servlet-name>的配置:根据Servlet的名称拦截Servlet.
Ø <dispatcher>的配置:
* REQUEST :默认值.
* FORWARD :转发.
* INCLUDE :包含.
* ERROR :错误页面跳转.(全局错误页面)
1.1.3 代码实现:
【步骤一】:创建数据库和表:
create database web_16;
use web_16;
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20),
nickname varchar(20),
type varchar(10)
);
insert into user values (null,'aaa','111','张凤','user');
insert into user values (null,'bbb','111','如花','user');
insert into user values (null,'ccc','111','张芙蓉','user'); 【步骤二】:导入jar包和工具类: 【步骤三】:创建包结构及常用类: 【步骤四】:登录功能. 【步骤五】:利用COokie记住用户名和密码 【步骤六】:实现自动登录的过滤器 1.2 案例二:通用的字符集编码的过滤器.1.2.1 需求:在一个网站上,通常会提交带有中文的数据,GET/POST请求都有可能提交中文数据.通常情况下在Servlet中处理中文乱码.现在能不能将乱码的处理交给过滤器完成.只需要在Servlet中关心参数的接收就可以了. 只需要在Servlet中调用request.getParameter();接收参数就可以,而不去关心到底get/post如何处理乱码. 1.2.2 分析:【增强request中的getParameter方法】 Ø 继承 :控制这个类构造. Ø 装饰者模式 :增强的类和被增强类实现相同的接口,增强的类中获得到被增强的类的引用. * 缺点:接口中方法太多. Ø 动态代理 :被增强的类实现接口就可以. 1.2.3 代码实现:[AppleScript] 纯文本查看 复制代码 public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper{
private HttpServletRequest request;
public MyHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
// 根据请求方式不同,去处理:
// 获得请求方式:
String method = request.getMethod();
if("get".equalsIgnoreCase(method)){
String value = null;
try {
value = new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return value;
}else if("post".equalsIgnoreCase(method)){
try {
request.setCharacterEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return super.getParameter(name);
}
} |