Steel.Ma 技术笔记                                                                  Filter 制作  1            Filter 制作   作者:Steel.Ma Mail: steel.ma@139.com steel.ma@tom.com MSN: Motorola_8088@hotmail.com Blog: http://hi.csdn.net/iamsteelma http://blog.sina.com.cn/steelma Steel.Ma 技术笔记                                                                  Filter 制作  2    一、 前言  在 B/S 开发中,有很多应用是在大部分的页面中都会用到的,比如检查当前 是否已登陆等,对于这类应用,如果在每个页面中都有相应代码的话,将是一场 噩梦,幸好我们有 Filter 进行处理。 Filter 简单的说,就是一个拦截器,在指定类型的文件被调用前,容器会先 执行 Filter,以执行这类通用的应用,以下我们将介绍一个最常见的,检查是 否已经登陆的 Filter 的制作和部署 二、 环境准备与 sample 构思  环境方面,我们选用 tomcat 6 为服务器,以 MyEclipse 为开发环境,相关 的软件请自行准备 Tomcat 与 MyEclipse 的配置请参见本人所写的其他开发笔记,本文不再重复。 由于本文的 sample 将大量使用《用 Ajax 制作带图形验证码的登录页面》一 文中的代码,建议首先阅读该笔记。 本 sample 的构思如下: 1、 制作一个 filter,用于检测所有的 jsp 在被调用前,客户端是否已 经登陆过; 2、 如果没有登陆,则自动跳转到 login 画面上; 3、 如果登陆了,则继续操作。   三、 Filter 制作  1、首先在 MyEclipse 中创建一个名为 test 的 projec(步骤略)。 2、创建 com.steelma.filter 包(步骤略) 3、在 com.steelma.filter 包下创建一个名为 rightfilter 的 class,这个就是 我们要实现的 filter 的主体,用于检查是否已经登陆。代码如下: Steel.Ma 技术笔记                                                                  Filter 制作  3    package com.steelma.filter; import javax.servlet.Filter; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.FilterChain; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import javax.servlet.http.HttpServletResponse; public class rightfilter implements Filter { public void init(FilterConfig filterConfig) throws ServletException { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; HttpSession session = req.getSession(true); //从session里取的用户名信息 String username = (String) session.getAttribute("username"); //判断如果没有取到用户信息,就跳转到登陆页面 if (username == null || "".equals(username)) { //跳转到登陆页面 res.sendRedirect("http://"+req.getHeader("Host")+"/test/login.html"); } else { //已经登陆,继续此次请求 chain.doFilter(request,response); } } public void destroy() { } Steel.Ma 技术笔记                                                                  Filter 制作  4    } 这个 filter 将检测客户端的 session 中是否存在名为“username”的属性, 如果不存在,则将跳转到 login.html,如果存在,则继续执行相关操作。 4、我们修改在《用Ajax 制作带图形验证码的登录页面》一文中用到的那个登陆 页面,将其改写为 login.html,代码如下: 登陆
Steel.Ma 技术笔记                                                                  Filter 制作  6   
用户名:
密  码:
验证码: (注意:大小写不敏 感)
5、我们修改在《用 Ajax 制作带图形验证码的登录页面》一文中用到的那个 setvlet,代码如下: import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.google.code.kaptcha.Constants; public class login extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("LoginAjaxAction"); req.setCharacterEncoding("UTF-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String checkit = req.getParameter("checkit"); String kaptchaExpected = (String) req.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTC HA_SESSION_KEY); resp.setContentType("text/xml;charset=UTF-8"); resp.setHeader("Cache-Control", "no-cache"); Steel.Ma 技术笔记                                                                  Filter 制作  7    PrintWriter out = resp.getWriter(); out.println(""); if(username.equals("admin")&&password.equals("admin")&&checkit.eq ualsIgnoreCase(kaptchaExpected)){ HttpSession ses = req.getSession(true); //将用户信息写入 session ses.setAttribute("username",username) ; out.println("热烈的欢迎您!"); }else{ out.println("对不起,登陆失败"); } out.println(""); out.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } } 上述代码中我用粗体标示出来的就是新增的内容,主要功能是在客户端的 session 中写入一个名为“username”的属性。 6、最后,我们修改 MyEclipse 自动创建的 index.jsp 将其改为如下: <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServ erPort()+path+"/"; %> Steel.Ma 技术笔记                                                                  Filter 制作  8    My JSP 'index.jsp' starting page This is my JSP page By Test Filter.
以上标示为粗体的就是要修改的内容。 至此,filter 及其相关的文件均制作完毕,以下将进行相应的部署。   四、 部署、配置  filter 的部署与配置非常简单,从根本上说,其实和申明一个servlet 相差 无几,只需在 web.xml 中进行相应配置即可。我们打开 web.xml,将其修改为如 下: checklogin checklogin com.steelma.filter.rightfilter checklogin *.jsp Steel.Ma 技术笔记                                                                  Filter 制作  9    Kaptcha com.google.code.kaptcha.servlet.KaptchaServlet This is the description of my J2EE component This is the display name of my J2EE component login login Kaptcha /kaptcha.jpg login /servlet/login index.jsp BASIC 可以看出,我们在 web.xml 里进行了 3 项配置: 1、 将 com.steelma.filter.rightfilter 配置为所有 jsp 运行前执行的 filter; 2、 引入 Kaptcha; 3、 配置名为 login 的 servlet 以上就完成了部署配置。 Steel.Ma 技术笔记                                                                  Filter 制作  10    五、 测试步骤  用 MyEclipse 的工具发布到 tomcat 6,并启动 tomcat 后,直接访问: http://localhost:8080/test/index.jsp,此时,由于尚未登陆,因此 filter 将把当前 url 直接跳转到 login.html     我们输入信息并按“登陆”按钮后,系统提示  Steel.Ma 技术笔记                                                                  Filter 制作  11        此时,我们再访问 http://localhost:8080/test/index.jsp,系统将出现正确的 内容:  
还剩10页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 6 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

iamsteelma

贡献于2013-01-01

下载需要 6 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf