Filter的应用

Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器端程序,主要的用途是过滤字符编码、做一些业务逻辑判断等。其工作原理是,只要你在web.xml文件配置好要拦截的客户端请求,它都会帮你拦截到请求,此时你就可以对请求或响应(Request、Response)统一设置编码,简化操作;同时还可进行逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等工作。它是随你的web应用启动而启动的,只初始化一次,以后就可以拦截相关请求,只有当你的web应用停止或重新部署的时候才销毁。

一、Filter在页面编码的应用

private FilterConfig filterConfig;
private String defaultCharSet = "UTF-8";
String charSet =null;
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

charSet = filterConfig.getInitParameter("charSet");
if(charSet == null){

charSet = defaultCharSet;
}

//1.解决post提交 的乱码
request.setCharacterEncoding(charSet);
response.setCharacterEncoding(charSet);
response.setContentType("text/html;charset="+charSet);

chain.doFilter(new MyRequest(request), response);

}

class MyRequest extends HttpServletRequestWrapper{

private HttpServletRequest request;

public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}

@Override
public String getParameter(String name) {

String value = this.request.getParameter(name);
if(value==null){
return null;
}

if(!this.request.getMethod().equalsIgnoreCase("get")){
return value;
}

try {
value = new String(value.getBytes("iso8859-1"),charSet);
return value;
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}

}

public void init(FilterConfig filterConfig) throws ServletException {

this.filterConfig = filterConfig;
}

二、Filter在用户自动登录中的应用

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

//1.检查用户是否登陆
User user = (User) request.getSession().getAttribute("user");
if(user!=null){
chain.doFilter(request, response);
return;
}

//2.检查用户是否带自动登陆的cookie过来
Cookie autoLoginCookie = null;
Cookie cookies[] = request.getCookies();
for(int i=0;cookies!=null&&i<cookies.length;i++){
if(cookies[i].getName().equals("autoLogin")){
autoLoginCookie = cookies[i];
}
}
if(autoLoginCookie==null){
chain.doFilter(request, response);
return;
}

//3.用户带自动登陆cookie来了,但是cookie值不正常
String value = autoLoginCookie.getValue();
if(value.split("\\:").length!=3){
chain.doFilter(request, response);
return;
}

//3.用户带自动登陆cookie来了,并且cookie正常,则程序帮用户完成自动登陆
String username = value.split("\\:")[0];
long expiresTime = Long.parseLong(value.split("\\:")[1]);
String md5value = value.split("\\:")[2];

//4.判断cookie的有效期是否过期
if(expiresTime>=System.currentTimeMillis()){
chain.doFilter(request, response);
return;
}

//5.得到服务器中相对应的MD5的值
UserDao dao = new UserDao();
user = dao.find(username);
String password = user.getPassword();
String server_md5value = md5(username + ":" + expiresTime + ":" + password);

//6.md5值不相等
if(!server_md5value.equals(md5value)){
chain.doFilter(request, response);
return;
}

request.getSession().setAttribute("user", user);
chain.doFilter(request, response);

}

三、Filter控制浏览器缓存js\css\jpg等文件中的应用

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

//1.得到请求的是什么资源 css js jpg
String uri = request.getRequestURI();
if(uri.endsWith(".css")){
long expriesTime = Integer.parseInt(this.config.getInitParameter("css"))*1000;
response.setDateHeader("expires", System.currentTimeMillis()+expriesTime);
}else if(uri.endsWith(".js")){
long expriesTime = Integer.parseInt(this.config.getInitParameter("js"))*1000;
response.setDateHeader("expires", System.currentTimeMillis()+expriesTime);
}else if(uri.endsWith(".jpg")){
long expriesTime = Integer.parseInt(this.config.getInitParameter("jpg"))*1000;
response.setDateHeader("expires", System.currentTimeMillis()+expriesTime);
}
chain.doFilter(request, response);
}

四、Filter压缩文件的应用

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

//getOuputStream MyServletOutputStream
//getWriter MyWriter

//创建response,捕获目标资源输出的数据
MyResponse myresponse = new MyResponse(response);

chain.doFilter(request, myresponse);

//得到目标资源输出
byte resouceData[] = myresponse.getBuffer();
System.out.println("原始大小:" + resouceData.length);

//压缩数据
byte gzipData[] = gzip(resouceData);

//输出压缩数据给浏览器
response.setHeader("Content-Encoding", "gzip");
response.setContentLength(gzipData.length);
response.getOutputStream().write(gzipData); //utf-8

}

public byte[] gzip(byte src[]) throws IOException{
ByteArrayOutputStream bout = new ByteArrayOutputStream();

GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(src);
gout.close();

return bout.toByteArray();

}

class MyResponse extends HttpServletResponseWrapper{

private HttpServletResponse response;

private ByteArrayOutputStream bout = new ByteArrayOutputStream();

private PrintWriter pw = null;

public MyResponse(HttpServletResponse response) {
super(response);
this.response = response;
}

@Override
public ServletOutputStream getOutputStream() throws IOException {
return new MyServletOuputStream(bout);
}

@Override
public PrintWriter getWriter() throws IOException {
pw = new PrintWriter(new OutputStreamWriter(bout,this.response.getCharacterEncoding())); //printWriter.writer("中国");
return pw;
}

public byte[] getBuffer(){
if(pw!=null){
pw.close();
}
return bout.toByteArray();
}

}

class MyServletOuputStream extends ServletOutputStream{

private ByteArrayOutputStream bout; //FileOuputStream
public MyServletOuputStream(ByteArrayOutputStream bout){
this.bout = bout;
}
@Override
public void write(int b) throws IOException {
bout.write(b);
}

}

五、Filter过滤敏感词汇的应用

private List<String> banWords = new ArrayList(); //保存用于匹配所有禁用词的正则表达式
private List<String> auditWords = new ArrayList(); //审核词
private List<String> replaceWords = new ArrayList(); //替换词

public void init(FilterConfig filterConfig) throws ServletException {
try{
String path = WordsFilter.class.getClassLoader().getResource("cn/itcast/words").getPath();
File filepath = new File(path);
File files[] = filepath.listFiles();
for(File f : files){
if(!f.getName().endsWith(".txt")){
continue;
}
BufferedReader br = new BufferedReader(new FileReader(f));
String line = null;
while((line=br.readLine())!=null){
String values[] = line.trim().split("\\|");
if(values.length!=2){
continue;
}
String word = values[0];
String type = values[1];

if(type.trim().equals("1")){
banWords.add(word);
}else if(type.trim().equals("2")){
auditWords.add(word);
}else if(type.trim().equals("3")){
replaceWords.add(word);
}
}
}

System.out.println("haha");

}catch (Exception e) {
throw new RuntimeException(e);
}

}

public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;

//1.检查用户的请求数据中是否包含禁用词,包含禁用词则直接跳转到消息显示页面
Enumeration e = request.getParameterNames();
while(e.hasMoreElements()){
String value = request.getParameter((String) e.nextElement()); //你生小孩子没屁眼
if(value==null){
continue;
}
for(String pattern : banWords){
Pattern p = Pattern.compile(pattern); //得到一个代表pattern的正则表达式对象
Matcher m = p.matcher(value); //得到与字符串相匹配的匹配器
if(m.find()){
request.setAttribute("message", "请文明用词!!!");
request.getRequestDispatcher("/message.jsp").forward(request, response);
return;
}
}
}

chain.doFilter(new MyRequest(request), response);
}

class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
public MyRequest(HttpServletRequest request) {
super(request);
this.request = request;
}
@Override
public String getParameter(String name) {
String value = this.request.getParameter(name); //帮用户获取它所需的数据
//对数据进行检查,如果发现包含审核或替词,则分别高亮、替换后再把数据返回给用户
if(value==null){
return null;
}

//检查是否包含审核词
for(String pattern : auditWords){ //吃.{0,2}人
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(value);
while(m.find()){ //调用匹配器的方法检查value中是否包含审核数据
String data = m.group(); //返回value中与正则表达式匹配的数据
value = value.replaceAll(data, "<font color=‘red‘>"+data+"</font>");
}
}

//检查是否包含替换词
for(String pattern : replaceWords){ //吃.{0,2}人
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(value);
while(m.find()){ //调用匹配器的方法检查value中是否包含审核数据
String data = m.group(); //返回value中与正则表达式匹配的数据
value = value.replaceAll(data, "*******");
}
}
return value;
}
}

时间: 2024-11-16 23:59:11

Filter的应用的相关文章

Jsp通过Filter实现UrlRewriter原理

web.xml文件: 1 <?xml version="1.0" encoding="UTF-8"?> 2 <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=&q

JQ中find()与filter()的区别

刚开始学的时候,对于find()和filter()有点理不清楚,下面通过案例相信就可以很快的区分清楚 以下是代码 find弹出的是 filter()弹出的是 下面我们添加div的class是rain find()弹出结果是 fliter弹出结果是 通过以上案例,我们就清楚的知道,find()是查找某个元素内部的元素 filter()查找的是某个元素的自身,而不是内部的元素

spark 教程三 spark Map filter flatMap union distinct intersection操作

RDD的创建 spark 所有的操作都围绕着弹性分布式数据集(RDD)进行,这是一个有容错机制的并可以被并行操作的元素集合,具有只读.分区.容错.高效.无需物化.可以缓存.RDD依赖等特征 RDD的创建基础RDD 1.并行集合(Parallelized Collections):接收一个已经存在的Scala集合,然后进行各种并行运算 var sc=new SparkContext(conf) var rdd=sc.parallelize(Array(2,4,9,3,5,7,8,1,6)); rd

struts2 版本所导致的 Filter 不同

过了好久又重新接触Struts2,使用maven直接获取的struts2-core-2.5.1的包,从网上直接copy了一段web.xml中的Filter,结果报错,struts2.3.x  以后用以下配置: 1 <filter> 2 <filter-name>struts2</filter-name> 3 <filter-class> 4 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExe

web.xml 中的listener、filter、servlet加载及一些配置

在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是,加载顺序与它们在 web.xml 文件中的先后顺序无关.即不会因为 filter 写在 listener 的前面而会先加载 filter.最终得出的结论是:listener -> filter -> servlet 同时还存在着这样一种配置节:context-param,它用于向 Servlet

Java Web开发——Filter过滤器

一.过滤器 1.1定义 过滤器是一个服务器端的组件,它可以截取用户端的请求与响应信息,并对这些信息进行过滤. 1.2工作原理 1.项目启动时,从Web容器中加载过滤器: 2.过滤器存在于用户请求和Web资源之间: 3.用户请求和Web响应之间的收发都经由过滤器按照过滤规则进行过滤筛选. 1.3过滤器的生命周期 实例化(web.xml加载)→初始化(init方法)→过滤(doFilter方法)→销毁(destroy方法) 1.初始化:当容器第一次加载该过滤器时,init() 方法将被调用.该类在这

【JavaWeb学习】过滤器Filter

一.简介 Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能.例如实现URL级别的权限访问控制.过滤敏感词汇.压缩响应信息等一些高级功能. Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter.通过Filter技

Python-lambda函数,map函数,filter函数

lambda函数主要理解: lambda 参数:操作(参数). lambda语句中,冒号前是参数,可以有多个,用逗号隔开,冒号右边的返回值.lambda语句构建的其实是一个函数对象 map函数: map(function_to_apply, list_of_inputs).map函数可以把list_of_inputs内的对象依次输入到function_to_apply中进行操作. filter函数: filter(function_to_apply, list_of_inputs).Filter

Filter与Servlet的区别和联系

Filter的执行顺序与实例 Filter介绍 Filter可认为是Servlet的一种“变种”,它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理,是个典型的处理链.它与Servlet的区别在于:它不能直接向用户生成响应.完整的流程是:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理. Filter有如下几个用处. 在HttpServletRequest到达Servlet之前,拦截客

Filter简单过滤器的实现

1.过滤器简单编写 package cn.buaa.core.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 ja