Filter(过滤器)之字符替换和编码设置
Filter(过滤器)之字符替换和编码设置
顾名思义,Filer的作⽤就是过滤,主要⽤于对⽤户请求进⾏预处理,也可以对HttpServletResponse进⾏后处理,是个典型的处理链.适⽤Filter完整的流程:Filter对⽤户请求进⾏预处理,接着将请求交给Servlet进⾏处理并响应,最后Filter再对服务器响应进⾏处理.
filter有以下⼏个种类:
1.⽤户授权的Filter:Filter负责检查⽤户请求,根据请求过滤⽤户⾮法请求.
2.在HttpServletRequest到达Servlet之前,拦截客户的HtttpServletRequest
3.根据需要检查HtttpServletRequest,也可以修改HtttpServletRequest头和数据1斤等于多少千克
4.在HtttpServletResponse到达客户端前,拦截HtttpServletResponse
5.负责解码的filter:包括对⾮标准编码的请求解码
一个芝麻糕 不如一针细
6.根据需要检查HtttpServletResponse,也可以修改HtttpServletResponse头和数据
7.filter可负责拦截多个请求或响应,⼀个请求或响应也可被多个Filter拦截.
创建⼀个Filter需要两个步骤:
1.创建Filter处理类
l⽂件中配置Filter
创建Filter类
创建Filter必须实现javax.servlet.Filter的初始化
void init(filterConfig config):⽤于完成Filter的初始化
void destroy():⽤于Filter销毁前,完成资源回收
void Filter(ServletRequest request,ServletResponse response,FilterChain chain);
实现过滤功能,该⽅法就是对每个请求及响应增加的额外处理
案例⼀:实现字符替换过滤器
对于容器产⽣的HttpServletRequest对象,⽆法直接修改某些信息,如请求参数值.就需要⾃⼰写⽅法来实现
但是httpServletWrapper实现了HttpServlet⼏⼝,只要继承httpServletWrapper类,并编写重新定义的⽅法即可
如下图:
输⼊:
<a href="www.w3school/">www.w3school</a>
提交后:
发现⽂本内容变成了超链接,原本⽂本域输出的效果应该是:
因此这⾥就需要将⼀些html过滤掉,如将<,>⾓括号换为HTML实体字符<;与>,如果不想改程序,就可以直接⽤过滤器的⽅式,将⽤户请求参数中的⾓括号字符进⾏替换掉.
过滤替换并不需要我们来实现,可以直接适⽤APache Commons Lang程序库中,StringEscapeUtils.escapeHtml(String value)⽅法进⾏替换,可以从⽹盘下载解压放到lib⽂件夹中即可.
链接:pan.baidu/s/1m_Nt4LLkORpubfPGMb_Qgw 密码:4zo9
或者可以从官⽹下载:
在容器调⽤Servlet的service⽅法之前,Servlet并不知道有请求的到来,⽽在Servlet的service()⽅法运⾏后,容器真正对浏览器进
⾏HTTP响应之前,浏览器也不会知道Servlet真正的响应是什么.Filter可拦截过滤浏览器对Servlet的请求,也可以改变Servlet对浏览器的响应.
换句话说,我们提交请求参数后,需要要让getParameter()返回过滤后的请求参数值,我们可以重写这个⽅法来实现.
EscapeWrapper.java(字符替换,重写getParameter()⽅法)
package Servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apachemons.lang3.StringEscapeUtils;
/**
* Servlet implementation class EscapeWrapper
*/
@WebServlet("/EscapeWrapper")
public class EscapeWrapper extends HttpServletRequestWrapper {
@Override
public String getParameter(String name) {
String value = getRequest().getParameter(name);
return StringEscapeUtils.escapeHtml4(value);
}
/
**
* @see HttpServletRequestWrapper#HttpServletRequestWrapper(HttpServletRequest)
*/
public EscapeWrapper(HttpServletRequest request) {
super(request);
// TODO Auto-generated constructor stub
}
}
EscapeFilter.java(进⾏拦截,调⽤请求封装器进⾏过滤)
原理:filter接⼝的doFilter⽅法类似于Servlet接⼝的service()⽅法.当请求来到容器,⽽容器发现调⽤Servlet的service()⽅法前,可以应⽤某过滤器时,就会先调⽤改过滤器的doFilter()⽅法.filterChain运⾏后会以堆栈顺序返回
package javax.servlet;
import java.io.IOException;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import Servlet.EscapeWrapper;
@WebFilter("/*")
public class EscapeFilter implements Filter{
@Override
public void destroy() {
// TODO Auto-generated method stub
控制科学与工程
Filter.super.destroy();
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest  requestWrapper = new EscapeWrapper((HttpServletRequest)request);
籍贯是指什么/
*如果调⽤了FilterChain的doFilter()⽅法,就会运⾏下⼀个过滤器,如果没有下⼀个,就调⽤请求⽬标Sevlet的service()⽅法*/  chain.doFilter(requestWrapper, response);
}
}
testFilter.jsp(提交⽂本域)
<%@ page language="java" contentType="text/html; charset=UTF-8"
公斤
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="TestFilter" method="post">
<input type="text" name="text">
<input type="submit" value="提交">
</form>
</body>
</html>
showText.jsp(显⽰⽂本域信息)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "/TR/html4/loose.dtd"> <html>
<head>
糟鱼<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=Attribute("name") %>
</body>
</html>
TestFilter.java(控制器)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。