Servlet过滤器介绍之实用过滤器

6.禁止站点过滤器

如果你希望在你的过滤器检测到不正常的异常而中途中断后面的过滤过程时,可这样做:

public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain) throws ServletException, IOException {
   HttpServletRequest req = (HttpServletRequest) request;
   HttpServletResponse res = (HttpServletResponse) response;
   if (isUnusualCondition(req)) {
    res.sendRedirect("http://www.somesite.com");
   } else {
    chain.doFilter(req, res);
   }
}

下例是一个禁止站点过滤器,如果不希望某些站点访问你的网站,你可以在web.xml的 param-value中列出它的站点,然后应用上面的原理跳出常规过滤,给出禁止访问的页面。

BannedAccessFilter.java

package com.zj.sample;
import java.io.IOException;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashSet;
import java.util.StringTokenizer;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
public class BannedAccessFilter implements Filter {
    private HashSet<String> bannedSiteTable;
/**
* Deny access if the request comes from a banned site or is referred here
* by a banned site.
 */
    public void doFilter(ServletRequest request, ServletResponse response,
           FilterChain chain) throws ServletException, IOException {
       System.out.println("Within BannedAccessFilter:Filtering the Request...");
       HttpServletRequest req = (HttpServletRequest) request;
       String requestingHost = req.getRemoteHost();
       String referringHost = getReferringHost(req.getHeader("Referer"));
       String bannedSite = null;
       boolean isBanned = false;
       if (bannedSiteTable.contains(requestingHost)) {
           bannedSite = requestingHost;
           isBanned = true;
       } else if (bannedSiteTable.contains(referringHost)) {
           bannedSite = referringHost;
           isBanned = true;
       }
       if (isBanned) {
           showWarning(response, bannedSite);
       } else {
           chain.doFilter(request, response);
       }
       System.out.println("Within BannedAccessFilter:Filtering the Response...");
    }
/**
* Create a table of banned sites based on initialization parameters.
* Remember that version 2.3 of the servlet API mandates the use of the
* Java  2 Platform. Thus, it is safe to use HashSet (which determines
* whether a given key exists) rather than the clumsier Hashtable
* (which has a value for each key).
*/
    public void init(FilterConfig config) throws ServletException {
       bannedSiteTable = new HashSet<String>();
       String bannedSites = config.getInitParameter("bannedSites");
       // Default token set: white space.
       StringTokenizer tok = new StringTokenizer(bannedSites);
       while (tok.hasMoreTokens()) {
           String bannedSite = tok.nextToken();
           bannedSiteTable.add(bannedSite);
           System.out.println("Banned " + bannedSite);
       }
    }
    public void destroy() {}
    private String getReferringHost(String refererringURLString) {
       try {
           URL referringURL = new URL(refererringURLString);
           return (referringURL.getHost());
       } catch (MalformedURLException mue) { // Malformed or null
           return (null);
       }
    }
    // Replacement response that is returned to users
    // who are from or referred here by a banned site.
    private void showWarning(ServletResponse response, String bannedSite)
           throws ServletException, IOException {
       response.setContentType("text/html");
       PrintWriter out = response.getWriter();
       String docType = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
              + "Transitional//EN\">\n";
       out.println(docType + "<HTML>\n"
              + "<HEAD><TITLE>Access Prohibited</TITLE></HEAD>\n"
              + "<BODY BGCOLOR=\"WHITE\">\n" + "<H1>Access Prohibited</H1>\n"
              + "Sorry, access from or via " + bannedSite + "\n"
              + "is not allowed.\n" + "</BODY></HTML>");
    } 

}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索servlet
, string
, hashset
, response
, java 过滤器
, import
, servletexception
, 过滤器介绍
HttpServletRequest
servlet过滤器、servlet过滤器的作用、servlet过滤器配置、servlet过滤器排除、servlet编码过滤器,以便于您获取更多的相关知识。

时间: 2024-10-24 16:29:57

Servlet过滤器介绍之实用过滤器的相关文章

.NET Web开发之.NET MVC框架介绍_实用技巧

MVC概念 MVC是一种架构设计模式,该模式主要应用于图形化用户界面(GUI)应用程序.那么什么是MVC?MVC由三部分组成:Model(模型).View(视图)及Controller(控制器). Model即应用程序的数据模型.任何应用程序都离不开数据,数据可以存储在数据库中.磁盘文件中,甚至内存中.Model就是对这些数据的抽象,不论数据采取何种存储形式,应用程序总是能够通过Model来对数据进行操作,而不必关心数据的存储形式.数据实体类就是常用的一种Model.例如,一个客户管理应用程序使

Servlet过滤器介绍之原理分析

1.Servlet过滤器 1.1 什么是过滤器 过滤器是一个程序,它先于与之相关的servlet或JSP页面运行在服务器上.过滤器可附加 到一个或多个servlet或JSP页面上,并且可以检查进入这些资源的请求信息.在这之后,过 滤器可以作如下的选择: ①以常规的方式调用资源(即,调用servlet或JSP页面). ②利用修改过的请求信息调用资源. ③调用资源,但在发送响应到客户机前对其进行修改. ④阻止该资源调用,代之以转到其他的资源,返回一个特定的状态代码或生成替换输出. 1.2 Servl

ASP.NET过滤器的应用方法介绍_实用技巧

在J2EE Web开发中有过滤器filter,该filter可以对指定的URL访问进行拦截,并执行过滤器的方法,根据实际应用情况,在过滤器中修改请求的代码.判断会话信息,也可以做权限控制,总之这个过滤器是非常有意义的,也可以说是责任链设计模式在J2EE中的一个应用.   那么在ASP.NET中是否也可以定义这样的过滤器结构,并在过滤器中进行相应的逻辑操作呢?答案是肯定,本文将告诉你如果编写一个过滤器,又如何配置到IIS的Web应用之中. 过程一:如何编写过滤器   编写过滤器,其实就是编写一个过

TrieTree服务-组件构成及其作用介绍_实用技巧

上一篇中我们对TrieTree服务有了一个整体的了解,不知道大家下载完之后有没有真正玩过这个TrieTree服务,如果你还没有玩过,没关系,本文将一步步教你配置和使用TrieTree服务. TrieTree服务由几大组件组成,如下图 Dictionary组件是核心库,主要提供基本数据定义.配置信息定义,数据结构表示,同时也提供了POSType(参考Pangu的Part of Speech定义).由于TrieTree是利用内存来加载数据的,所以这个组件的设计直接决定了内存的占用大小和数据查询性能.

全面介绍javascript实用技巧及单竖杠_javascript技巧

JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新手开发者被各种强大的 JavaScript 框架吸引进来,但他们却忽略了框架身后浩如星海的 JavaScript 实用技巧.本文将为你全面的介绍其中的知识点. 一.js整数的操作 使用|0和~~可以将浮点转成整型且效率方面要比同类的parseInt,Math.round 要快,在处理像素及动画位移等

ASP.NET的实用技巧详细介绍_实用技巧

关于ASP.NET的实用技巧,其实我们已经接触到很多了.下面为大家总结一下,供大家参考. 1.跟踪页面执行 设置断点是页面调试过程中的常用手段,除此之外,还可以通过查看页面的跟踪信息进行错误排查以及性能优化.ASP.NET中启用页面跟踪非常方便,只需在Page指令中加入Trace="True"属性即可: <%@ Page Language="C#" Trace="true"> 跟踪信息可以分为两类: a.页面执行详细情况 其中主要包括

ASP.NET mvc异常处理的方法示例介绍_实用技巧

1.首先常见保存异常的类(就是将异常信息写入到文件中去) 复制代码 代码如下: public class LogManager { private string logFilePath = string.Empty; public LogManager(string logFilePath) { this.logFilePath = logFilePath; FileInfo file = new FileInfo(logFilePath); if (!file.Exists) { file.C

js中console用法详解介绍(非常实用)

编辑注:console控制台的方法,你是不是只使用过常见的log.table.或者time,这篇文章介绍了更多console的实用方法,例如dir(显示对象内容).profile(性能分析器)等. 控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. 一.显示信息的命令 Firebug内置一个console对象,提供5种方法,用来显示信息. 最简单的方法是console.log(),可以用来取代alert()或document.wri

.net中 关于反射的详细介绍_实用技巧

概述反射• 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. • 反射机制允许程序在执行过程中动态地添加各种功能.   运行时类型标识 •运行时类型标识(RTTI),可以在程序执行期间判定对象类型.例如使用它能够确切地知道基类引用指向了什么类型对象.•运行时类型标识,能预先测试某个强制类型转换操作,能否成功,从而避免无效的强制类型转换异常. •在c#中有三个支持RTTI的关键字:is . as  .typeof. 下面依次介绍他们   is运算符: 通过is