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的过滤的更多相关文章

  1. 《Python CookBook2》 第一章 文本 - 过滤字符串中不属于指定集合的字符 && 检查一个字符串是文本还是二进制

    过滤字符串中不属于指定集合的字符 任务: 给定一个需要保留的字符串的集合,构建一个过滤函数,并可将其应用于任何字符串s,函数返回一个s的拷贝,该拷贝只包含指定字符集合中的元素. 解决方案: impor ...

  2. javascript怎么获取指定url网页中的内容

    javascript怎么获取指定url网页中的内容 一.总结 一句话总结:推荐jquery中ajax,简单方便. 1.js能跨域操作么? javascript出于安全机制不允许跨域操作的. 二.用ph ...

  3. 实验:用Unity抓取指定url网页中的所有图片并下载保存

    突发奇想,觉得有时保存网页上的资源非常麻烦,有没有办法输入一个网址就批量抓取对应资源的办法呢. 需要思考的问题: 1.如何得到网页url的html源码呢? 2.如何在浩瀚如海的html中匹配出需要的资 ...

  4. JAVA判断指定url地址是否匹配指定url集合中的任意一个

    判断字符串为空和判断集合是否为空用到依赖,也可以改成自己的方式 <!-- Spring Web --> <dependency> <groupId>org.spri ...

  5. wemall doraemon中Android app商城系统向指定URL发送GET方法的请求代码

    URL的openConnection()方法将返回一个URLConnection对象,该对象表示应用程序和 URL 之间的通信链接.程序可以通过URLConnection实例向该URL发送请求.读取U ...

  6. Laravel 更新数据时在表单请求验证中排除自己,检查指定字段唯一性

    原文地址:https://moell.cn/article/24 不错的laravel网站 需求场景 修改用户信息时,在表单请求验证中排除当前邮箱所在的记录行,并检查邮箱的唯一性. Laravel版本 ...

  7. 爬取文件时,对已经操作过的URL进行过滤

    爬取文件时,对已经操作过的URL进行过滤 1.创建过滤规则文件filter.py在spiders同级目录 class RepeatUrl: def __init__(self): self.visit ...

  8. [转]spring的filter中targetFilterLifecycle作用

    在web.xml中进行配置,对所有的URL请求进行过滤,就像"击鼓传花"一样,链式处理. 配置分为两种A和B. A:普通配置 在web.xml中增加如下内容:<filter& ...

  9. 布隆过滤器 - 如何在100个亿URL中快速判断某URL是否存在?

    题目描述 一个网站有 100 亿 url 存在一个黑名单中,每条 url 平均 64 字节.这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中? 题目解析 这 ...

随机推荐

  1. 畅通工程-HZNU寒假集训

    畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府"畅通工程"的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只 ...

  2. MVC-AOP思想-Filter 三种注册方式

    在ASP.NET MVC框架中,为我们提供了四种类型的Filter类型包括:IAuthorizationFilter.IActionFilter.IResultFilter.IExceptionFil ...

  3. 专业、稳定的微信域名被封检测API平台!

    裂变程序最佳配套api,实时检测域名在微信中是否被封,防止见红  还在手动测试域名在微信是否可用?你OUT了! API文档:最简单的GET接口调用方式 API响应:毫秒级响应效率,100%准确率 AP ...

  4. ns3构建2 core fat tree出错

    我用ns3构建fat tree以下是我的拓扑结构: 在我用ns3构建完这个拓扑结构,并且加上此行代码: 但是运行的时候报错了.报的错误是: 解决办法是:进入到/src/internet/model/g ...

  5. memcached usage

    https://github.com/ragnor/simple-spring-memcached/wiki/Getting-Started 1) maven <dependency> & ...

  6. Java 核心卷学习笔记(一)

    Java基程序设计结构 1.注释 三种注释方式: // 注释单行 /* 内容 */ 注释单行 /** * 内容 */

  7. Java反射-修改private final成员变量值,你知道多少?

    大家都知道使用java反射可以在运行时动态改变对象的行为,甚至是private final的成员变量,但并不是所有情况下,都可以修改成员变量.今天就举几个小例子说明.  基本数据类型 String类型 ...

  8. Thymeleaf中each标签遍历list如何获取index

    <tr th:each="user,userStat:${users}">userStat是状态变量,有 index,count,size,current,even,o ...

  9. Spring Boot实战笔记(四)-- Spring常用配置(事件Application Event)

    一.事件(Application Event) Spring的事件为Bean和Bean之间的消息通信提供了支持.当一个Bean处理完一个任务之后,希望另一个Bean知道并能做相应的处理,这时我们就需要 ...

  10. redis两种持久化方法对比分析

    1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...