过滤器

  生命周期:初始化 -----过滤-------销毁

  作用:过滤url ,特定字符

  创建方式:实现一个接口继承Filter 

package com.baidu.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest; public class Demo01 implements Filter { public void destroy() {
System.out.println("过滤销毁");
} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("请求过滤");
MyHttpServletRequest msr=new MyHttpServletRequest((HttpServletRequest)request);
chain.doFilter(msr, response);
System.out.println("响应过滤");
} /**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
System.out.println("过滤器初始化");
} }

  

    配置过滤器(web.xml)

        和配置servlet相似。

<filter>
<filter-name>Demo01</filter-name>
<filter-class>com.baidu.filter.Demo01</filter-class>
</filter>
<filter-mapping>
<filter-name>Demo01</filter-name>
<url-pattern>/*</url-pattern>//可以设置经过过滤器的url /*表示项目下的所有路径都得经过过滤器
</filter-mapping>

      过滤器在web中的位置

    浏览器        < ------------ >         过滤器              < ------------   >              服务器

  注意事项

    1.配置文件中会配置Filter过滤器的位置只要符合其位置就会经过过滤器

    2.请求完成以后响应动作也会经过过滤器

  使用过滤器来修改编码格式,这样就不需要用每个servlet中去修改编码格式了

    

(使用的装饰者设计模式来实现)
package com.baidu.filter;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; public class MyHttpServletRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public MyHttpServletRequest(HttpServletRequest request) {
super(request);
this.request=request;
}
@Override
public String getParameter(String name) {
//判断提交方式(get/post)
String method = request.getMethod();
if ("Get".equalsIgnoreCase(method)) {
String value = super.getParameter(name);
try {
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return value;
}
if ("post".equalsIgnoreCase(method)) {
try {
System.out.println(request.getCharacterEncoding());
request.setCharacterEncoding("UTF-8");
//value = super.getParameter(name);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return super.getParameter(name);
} }

  使用动态代理来实现实现类的增强

public class GenericEncodingFilter implements Filter {

	@Override
public void init(FilterConfig filterConfig) throws ServletException { } @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
final HttpServletRequest req = (HttpServletRequest) request;
// 增强req:(使用匿名内部类)
HttpServletRequest myReq = (HttpServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(),
req.getClass().getInterfaces(), new InvocationHandler() { @Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 判断执行的方法是否是getParameter:
if("getParameter".equals(method.getName())){
// 调用的是getParameter:需要增强这个方法.
// 判断请求方式是GET还是POST:
String type = req.getMethod();
if("get".equalsIgnoreCase(type)){
String value = (String) method.invoke(req, args);
value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
return value;
}else if("post".equalsIgnoreCase(type)){
req.setCharacterEncoding("UTF-8");
}
}
return method.invoke(req, args);
}
}); chain.doFilter(myReq, response);
} @Override
public void destroy() { } }

  

day22(过滤器Filter)的更多相关文章

  1. Angularjs在控制器(controller.js)的js代码中使用过滤器($filter)格式化日期/时间实例

    Angularjs内置的过滤器(filter)为我们的数据信息格式化提供了比较强大的功能,比如:格式化时间,日期.格式化数字精度.语言本地化.格式化货币等等.但这些过滤器一般都是在VIEW中使用的,比 ...

  2. 网站过滤器Filter

    实际上,Filter与Servlet及其相似,区别只是FIlter的doFilter()方法里多了一个FilterChain的参数,通过该参数可以控制是否放行用户的请求.网站有了过滤器十分的方便,可以 ...

  3. paip.输出内容替换在Apache 过滤器filter的设置

    paip.输出内容替换在Apache 过滤器filter的设置 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog ...

  4. java Servlet中的过滤器Filter

    web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...

  5. [ionic开源项目教程] - 第6讲 过滤器filter的使用

    过滤器filter的使用 1.回顾 再熟悉一下tab1.html的代码: <div class="list"> <a ng-repeat="item i ...

  6. selvert的过滤器filter处理中文乱码

    注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处 ...

  7. MVC之 自定义过滤器(Filter)

    MVC之 自定义过滤器(Filter) 一.自定义Filter 自定义Filter需要继承ActionFilterAttribute抽象类,重写其中需要的方法,来看下ActionFilterAttri ...

  8. Servlet中的过滤器Filter用法

    1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...

  9. Servlet中的过滤器Filter详解

    加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...

随机推荐

  1. Linux执行命令时遇到的些问题

    1.执行lsb_release -a,提示 未安装lsb_release导致的,执行一下yum install redhat-lsb -y,问题解决 2.配置tomcat站点后重启tomcat,提示找 ...

  2. kubadm创建k8s v1.10集群

    kubadm创建k8s集群 1:服务器信息以及节点介绍 主机名 ip 备注 k8s-master 192.168.0.104 master etcd keepalived k8s-client1 19 ...

  3. [转]安装 Silverlight 5/silverlight4 出错的解决方法

    安装Silverlight 5时,如果 如图: 安装Silverlight 5时,如果你的VS不是英文版,那么可能会出现以下错误: Visual Studio 2010 SP1 that matche ...

  4. 搭建自己的代理服务 proxy nginx squid ss5 s(shadow)s(socks)

    标签: nginx / squid / 负载均衡 / ss 4090 1. nginx (forward) nginx自己熟悉,经常用来做负载均衡的反向代理, 这里搭建一个正向代理(forward) ...

  5. html 转化成 pdf

  6. yii2.0增删改查

    //关闭csrf public $enableCsrfValidation = false; 1.sql语句 //查询 $db=\Yii::$app->db ->createCommand ...

  7. [ES]elasticsearch章2 ES查询过程解析

    es服务端是准确知道每个document分布在哪个shard上: search一个比较复杂的执行模式,因为我们不知道那些document会被匹配到,任何一个shard上都有可能,所以一个search请 ...

  8. 连接db2数据库出现No buffer space available (maximum connections reached?)

    Caused by: javax.naming.NamingException: [jcc][t4][2043][11550][3.57.82] 异常 java.net.SocketException ...

  9. 操作Float的BigDecimal加减乘除

    bignum3 =  bignum1.add(bignum2);     //加 bignum3 = bignum1.subtract(bignum2);  减 bignum3 = bignum1.m ...

  10. delphi 中的win32 以外到平台的字符串处理一定慢吗?(转载)

    原始连接:http://rvelthuis.blogspot.tw/2018/01/strings-on-other-platforms-than-32-bit.html Strings too sl ...