过滤器

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类的方法

 

posted @ 2014-10-26 00:41  博客园杀手  阅读(174)  评论(0编辑  收藏  举报