servlet中filter(过滤器)的学习使用
servlet过滤器是小型的web组件,它能够处理传入的请求和传出的响应。Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开servlet时处理response。它具有高度的透明性,无需更改应用程序代码,就可以根据需要添加、修改或从应用程序中将它删除。
一个filter 包括:
1. 在servlet被调用之前截获;
2. 在servlet被调用之前检查servlet request;
3. 根据需要修改request头和request数据;
4. 根据需要修改response头和response数据;
5. 在servlet被调用之后截获.
你能够配置一个filter 到一个或多个servlet;单个servlet或servlet组能够被多个filter 使用。几个实用的filter包括:用户辨认filter,日志filter,审核filter,加密filter,符号filter,能改变xml内容的XSLT filter等。
一个客户化的过滤器要实现Filter接口的三个方法:init()、destroy()和doFilter()。
1. init():在容器实例化过滤器时调用,该方法接受一个FilterConfig类型的对象做为输入。
2. destroy():执行一些清理操作。
3. doFilter():类似servlet的doPost()、doGet()方法,执行具体的过滤任务。
下面给出一个可执行程序范例,它包含main函数,也可以部署到web应用中。
package utils;
import java.io.IOException;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import bean.User;
public class UrlFilter implements Filter { @SuppressWarnings("unused")
private FilterConfig filterConfig;
private FilterChain chain;
private HttpServletRequest request;
private HttpServletResponse response;
public void destroy() {
this.filterConfig = null;
} public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
} public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
this.chain = chain;
this.request = (HttpServletRequest) servletRequest;
this.response = ((HttpServletResponse) servletResponse);
String url = request.getServletPath();
if (url == null)
url = "";
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");
if (noFileUrl(url, request)) { //不需要判断权限的请求如登录页面,则跳过
chain.doFilter(request, response);
} else if (user == null) {
String action = request.getParameter("action");
if (!"login".equals(action)) {
response.sendRedirect("/zmdsl/admin/index.jsp");//返回登录页面
}
} else {
verifyUrl(url, user);//判断当前user是否拥有访问此url的权限
}
}
/**
*
* @param url 当前请求的url
* @param user 当前登录用户
* @throws IOException
* @throws ServletException
*/
private void verifyUrl(String url, User user)throws IOException, ServletException {
// 获取user拥有的所有资源串
Set<String> royurl = new HashSet<String>();
royurl.add("/newsAction.do?action=adminQueryPage&typeId=3");//为用户分配访问此地址的权限。在真正项目中,此Set集合可能要
//通过查询数据库user、role、menu等表,来获取当前用户所拥有的全部可访问资源
if (royurl != null && royurl.size() > 0
&& pass(royurl, url, request.getParameterMap())){
chain.doFilter(request, response);
} else {
response.setContentType("text/html;charset=GBK");
response
.getWriter()
.println(
"<div style='margin: 100 auto;text-align: center;"
+ "font: bold 18px 宋体;color: #0066CC;vertical-align: middle'> Sorry,您没有权限访问该资源!</div>");
}
} /**
* 是否需要判断权限,如客户端浏览、登录页面则不需要判断权限
*/ protected boolean noFileUrl(String url, HttpServletRequest request) {
if (url.indexOf("/index.jsp") >= 0 || url.indexOf("login") > 0) {
return true;
}
return false;
} /**
* 判断该用户是否有权请求该url
* @param royurl user拥有的授权的的url串集合
* @param url 当前请求的url
* @param reqmap 当前request的参数
* @return 是否通过该url
*/ protected boolean pass(Set royurl, String url, Map reqmap) {
boolean match = true;
for (Iterator iter = royurl.iterator(); iter.hasNext();) {
// 获取资源
match = true;
String res_string = (String) iter.next();
if (res_string.indexOf("*") > 0) {
res_string = res_string.substring(0, res_string.indexOf("*"));
if (url.substring(0, res_string.length()).equalsIgnoreCase(res_string)) {
return true; //增加通配符比较
}
}
// 分割url与参数
String[] spw = res_string.split("\\?"); //用"\\?" 转义后即可得到正确的结
if (url.indexOf(spw[0]) < 0) {//为了方便,没有写成spw[0].equals(url)
match = false;
} if (match && spw.length > 1) {
String[] spa = spw[1].split("\\&"); // 分拆各参数
for (int j = 0; j < spa.length; j++) {
String[] spe = spa[j].split("="); // 分拆键与值
String key = spe[0];
String value = "";
if (spe.length > 1) {
value = spe[1].trim();
}
// 轮询
String[] values = (String[]) reqmap.get(key);
if (values != null) {
for (int k = 0; k < values.length; k++) {
if (value.equalsIgnoreCase(values[k])) {
match = true;
break;
}
match = false;
}
if (!match) {
break;
}
}
}
}
if (match) {
break;
}
}
return match;
} @SuppressWarnings("unchecked")
public static void main(String[] args) {
UrlFilter filter = new UrlFilter();
Set royurl = new HashSet();//可访问的URL集合
royurl.add("/newsAction.do?typeId=1");
royurl.add("/newsAction.do?typeId=2"); //typeId为1时可以访问,true
String url_1 = "/newsAction.do";
Map reqmap_1 = new HashMap();
reqmap_1.put("typeId", new String[]{"1"});
System.out.println("match false:" + filter.pass(royurl, url_1, reqmap_1)); //typeId为3时不可以访问,false
String url_2 = "/newsAction.do";
Map reqmap_2 = new HashMap();
reqmap_2.put("typeId", new String[]{"3"});
System.out.println("match false:" + filter.pass(royurl, url_2, reqmap_2)); //url就不同,不可访问,false
String url_3 = "/imageAction.do";
Map reqmap_3 = new HashMap();
reqmap_3.put("typeId", new String[]{"3"});
System.out.println("match false:" + filter.pass(royurl, url_3, reqmap_3));
}
}
配置 Servlet过滤器:
非常简单,只需要在web.xml中加入类似下面的代码就可将过滤器部署到应用程序。
<!--================权限 设置================-->
<filter>
<filter-name>Authentication</filter-name>
<filter-class>utils.UrlFilter</filter-class>
<init-param>
<param-name>onError</param-name>
<param-value>/index.jsp</param-value>
</init-param>
</filter> <filter-mapping>
<filter-name>Authentication</filter-name>
<!-- 只过滤 .jsp 结尾的url, 其余的如 .do, .html, .jpg, .css 等不作过滤-->
<url-pattern>*.do</url-pattern>
</filter-mapping>
其中<filter-Class>是过滤器的路径;<filter-mapping>定义了该过滤器只过滤以.do结尾的URL,当然你也可以稍做修改让它过滤.jsp文件。
servlet中filter(过滤器)的学习使用的更多相关文章
- java Servlet中的过滤器Filter
web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- Servlet中的过滤器Filter详解
加载执行顺序 context-param->listener->filter->servlet web.xml中元素执行的顺序listener->filter->stru ...
- Servlet中的过滤器Filter
链web.xml中元素执行的顺序listener->filter->struts拦截器->servlet. 1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ...
- servlet之filter过滤器
1.Servlet 过滤器有以下目的 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理这些响应. 2.Filter接口 1.每一个过滤器都需直接或间接继承Filte ...
- 【Servlet】Filter过滤器的编写和配置
Servlet的Filter介绍 在Servlet作为过滤器使用时,它可以对客户的请求进行过滤处理,当它处理完成后,它会交给下一个过滤器处理,就这样,客户的请求在过滤链里一个个处理,直到请求发送到目标 ...
- servlet中的过滤器 国际化
1. 过滤器 基本概念 过滤器是需要在xml中配置的. 为什么需用到过滤器? 项目开发中,经常会涉及到重复代码的实现! 注册 ----à Servlet [1. 设置编码] ----à JSP 修改 ...
- 6.Servlet、Filter过滤器以及监听器
Servlet 是运行在Web服务器端的Java程序,它使用Java语言编写,与Java程序的区别是Servlet对象主要封装了对HTTP请求的处理,并且它的运行需要Servlet容器的支持,在Jav ...
- Servlet中的过滤器和监听器
1.什么是过滤器? Servlet规范中定义的一种特殊的组件,用来拦截容器的调用过程.容器收到请求之后,首先调用过滤器,然后再调用Servlet 2.生命周期: 1.servlet:servlet的生 ...
- Servlet中的过滤器Filter用法
1.过滤器的概念 Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Http ...
随机推荐
- Merge Two Sorted Lists—LeetCode
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing t ...
- 使用Windows驱动的虚拟打印机,打印Excel表格无表格线问题解决(2)
测试: 经前天的测试,最终还是没有明显的定夺到底是驱动的问题,还是打印机的问题.但是按照可能性来排查,最明显的一点就是其他测试环境不变的情况下增加一张图片,就可以打印出表格线,我始终觉得这里是突破点, ...
- javascript 关闭窗口,弹出新窗口并带有确认关闭对话框解决办法
在很多人眼里,北京是一个物欲横流的社会,生活节奏之快,让你一丝都不能停下来,走在路上伴随着人群急速往前涌,或许有些人都不知道要去哪.也不知道自己想要的是什么?在一个浮躁的社会里,多了一些浮躁的人,到处 ...
- ubuntu进入命令登录界面
按ctrl+alt+F1或者ctrl+alt+F2进入系统终端,可以以命令行界面登录系统.
- SuppressWarnings的警告
简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告, ...
- EMV/PBOC 解析(二) 卡片数据读取
上一篇简单的了解了IC智能卡的文件结构和APDU报文,这篇我们直接来读取卡内的数据.下面我们主要参照<中国金融集成电路(IC)卡规范>. 好了废话不多说,下面贴指令: (1)卡片接收一个来 ...
- Unity3D——窗体介绍
这是本人第一次的Unity的博客,主要还是依据雨松MOMO的视频来进行的,由于感觉视频比較直观,对于入门比較快,再加上自己有对应的编程基础,如今看书的话效率不高,所以先看几个视频了解一下大体的流程,感 ...
- Appcelerator Titanium 3.x Win7 64位平台安装步骤
刚接触Android移动开发,第一次下载Titanium,第一次下载ADT,第一次看Javascript代码,N多第一次...... 慢慢摸索了一个礼拜把移动开发的工具链的配置学习了一下,抛砖引玉,但 ...
- 如何让自己的Android程序永不被系统kill
一般来说,在Android系统中,当某进程较长时间不活动,或系统资源比较紧时,该进程可能被系统kill掉,以此来回收一些资源.Android系统会根据进程的优先级来选择性地杀死一些进程,优先级从高到低 ...
- linux下用phpize给PHP动态添加扩展(转)
使用php的常见问题是:编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,别说,php还真有这样的功能. 我没有在手册中看到. 如我想增加b ...