java 内部类 监听器_java-过滤器和监听器

过滤器和监听器

主要内容

过滤器

介绍

Filter 即为过滤,用于在 Servlet 之外对 Request 或者 Response 进行修改。它主要用于对用户请求进行预处理,也可以对 HttpServletResponse 进行后处理。使用 Filter 的完整流程: Filter 对用户请求进行预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再 对服务器响应进行后处理。在一个 web 应用中,可以开发编写多个 Filter,这些 Filter 组合 起来称之为一个 Filter 链。

单个过滤器

多个过滤器

若是一个过滤器链:先配置先执行(请求时的执行顺序);响应时: 以相反的顺序执行。

在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改 HttpServletRequest 头和数据。

在HttpServletResponse 到达客户端之前,拦截 HttpServletResponse。根据需要检查 HttpServletResponse,也可以修改 HttpServletResponse头和数据。

实现

可以通过实现一个叫做javax.servlet.Fileter的接口来实现一个过滤器,其中定义了 三个方法,init(), doFilter(), destroy()分别在相应的时机执行。后期观察生命周期。

Filter 的实现只需要两步:

Step1: 编写 java 类实现 Filter 接口,并实现其 doFilter 方法。

Step2: 通过@WebFilter注解设置它所能拦截的资源。

@WebFilter("/*")

public class Filter01 implements Filter {

@Override

public void init(FilterConfig filterConfig) throws ServletException {

}

@Override

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

}

@Override

public void destroy() {

}

}

Filter 接口中有一个 doFilter 方法,当开发人员编写好 Filter,并配置对哪个 web 资源进行拦截后,Web 服务器每次在调用 web 资源的 service 方法之前,都会先调用一下 filter 的 doFilter 方法。因此可以达到如下效果:

调用目标资源之前,让一段代码执行。

是否调用目标资源(即是否让用户访问 web 资源)。

web 服务器在调用 doFilter 方法时,会传递一个 filterChain 对象进来,filterChain 对象是 filter 接口中最重要的一个对象,它提供了一个 doFilter 方法,开发人员可以根据需求决定 是否调用此方法,调用该方法,则 web 服务器就会调用 web 资源的 service 方法,即 web 资源就会被访问,否则 web 资源不会被访问。(本质是放行,调用doFilter方法后,即请求可以到达资源)

实例

请求乱码处理

/**

* 字符乱码处理

*  乱码情况:

Tomcat8及以上版本       Tomcat7及以下版本

POST请求  乱码,需要处理        乱码,需要处理

request.setCharacterEncoding("UTF-8");

GET请求

不会乱码,不需要处理       乱码,需要处理

new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");

如何处理:

1、处理POST请求

request.setCharacterEncoding("UTF-8");

2、处理GET请求且服务器版本在Tomcat8以下的

1> 得到请求类型 (GET请求)

2> 得到服务器的版本的信息

3> 判断是GET请求且Tomcat版本小于8

4> 处理乱码

new String(request.getParameter("参数名").getBytes("ISO-8859-1"),"UTF-8");

*/

@WebFilter("/*")

public class AEncodingFilter implements Filter {

public AEncodingFilter() {

}

public void destroy() {

}

public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {

// 基于HTTP

HttpServletRequest request = (HttpServletRequest) arg0;

HttpServletResponse response = (HttpServletResponse) arg1;

// 处理请求乱码乱码 (处理POST请求)

request.setCharacterEncoding("UTF-8");

// 处理GET请求且服务器版本在Tomcat8以下的

String method = request.getMethod();

// 如果是GET请求

if ("GET".equalsIgnoreCase(method)) {

// 服务器版本在Tomcat8以下的 Apache Tomcat/8.0.45

String serverInfo = request.getServletContext().getServerInfo();

// 得到具体的版本号

String versionStr = serverInfo.substring(serverInfo.indexOf("/")+1, serverInfo.indexOf("."));

// 判断服务器版本是否小于8

if (Integer.parseInt(versionStr) < 8) {

// 得到自定义内部类  (MyWapper继承了HttpServletRequestWapper对象,而HttpServletRequestWapper对象实现了HttpServletRequest接口,所以MyWapper的本质也是request对象)

HttpServletRequest myRequest = new MyWapper(request);

// 放行资源

chain.doFilter(myRequest, response);

return;

}

}

// 放行资源

chain.doFilter(request, response);

}

public void init(FilterConfig fConfig) throws ServletException {

}

/**

* 定义内部类,继承HttpServletRequestWrapper包装类对象,重写getParameter()方法

*/

class MyWapper extends HttpServletRequestWrapper {

// 定义成员变量,提升构造器 中的request对象的范围

private HttpServletRequest request;

public MyWapper(HttpServletRequest request) {

super(request);

this.request = request;

}

/**

* 重写getParameter()方法

*/

@Override

public String getParameter(String name) {

String value = request.getParameter(name);

if (value != null && !"".equals(value.trim())) {

try {

// 将默认ISO-8859-1编码的字符转换成UTF-8

value = new String(value.getBytes("ISO-8859-1"),"UTF-8");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

}

return value;

}

}

}

你可能感兴趣的:(java,内部类,监听器)