过滤器
Filter过滤器学习笔记
知识概要:
一:什么是过滤器
二:过滤器的工作原理
三:过滤器的执行过程和生命周期
四:过滤器的编写步骤
五:过滤器的四个简单的案例
一:什么是过滤器呢
Web过滤器是向Web应用程序的请求和响应处理添加功能的Web服务组件
对请求和响应进行拦截处理。
二:过滤器的工作原理
三:过滤器的执行过程和生命周期
1、过滤器是在应用启动时就完成了实例化和初始化
2、对于过滤范围内资源的每次访问都会调用doFilter
3、应用被卸载时会调用destory方法
四:过滤器的编写步骤过滤器的编写和servlet一模一样
public class FilterDemo1 implements Filter {//实现一个Filter接口 //由容器调用,完成过滤器销毁时的清理工作 public void destroy() { // TODO Auto-generated method stub
} //由容器调用,每次请求和响应都会经过此方法。 public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub System.out.println("执行过滤器前"); chain.doFilter(arg0, arg1); System.out.println("执行过滤器后"); } //由容器调用,完成过滤器初始化 public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } 2. 在Web.xml 文件中做配置 <filter> <filter-name>FilterDemo1</filter-name> <filter-class>com.itheima.filter.FilterDemo1</filter-class> </filter> <filter-mapping> 顺序以此标签出现的顺序为准
<filter-mapping> <filter-name>FilterDemo1</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
五:过滤器的四个案例(简单)
1.解决POST请求参数中文和输出中文的乱码过滤器:FilterConfig
public class SetCharacterEncodingFilter implements Filter {
public void destroy(){
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { String value = filterconfig.getInitParameter("encoding"); if(value==null) { value = "UTF-8"; } request.setCharacterEncoding(value); response.setContentType("text/html;charset="+value); chain.doFilter(request, response); } private FilterConfig filterconfig; public void init(FilterConfig filterconfig) throws ServletException { this.filterconfig = filterconfig; }
} Web.xml <filter> <filter-name>SetCharacterEncodingFilter</filter-name> <filter-class>com.itheima.filter.SetCharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>SetCharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
2、控制动态资源不要缓存
public class DynamicResourcesNoCacheFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request; HttpServletResponse response; try { request = (HttpServletRequest)req; response = (HttpServletResponse)res; }catch(Exception e) { throw new RuntimeException("Is not a http request"); } response.setDateHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); chain.doFilter(request, response); }
public void init(FilterConfig arg0) throws ServletException {
Web.xml <filter> <filter-name>DynamicResourcesNoCacheFilter</filter-name> <filter-class>com.itheima.filter.DynamicResourcesNoCacheFilter</filter-class> </filter> <filter-mapping> <filter-name>DynamicResourcesNoCacheFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>DynamicResourcesNoCacheFilter</filter-name> <url-pattern>/servlet/*</url-pattern> </filter-mapping> |
3、控制静态资源的缓存时间过滤器
public class StaticResourcesNeedCache implements Filter { private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; }
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request; HttpServletResponse response; try{ request = (HttpServletRequest)req; response = (HttpServletResponse)res; }catch(ClassCastException e){ throw new RuntimeException("non-http request"); } long time = 0;//缓存的时间毫秒 //根据用户的访问资源的类型,读取对应的参数的值,设置缓存的时间 String uri = request.getRequestURI();// /day19_00_filter/1.html String subname = uri.substring(uri.lastIndexOf(".")+1);//截取扩展名 //获取配置文件中的对应的缓存时间 if("html".equals(subname)){ //说明访问的是html文件 String value = filterConfig.getInitParameter(subname); time = Long.parseLong(value)*60*60*1000; } if("css".equals(subname)){ //说明访问的是html文件 String value = filterConfig.getInitParameter(subname); time = Long.parseLong(value)*60*60*1000; } if("js".equals(subname)){ //说明访问的是html文件 String value = filterConfig.getInitParameter(subname); time = Long.parseLong(value)*60*60*1000; } response.setDateHeader("Expires", System.currentTimeMillis()+time); chain.doFilter(request, response); } Web.xml <filter> <filter-name>StaticResourcesNeedCache</filter-name> <filter-class>com.itheima.filter.StaticResourcesNeedCache</filter-class> <init-param> <param-name>html</param-name> <param-value>1</param-value><!-- 小时 --> </init-param> <init-param> <param-name>js</param-name> <param-value>2</param-value><!-- 小时 --> </init-param> <init-param> <param-name>css</param-name> <param-value>3</param-value><!-- 小时 --> </init-param> </filter> <filter-mapping> <filter-name>StaticResourcesNeedCache</filter-name> <url-pattern>*.html</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StaticResourcesNeedCache</filter-name> <url-pattern>*.css</url-pattern> </filter-mapping> <filter-mapping> <filter-name>StaticResourcesNeedCache</filter-name> <url-pattern>*.js</url-pattern> </filter-mapping> <servlet>
|
4、自动登录的过滤器
见老师的代码:略;
六:MD5加密 SHA加密 编码
/** * MD5加密算法的应用 * @param message * @return */ public static String md5(String message){ try { MessageDigest md = MessageDigest.getInstance("md5"); byte[] b = md.digest(message.getBytes());//message的信息摘要(指纹)。不一定有对应的(任何码表)字符 BASE64Encoder base64Encoder = new BASE64Encoder(); //把任何的二进制转换成字符串 return base64Encoder.encode(b); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(); } } /** * SHA算法 * @param message * @return */ public static String SHA(String message){ try { MessageDigest md = MessageDigest.getInstance("sha"); byte b[] = md.digest(message.getBytes()); BASE64Encoder base64Encoder = new BASE64Encoder(); return base64Encoder.encode(b); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } /**编码 * base64 * @param str * @return */ public static String base64Encode(String str){ return new BASE64Encoder().encode(str.getBytes()); } public static String base64Decode(String str) { try { byte[] b = new BASE64Decoder().decodeBuffer(str); return new String(b); } catch (IOException e) { throw new RuntimeException(e); } } |
MyEclipse找到base64类的方法