回顾Servlet之Filter
前提:
我是在基础的javaweb环境下进行的demo测试
在eclipse建一个动态的web工程
1.入门demo
1.1写一个自定义的Filter
说明:
Filter是一个接口
import javax.servlet.Filter;
在javax.servlet下,别导错包
- 自定义MyFilter实现Filter接口
package com.shaoming.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;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter 的 init 方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter 的 doFilter 方法");
}
@Override
public void destroy() {
System.out.println("Filter 的 destroy 方法");
}
}
- 在web.xml配置过滤器
说明:
web.xml配置过滤器和配置servlet差不多
/*
/* 表示拦截所有请求
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.shaoming.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
1.2写一个servlet进行测试
package com.shaoming.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// >>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
// >>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
// TODO...
// String filterName = request.getParameter("filtername");
// System.out.println("在servlet中获取filtername的值为: "+filterName);
String name = request.getParameter("name");
System.out.println("getParameter的name的值为: " + name);
System.out.println("MyServlet里面处理请求");
PrintWriter out = response.getWriter();
out.write("Helloworld 你好 世界!!!!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
说明:
此时访问http://localhost:8080/项目名称/MyServlet
该请求被拦截
1.3访问servlet测试
两种情况可以访问到MyServlet
1.3.1web.xml配置放行MyServlet
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.shaoming.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<!--拦截不到MyServlet-->
<url-pattern>/otherservlet</url-pattern>
</filter-mapping>
说明
/otherservlet
表示只拦截otherservlet,别的都放行
1.3.2使用Filer核心方法放行
在MyFilter的doFilter方法里面设置放行的方法
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter 的 doFilter 方法 before");
//放行
chain.doFilter(request, response);
System.out.println("Filter 的 doFilter 方法 after");
}
说明
放行的核心方法
chain.doFilter(request, response);
- 控制台打印:
Filter 的 doFilter 方法 before
getParameter的name的值为: null
MyServlet里面处理请求
Filter 的 doFilter 方法 after
1.4访问页面测试
- 定义一个html页面
testfilter.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>
测试过滤器是否拦截html页面
</h1>
</body>
</html>
-
访问http://localhost:8080/java-web2/testfilter.html
可以访问到该页面
结论:
过滤器过滤不了html等页面
2.Filter解决中文乱码
2.1 写一个自定义的Filter
package com.shaoming.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;
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("Filter 的 init 方法");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
System.out.println("Filter 的 doFilter 方法");
// >>处理POST请求参数乱码
request.setCharacterEncoding("utf-8");
System.out.println("处理POST请求参数乱码");
// >>处理响应正文乱码
response.setContentType("text/html;charset=utf-8");
System.out.println("处理响应正文乱码");
// TODO...
request.setAttribute("filtername", "MyFilter");
String name = (String) request.getAttribute("filtername");
System.out.println("filter里面的name的值为: "+name);
chain.doFilter(request, response);
System.out.println("doFilter after");
}
@Override
public void destroy() {
System.out.println("Filter 的 destroy 方法");
}
}
2.2 写一个servlet
package com.shaoming.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
*/
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//注释解决中文乱码的内容,让过滤器处理中文乱码
// >>处理POST请求参数乱码
//request.setCharacterEncoding("utf-8");
// >>处理响应正文乱码
// response.setContentType("text/html;charset=utf-8");
// TODO...
//获取不到Filter里面的参数的值
// String filterName = request.getParameter("filtername");
// System.out.println("在servlet中获取filtername的值为: "+filterName);
String name = request.getParameter("name");
System.out.println("getParameter的name的值为: " + name);
System.out.println("MyServlet里面处理请求");
PrintWriter out = response.getWriter();
out.write("Helloworld 你好 世界!!!!");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
2.3测试
- Filter不处理中文乱码
页面内容
Helloworld !!!
- Filter处理中文乱码
页面内容
Helloworld 你好 世界!!!