一、Servlet过滤器简介
Servlet过滤器是在Servlet规范2.3定义的,它能够对Servlet容器请求资源和响应对象进行检查和修改。Servlet过滤器不产生请求和响应对象,只是提供过滤作用。Servlet过滤器能够在Servlet被调用之前检查Request对象,在Servlet被调用之后检查Response对象。Servlet过滤器负责过滤的Web组件可以是Servlet、JSP或者HTML文件。
二、Servlet过滤器特点
1、检查和修改ServletRequest对象与ServletResponse对象;
2、Servlet过滤器可以被指定和特定的URL关联,只有当客户请求访问该URL时,才会触发过滤器。
3、Servlet过滤器可以被串联在一起,形成管道效应,协同修改请求和响应对象。
三、Servlet过滤器API
创建Servlet过滤器必须实现javax.servlet.Filter接口,在这个接口当中分定义了init()、doFilter()、destroy()这3个过滤器类必须实现的方法。如下:
1、init()是过滤器初始化方法,可读取web.xml文件中Servlet过滤器初始化参数,Servlet容器创建Servlet过滤器实例后调用该方法,该方法在在Servlet过滤器生命周期调用一次;
public void init(FilterConfig config) throws ServletException {
//通过config.getInitParameter("")可读取web.xml文件中初始化值
}
2、doFilter()完成过滤的实际操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法;public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);//把处理发送到下一个过滤器,形成管道效应
}
3、destroy()方法在Servlet容器销毁实例前调用该方法,该方法释放过滤器占用的资源,在该方法在在Servlet过滤器生命周期调用一次;
public void destroy() {
}
四、Servlet过滤器实现登录认证过滤实例
该例主要对用户登录进行认证,如用户没有登录则不能访问web资源,
1、创建登录界面login.jsp,当点击登录时,会将此请求交给Servlet中的doPsot()方法去处理;
<form action="regUserServlet" method="post">
<table align="center">
<tr align="center">
<td colspan="2">用户登录</td>
</tr>
<tr>
<td>帐号:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="text" name="password" /></td>
</tr>
<tr align="center">
<td colspan="2"><input type="submit" value="登录" /></td>
</tr>
</table>
</form>
2、创建regUserServlet,处理request请求,当帐号与密码输入正确时,跳转到alluser.jsp;
public class regUserServlet extends HttpServlet {
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//获取帐号与密码
String username =new String(request.getParameter("username").getBytes("ISO-8859-1"),"utf-8");
String password = request.getParameter("password");
//request.setAttribute("username", username);
//将获取的账号与密码保存到session中,该会话时间默认是30分钟
HttpSession session = request.getSession();
session.setAttribute("username", username);
session.setAttribute("password", password);
//判断用户登录
if (username.equals("etccbw") && password.equals("123456")) {
request.getRequestDispatcher("/alluser.jsp").forward(request,response);
} else {
request.setAttribute("msg","帐号密码输入错误,请重新登录..");
request.getRequestDispatcher("/error.jsp").forward(request,response);
}
}
}
3、创建alluser.jsp,显示用户登录信息;
<body>
${username},先生, hello!欢迎您进入本系统...<br>
</body>
4、创建regUserFilter过滤器,主要对用户登录进行验证,我这里主要是将regUserServlet类中保存在Session中的用户信息取出进行判断,个人建议,如果测试时,用request对象进行保存,这样不登录直接访问alluser.jsp资源,则Servlet过滤器效果明显些,直接跳转到logn.jsp页面,如果用Session保存数据,验证Servlet过滤器需要清楚缓存;
public class regUserFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
String encoding = config.getInitParameter("encoding");
System.out.println("** 过滤器初始化,初始化参数=" + encoding);
}
// 编码过滤、登录验证
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("** 执行过滤器.. **");
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession();
String uname = (String) session.getAttribute("username");
// 判断如果没有取到用户信息,就跳转到登陆页面
if (uname == null || "".equals(uname)) {
request.getRequestDispatcher("/login.jsp").forward(request,response);
return;//返回
} else {
chain.doFilter(request, response);
}
}
public void destroy() {
System.out.println("** 过滤器销毁.. **");
}
}
5、配置web.xml
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<!-- Servlet过滤器配置 -->
<filter>
<filter-name>regUserFilter</filter-name>
<filter-class>com.casv.filter.regUserFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>regUserFilter</filter-name>
<url-pattern>alluser.jsp</url-pattern>//过滤登录后显示的alluser.jsp资源
</filter-mapping>
<!-- Servlet配置 -->
<servlet>
<servlet-name>regUserServlet</servlet-name>
<servlet-class>com.casv.servlet.regUserServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>regUserServlet</servlet-name>
<url-pattern>/regUserServlet</url-pattern>
</servlet-mapping>
6、运行效果:
当用户不进行登录,直接访问资源http://localhsot:8888/servlet_filter_001/alluser.jsp,直接跳转到login.jsp登录页面
打印效果: