Filter中排除对指定URL的过滤
1. 我们可以在web.xml中配置filter来对指定的URL进行过滤,进行一些特殊操作如权限验证等。
<!– session过滤filter –>
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.xm.chris.SessionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<url-pattern>/resources/*</url-pattern>
</filter-mapping>
public class SessionFilter implements Filter {
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
    private FilterConfig _filterConfig = null;
    public void init(FilterConfig filterConfig) throws ServletException {
        _filterConfig = filterConfig;
    }
    public void destroy() {
        _filterConfig = null;
    }
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest rq = (HttpServletRequest) request;
        HttpSession httpSession = rq.getSession();
        Long userId = (Long) httpSession.getAttribute("userId");
        if (userId == null) {
            response.setContentType(CONTENT_TYPE);
            PrintWriter out = response.getWriter();
            out.println("<html>");
            out.println("<head><title>Error</title></head>");
            out.println("<body>");
            out.println("<p id='Message'>错误.</p>");
            out.println("</body></html>");
            out.close();
        } else {
            chain.doFilter(request, response);
        }
    }
}
这时所有请求了contextPath/resources/*路径的request都会被SessionFilter验证是否登录。
2. 但是我们有一些特定的url不想验证登录,想要直接能够访问,怎么办呢?
这时可以配置一个参数,告诉Filter哪些url不想验证。
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>com.oracle.ccsc.jcs.sx.filter.SecurityFilter</filter-class>
<init-param>
<param-name>excludedPages</param-name>
<param-value>/xm/portal/notice</param-value>
</init-param>
</filter>
然后在Filter中就可以根据参数判断是否需要过滤。
public class SecurityFilter implements Filter {
    private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
    private FilterConfig _filterConfig = null;
    private String excludedPages;
    private String[] excludedPageArray;
    public void init(FilterConfig filterConfig) throws ServletException {
        _filterConfig = filterConfig;
        excludedPages = filterConfig.getInitParameter("excludedPages");
        if (StringUtils.isNotEmpty(excludedPages)) {
            excludedPageArray = excludedPages.split(",");
        }
    }
    public void destroy() {
        _filterConfig = null;
    }
    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain chain) throws IOException,
            ServletException {
        HttpServletRequest rq = (HttpServletRequest) request;
        boolean isExcludedPage = false;
        for (String page : excludedPageArray) { //判断是否在过滤url之外if (rq.getPathInfo().equals(page)) {
                isExcludedPage = true;
                break;
            }
        }
        if (isExcludedPage) { //在过滤url之外
            chain.doFilter(request, response);
        } else { //不在过滤url之外,判断登录
            HttpSession httpSession = rq.getSession();
            Long userId = (Long) httpSession.getAttribute("userId");
            if (userId == null) {
                response.setContentType(CONTENT_TYPE);
                PrintWriter out = response.getWriter();
                out.println("<html>");
                out.println("<head><title>Error</title></head>");
                out.println("<body>");
                out.println("<p id='Message'>错误.</p>");
                out.println("</body></html>");
                out.close();
            } else {
                chain.doFilter(request, response);
            }
        }
    }
}
3. 关于用Servlet获取URL地址。
在HttpServletRequest类里,有以下六个取URL的函数
getContextPath 取得项目名 
getServletPath 取得Servlet名 
getPathInfo 取得Servlet后的URL名,不包括URL参数 
getRequestURL 取得不包括参数的URL 
getRequestURI 取得不包括参数的URI,即去掉协议和服务器名的URL
具体如下图:

相对应的函数的值如下:
getContextPath:/ServletTest 
getServletPath:/main 
getPathInfo:/index/testpage/test 
getRequestURL:http://localhost:8080/ServletTest/main/index/testpage/test 
getRequestURI:/ServletTest/main/index/testpage/test
Filter中排除对指定URL的过滤的更多相关文章
- 《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 && 检查一个字符串是文本还是二进制
		
过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: impor ...
 - javascript怎么获取指定url网页中的内容
		
javascript怎么获取指定url网页中的内容 一.总结 一句话总结:推荐jquery中ajax,简单方便. 1.js能跨域操作么? javascript出于安全机制不允许跨域操作的. 二.用ph ...
 - 实验:用Unity抓取指定url网页中的所有图片并下载保存
		
突发奇想,觉得有时保存网页上的资源非常麻烦,有没有办法输入一个网址就批量抓取对应资源的办法呢. 需要思考的问题: 1.如何得到网页url的html源码呢? 2.如何在浩瀚如海的html中匹配出需要的资 ...
 - JAVA判断指定url地址是否匹配指定url集合中的任意一个
		
判断字符串为空和判断集合是否为空用到依赖,也可以改成自己的方式 <!-- Spring Web --> <dependency> <groupId>org.spri ...
 - wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码
		
URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...
 - Laravel 更新数据时在表单请求验证中排除自己,检查指定字段唯一性
		
原文地址:https://moell.cn/article/24 不错的laravel网站 需求场景 修改用户信息时,在表单请求验证中排除当前邮箱所在的记录行,并检查邮箱的唯一性. Laravel版本 ...
 - 爬取文件时,对已经操作过的URL进行过滤
		
爬取文件时,对已经操作过的URL进行过滤 1.创建过滤规则文件filter.py在spiders同级目录 class RepeatUrl: def __init__(self): self.visit ...
 - [转]spring的filter中targetFilterLifecycle作用
		
在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理. 配置分为两种A和B. A:普通配置 在web.xml中增加如下内容:<filter& ...
 - 布隆过滤器 - 如何在100个亿URL中快速判断某URL是否存在?
		
题目描述 一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节.这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中? 题目解析 这 ...
 
随机推荐
- Python 30分钟入门指南
			
Python 30分钟入门指南 为什么 OIer 要学 Python? Python 语言特性简洁明了,使用 Python 写测试数据生成器和对拍器,比编写 C++ 事半功倍. Python 学习成本 ...
 - Java虚拟机-类加载
			
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行检验.转换解析和初始化,最终形成了可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制.在Java语言里,类型的加载.连接和初始化过 ...
 - myeclipse 的Customize Perspective 没有反应
			
MyEclipse 2014 工具栏里的Quick Access老是跳上跳下的,弄得我很烦,所以就想自定义一下工具栏,结果 window--> customize perspective 没用 ...
 - python爬虫入门(二)Opener和Requests
			
Handler和Opener Handler处理器和自定义Opener opener是urllib2.OpenerDirector的实例,我们之前一直在使用urlopen,它是一个特殊的opener( ...
 - 微信小程序的初窥实践
			
最近,小程序正式上线,各企业都纷纷开发,本博主看下其中奥秘, 首先得去微信公众平台(https://mp.weixin.qq.com/)注册一个小程序账号(以前注册过公众号的账号不可使用) 备注:注册 ...
 - EOS技术研究:合约与数据库交互
			
智能合约操作链数据库是很常见的应用场景.EOS提供了专门的工具来做这件事(相当于Ethereum的leveldb),专业术语叫做持久化API,本文将完整严密地介绍这个工具以及对它的使用测试. 关键字: ...
 - spring+activemq中多个consumer同时处理消息时遇到的性能问题
			
最近在做数据对接的工作,用到了activemq,我需要从activemq中接收消息并处理,但是我处理数据的步骤稍微复杂,渐渐的消息队列中堆的数据越来越多,就想到了我这边多开几个线程来处理消息. 可是会 ...
 - WPF 定义Command
			
直接上代码: public class LoginDelegateCommand : ICommand { private Action _execute; private Predicate< ...
 - JQUERY获取loaded 宽高这么变态
			
JQUERY获取loaded 宽高这么变态: $('<img/>').attr('src',img.src).load(function() { img.Owidth = $(this). ...
 - Reactor模式的.net版本简单实现--DEMO
			
近期在学习DotNetty,遇到不少的问题.由于dotnetty是次netty的.net版本的实现.导致在网上叙述dotnetty的原理,以及实现技巧方面的东西较少,这还是十分恼人的.在此建议学习和使 ...