服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jbuilder2005 servlet开发之过滤器

过滤器可以在请求到达jsp或servlet之前或响应返回客户端之前添加一些额外的操作。如果有多个jsp页面和servlet都需要进行一个相同或相似的操作,我们可以把这个操作抽取到一个servlet过滤器中,并通过匹配路径截获感兴趣jsp或servlet。

   我们举几个典型的过滤器应用的例子,读者可以推而广之:

   ?编码转换

  乱码问题困扰了不少的web应用程序开发者,这是因为基于java的web应用程序可能运行于不同的web应用程序器、操作系统平台或硬件服务器上,不同的环境有自己默认的编码类型,在数据的转换过程中不同的默认编码是乱码问题的始作俑者,所以在开发jsp时常常需要将数据进行编码转换。我们可以创建一个servlet过滤器在请求进入服务程序前都进行编码转换。

   ?添加统一的标题或脚注

   有些网页需要添加统一的标题头或脚注,可以通过servlet过滤器在响应返回到客户端前给网页添加上统一的标题和脚注。

   ?进行安全的控制

   登录系统后,一般都会将用户信息对象放入到session中,可以通过servlet过滤器在请求进入jsp或servlet前判断session中是否有用户信息对象,如果有,则说明用户已经登录,如果没有,则说明用户还没有登录,将请求重定向到登录页面。

   本节所提供的servlet过滤器就是为了实现安全控制,下面我们就来开发这个servlet。

   1.打开创建servlet过滤器的向导。

   通过file->new...->web->双击filter servlet图标启动创建servlet过滤器的向导,如下图所示:

jbuilder2005 servlet开发之过滤器
图 7 指定servlet过滤器的名字


   和创建标准的servlet相似,在这步里指定过滤器的类名和包名。在class name中输入logincheckfilter,包名依就为bookstore.servlet。按next到下一步。

   2.指定过滤器的路径匹配模式

jbuilder2005 servlet开发之过滤器
图 8 指定过滤器的匹配路径模式


   ?name:logincheckfilter,指定过滤器的名字

   ?url pattern:/*,指定过滤器路径匹配模式,这里我们使过滤器对所有的请求都进行过滤。

   按finish创建此过滤器。

   打开向导创建的logincheckfilter.java文件,并录入粗体所示的代码,如下所示:

   代码清单 4 logincheckfilter.java代码

1. package bookstore.servlet;
2. …
3. public class logincheckfilter
4. extends httpservlet implements filter
5. {
6.  …
7.  public void dofilter(servletrequest request, servletresponse response
8.      , filterchain filterchain)
9.  {
10.  try
11.  {
12.   //进行请求和响应的类型转换
13.   httpservletrequest httprequest = (httpservletrequest) request;
14.   httpservletresponse httpresponse = (httpservletresponse) response;
15.
16.   boolean isvalid = true;
17.   string uristr = httprequest.getrequesturi().touppercase();
18.   if (uristr.indexof("login.jsp") == -1 &&
19.     uristr.indexof("switch.jsp") == -1 &&
20.     httprequest.getsession().getattribute("ses_userbean") == null)
21.   {
22.    isvalid = false;
23.   }
24.   if (isvalid)
25.   {
26.    filterchain.dofilter(request, response);
27.   } else
28.   {
29.    httpresponse.sendredirect("/webmodule/login.jsp");
30.   }

31.
32.  } catch (servletexception sx)
33.  {
34.   filterconfig.getservletcontext().log(sx.getmessage());
35.  } catch (ioexception iox)
36.  {
37.   filterconfig.getservletcontext().log(iox.getmessage());
38.  }
39. }
40. …
41. }

   由于login.jsp是用户登录页面,而switch.jsp是用户登录处理页面,在访问这两个页面时用户信息对象都还没有产生,所以应该将这两个页面排除在过滤器检验规则这外。我们通过判断请求路径获知是否是login.jsp和switch.jsp,如第18~19行所示。

   如果不是这两个页面,则都必须进行检验,判断页面的session对象中是否包含以ses_userbean命名的对象(第20行)。如果没有包含以ses_userbean命名的对象,重定向到登录页面(第29行),否则将请求传给请求的目标程序(第26行)。

   打开web.xml,你将看到有关logincheckfilter过滤器的部署描述配置信息,如下粗体所示:

   代码清单 5 过滤器的部署描述配置信息

1. <web-app>
2.  <display-name>webmodule</display-name>
3.  <filter>
4.   <filter-name>logincheckfilter</filter-name>
5.   <filter-class>bookstore.servlet.logincheckfilter</filter-class>
6.  </filter>
7.  <filter-mapping>
8.   <filter-name>logincheckfilter</filter-name>
9.   <url-pattern>/*</url-pattern>
10.  </filter-mapping>

11.  …
12. </web-app>

   <filter-name>配置过滤器的名字和实现类,而<filter-mapping>配置过滤器的路径匹配模式。

扫描关注微信公众号