什么是过滤器?
过滤客户端发送给服务端的请求
- 过滤器的使用:
* 进行IP的过滤,脏话过滤,自动登录,响应压缩...
- 使用过滤器:
* 编写一个类实现Filter接口:
* 配置过滤器:
- 过滤器的创建和销毁:
* 创建:服务器启动的时候.
* 销毁:服务器关闭的时候.
过滤器的 dispatcher 范围 ,可选 request forward include 默认request
<filter> <filter-name>GernericEncordingFilter</filter-name> <filter-class>com.filterpcg.GernericEncordingFilter</filter-class> </filter> <filter-mapping> <filter-name>GernericEncordingFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
案例:做个解决请求乱码的工具类
<%--
页面上
--%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Title</title>
</head>
<body>
<h1>表单一GET</h1>
<form action="${ pageContext.request.contextPath }/login" method="get">
用户名:<input id="username" name="username_g" type="text"/>
密码:<input type="password" id="password" name="password_g"/>
<input type="submit" value="提交" >
</form>
<h1>表单二POST</h1>
<form action="${ pageContext.request.contextPath }/login" method="post">
用户名:<input id="username_post" name="username_p" type="text"/>
密码:<input type="password" id="password_post" name="password_p"/>
<input type="submit" value="提交">
</form>
</body>
</html>
过滤器:
package com.filterpcg;
import com.itheima.utils.StrongHttpRequest;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class GernericEncordingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("GernericEncordingFilter is created");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//拦截到了 创建增强后的request
StrongHttpRequest stgrequest = new StrongHttpRequest((HttpServletRequest) servletRequest);
//放行
filterChain.doFilter(stgrequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("GernericEncordingFilter is destroy");
}
}
处理请求乱码增强类:
package com.itheima.utils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.UnsupportedEncodingException;
/*装饰者模式:
* 前提: 1.实现共同接口 2.增强类获得被增强类对象的引用
*
* 重写 要增强的方法
*
* */
public class StrongHttpRequest extends HttpServletRequestWrapper {
private HttpServletRequest strongHttpRequest;
public StrongHttpRequest(HttpServletRequest request) {
super(request);
this.strongHttpRequest = request;
}
@Override
public String getParameter(String name) {
String outname;
String method = strongHttpRequest.getMethod();
try {
if (method.equalsIgnoreCase("get")) {
outname = new String(strongHttpRequest.getParameter(name).getBytes("ISO-8859-1"), "UTF-8");
return outname;
} else {
strongHttpRequest.setCharacterEncoding("UTF-8");
outname =strongHttpRequest.getParameter(name);
}
} catch (Exception e) {
outname="";
}
return outname;
}
}
表单提交后处理的servlet:
package com.servlet.practice;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class FormBubmitServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username_g = req.getParameter("username_g");
System.out.println(username_g);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username_p = req.getParameter("username_p");
System.out.println(username_p);
}
}