过滤器可以在请求到达JSP或Servlet之前或响应返回客户端之前添加一些额外的操作。如果有多个JSP页面和Servlet都需要进行一个相同或相似的操作,我们可以把这个操作抽取到一个Servlet过滤器中,并通过匹配路径截获感兴趣JSP或Servlet。
我们举几个典型的过滤器应用的例子,读者可以推而广之:
◆编码转换
乱码问题困扰了不少的Web应用程序开发者,这是因为基于Java的Web应用程序可能运行于不同的Web应用程序器、操作系统平台或硬件服务器上,不同的环境有自己默认的编码类型,在数据的转换过程中不同的默认编码是乱码问题的始作俑者,所以在开发JSP时常常需要将数据进行编码转换。我们可以创建一个Servlet过滤器在请求进入服务程序前都进行编码转换。
◆添加统一的标题或脚注
有些网页需要添加统一的标题头或脚注,可以通过Servlet过滤器在响应返回到客户端前给网页添加上统一的标题和脚注。
◆进行安全的控制
登录系统后,一般都会将用户信息对象放入到session中,可以通过Servlet过滤器在请求进入JSP或Servlet前判断session中是否有用户信息对象,如果有,则说明用户已经登录,如果没有,则说明用户还没有登录,将请求重定向到登录页面。
本节所提供的Servlet过滤器就是为了实现安全控制,下面我们就来开发这个Servlet。
1.打开创建Servlet过滤器的向导。
和创建标准的Servlet相似,在这步里指定过滤器的类名和包名。在Class name中输入LoginCheckFilter,包名依就为bookstore.Servlet。按Next到下一步。
2.指定过滤器的路径匹配模式
◆Name:logincheckfilter,指定过滤器的名字
◆URL pattern:/*,指定过滤器路径匹配模式,这里我们使过滤器对所有的请求都进行过滤。
按Finish创建此过滤器。
打开向导创建的LoginCheckFilter.java文件,并录入粗体所示的代码,如下所示:
package bookstore.servlet;
…
public class LoginCheckFilter
extends HttpServlet implements Filter
{
public void doFilter(ServletRequest request, ServletResponse
response, FilterChain filterChain)
{
try
{
//进行请求和响应的类型转换
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
boolean isValid = true;
String uriStr = httpRequest.getRequestURI().toUpperCase();
if (uriStr.indexOf("LOGIN.JSP") == -1 &&
uriStr.indexOf("SWITCH.JSP") == -1 &&
httpRequest.getSession().getAttribute("ses_userBean") == null)
{
isValid = false;
}
if (isValid)
{
filterChain.doFilter(request, response);
} else
{
httpResponse.sendRedirect("/webModule/login.jsp");
}
} catch (ServletException sx)
{
filterConfig.getServletContext().log(sx.getMessage());
} catch (IOException iox)
{
filterConfig.getServletContext().log(iox.getMessage());
}
}
…
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
【编辑推荐】