使用Filter过滤器   servlet是一一个小型过滤器,功能是拦截来自客户端的请求信息和响应信息,这样可以直接查看,提取或者对客户端和服务器
之间的减缓信息数据信息进行某项特定的操作。实现的过滤器通常是用来封装一些辅助型功能和方法。这些过滤器方法肯呢个对真正意义上的客户端请求和相应黑醋栗不起决定性作用
。但事实非常重要的。
1.配置过滤器:在<web-app>标签中声明 实现了servlet过滤器后,还需要通过web.xml文件中的如下两个xml元素来声明过滤器

<filter> 

<filter-name>Page Request</filter-name> 

<filter-class>TimeTrackFilter</filter-class> 

</filter> 

<filter-mapping> 

<filter-name>Page Request Time</filter-name> 

<servlet-name>Main  Servlet</servlet-name> 

</filter-mapping> 

<servlet> 

<servlet-name>Main Servlet</servlet-name> 

<servlet-class>com.mysql.Servlet</servlet-class> 

</servlet> 

<servlet-mapping> 

<servlet-name>Main Servlet</servlet-name> 

<url-pattern>/*</url-pattern> 

</servlet-mapping>


创建servletFilter的一半过程:
1.创建Filter过滤类。
2.在web.xml文件中配置filter。格式如上,或者是
@WebFilter(filterName="log",urlPatterns={"/index.jsp"})该代码放在包后边,后便开始书写正是代码
,在创建filter处理类时候,需要实现FIlter接口。是servlet.Filter下的接口,在该接口中定义了如下三个方法。
void  init(FilterConfig config):用于完成Filter的初始化,
void  destroy()用于Filter销毁前完成某些资源的回收。
void  doFilter(ServletRequest request,ServletResponse response,FilterChain chain)
配置时应注意:在配置Filter时需要分别配置Filter名和配置Filter拦截URL部分,配置Filter和配置Servelt是有区别的。servlet通常只配置一个url。
而Filter往往可以同时拦截多个不同的请求url,所以在配置Filter的url模式时通常会使用模式字符串,这样可以拦截多个请求。与配置Servlet相似的是,同样有如下两种
配置Filter的方式:
在Filter类中通过Annotation进行配置。
在web.xml文件中通过配置文件进行配置。
在默认配置Filter时候都是采用的是请求的方式来使过滤器工作。然而当存在<jsp:forward page=""></jsp:forward>
将不能使得其工作。如果想使其工作需要在<filter-mapping>下加入<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>,这样可以使其既可以请求有可以进行转发。


典型应用。
1.使浏览器不缓存页面。
使浏览器不缓存页面的过滤器
有3个Http响应头字段都可以禁止浏览器缓存当前页面,它们在servlet中实力代码如下:
response.setDataHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache")
并不是所有的浏览器都能完全支持上边的三个响应头,因此最好同时使用上边三个响应头。
2.字符编码集。
3.检测用户是否登陆的过滤器
情景:系统中某些页面只有在征程登陆后才可以使用,用户请求的这些页面时需要检查session中是否存在该用户信息
但在所有必要的页面加上session的判断相当的麻烦。
解决方法:编写一个用于检测用户是否登陆的过滤器,如果用户未登陆,则重新定向到指定的登陆页面。
要求:需检查的在Session中保存的关键字,如果用户未登陆,需要重定向到指定的url(url不包括ContextPath),不做检查的url列表,(以分号分开,并且
url中不包括ContextPath)都要采取可配置的方式。
1.首先在建立一个文件夹
里边包含a,b,c,d,e,login,list,dologin,等jsp页面
然后在web.xml文件中配置参数

<!-- 登陆的url --> 

 <context-param> 

<param-name>userSessionKey</param-name> 

<param-value>USERSESSIONKEY</param-value> 

 </context-param> 

 <!-- 若未登陆,需重定向到的页面 --> 

 <context-param> 

<param-name>redirectPage</param-name> 

<param-value>/login/login.jsp</param-value> 

 </context-param> 

 <!-- 不需要拦截的url列表 --> 

 <context-param> 

<param-name>uncheckedUrls</param-name> 

<param-value>/login/a.jsp,/login/list.jsp,/login/dologin.jsp,/login/login.jsp</param-value> 

 </context-param> 
  

<context-param>


2.建立过滤器类,并在web.xml文件中进行配置

<filter> 

<filter-name>login</filter-name> 

<filter-class>com.test.login.LoginFilter</filter-class> 

 </filter> 

 <filter-mapping> 

<filter-name>login</filter-name> 

<url-pattern>/login/*</url-pattern> 

 </filter-mapping>


3.编写过滤器内的核心代码

package com.test.login; 



 import java.io.IOException; 

 import java.util.Arrays; 

 import java.util.List; 



 import javax.servlet.Filter; 

 import javax.servlet.FilterChain; 

 import javax.servlet.FilterConfig; 

 import javax.servlet.ServletContext; 

 import javax.servlet.ServletException; 

 import javax.servlet.ServletRequest; 

 import javax.servlet.ServletResponse; 

 import javax.servlet.http.HttpServletRequest; 

 import javax.servlet.http.HttpServletResponse; 



 public class LoginFilter implements Filter { 

// 1.获取sessionKey,redirectUrl,uncheckedUrl, 

private String sessionkey; 

private String redirectUrl; 

private String uncheckedUrls; 



@Override 

public void destroy() { 

// TODO Auto-generated method stub 



} 



@Override 

public void doFilter(ServletRequest arg0, ServletResponse arg1, 

FilterChain arg2) throws IOException, ServletException { 

// TODO Auto-generated method stub 

// 1.获取请求的servletPath 

HttpServletRequest req = (HttpServletRequest) arg0; 

String requestURL = req.getRequestURL().toString(); 

// http://localhost:8080/Filter/login/list.jsp 

String requestURI = req.getRequestURI().toString(); 

// /Filter/login/list.jsp 

String servletPath = req.getServletPath(); 

// /login/list.jsp 

System.out.println(requestURL); 

System.out.println(requestURI); 

System.out.println(servletPath);




// 2.检查1获取的servletPath是否为不需要检查的url中的一个。如果是,则直接放行,方法结束

List<String> urls = Arrays.asList(uncheckedUrls.split(",")); 

for(int i=0;i<urls.size();i++){ 

System.out.println("遍历的List<String>"+urls.get(i)); 

} 

if (urls.contains(servletPath)) { 

arg2.doFilter(arg0, arg1); 

System.out.println("包含。。。。"); 

return; 

}



// 3.从session中获取sessionKey对应的值,若值不存在,则重定向到redirectUrl.


Object user = req.getSession().getAttribute(sessionkey); 

HttpServletResponse response = (HttpServletResponse) arg1; 

if (user == null) { 

response.sendRedirect(req.getContextPath()+redirectUrl); 

System.out.println(req.getContextPath()+redirectUrl); 

return; 

}




// 4若存在,则直接放行。

arg2.doFilter(arg0, arg1); 

} 



@Override 

public void init(FilterConfig arg0) throws ServletException { 

// TODO Auto-generated method stub 

ServletContext servletContext = arg0.getServletContext(); 

sessionkey = servletContext.getInitParameter("userSessionKey");//USERSESSIONKEY 

System.out.println("获取的userSessionKey"+sessionkey);// 

redirectUrl = servletContext.getInitParameter("redirectPage");//  /login/login.jsp 

System.out.println("获取的rediretPage"+redirectUrl); 

uncheckedUrls = servletContext.getInitParameter("uncheckedUrls");// /login/b.jsp,/login/c.jsp,/login/list.jsp,/login/dologin.jsp 

System.out.println("获取的uncheckedUrls"+uncheckedUrls); 

} 



 }


说明:该项目实现的作用就是利用过滤器对请求的页面就行筛选,其中只有a页面不用登陆就可以访问,其它的都要进行登陆后才可以进行访问,
其优点是,避免了在多个jsp页面重复进行判断是否有session对象的,减少了代码的冗余度,提高了运行效率。