1.1 案例一:自动登录案例.
1.1.1 需求:
1.1.2 分析:
1.1.2.1 技术分析:
在各式网站都会看到自动登录的功能,在登录页面中勾选了自动登录的复选框,那么下次访问网站首页的时候,可以不需要进行登录.
【Cookie技术】
* 利用Cookie记住用户的用户名和密码.
【Filter:过滤器的概述】
Ø 什么是过滤器Filter:可以过滤从客户端向服务器发送的请求.
Ø 过滤器的使用:
* 进行IP的过滤,脏话过滤,自动登录,响应压缩...
Ø 使用过滤器:
* 编写一个类实现Filter接口:
* 配置过滤器:
【过滤器的生命周期】:了解
Ø 过滤器的创建和销毁:
* 创建:服务器启动的时候.
* 销毁:服务器关闭的时候.
【FilterConfig:过滤器的配置对象】:
代码:
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 代码实现:
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);
}
}