servlet过滤器实现页面的权限管理
- 格式:doc
- 大小:21.00 KB
- 文档页数:1
servlet过滤器工作原理
Servlet过滤器是Java Web应用程序中的一个组件,主要用于在请求到达Servlet之前或响应离开Servlet之前对请求或响应进行预
处理和后处理。
其工作原理可以分为以下几个步骤:
1. 过滤器包含了一个或多个过滤器链,每个过滤器链由多个过
滤器组成。
当一个请求到达Servlet容器时,容器会首先检查是否有
过滤器链与其对应。
2. 如果存在对应的过滤器链,则依次对请求进行预处理,如对
请求参数进行验证、对请求进行日志记录等操作。
3. 然后,过滤器链将处理后的请求传递给被过滤的Servlet,Servlet对请求进行处理并产生响应。
4. 当Servlet容器收到响应并准备发送到客户端时,它会遍历
响应所经过的过滤器链,依次对响应进行后处理,如对响应进行压缩、对响应进行加密等操作。
5. 最后,Servlet容器将处理后的响应发送到客户端。
总的来说,Servlet过滤器的作用是增强Java Web应用程序的安全性、可靠性和性能。
通过对请求和响应进行预处理和后处理,可以
有效地防范潜在的安全威胁,优化应用的性能,提高用户体验。
MVC5基础-过滤器(Filters)详解什么是过滤器?通过上⼀篇关于Controller控制器的⽂章我们知道,MVC中的每⼀个请求,都会分配给相应的控制器(Controller)和对应的⾏为⽅法(Action)去处理,那么如果我们想要在Action处理的前后加上⼀些额外的处理逻辑怎么办呢?这时候就⽤到了过滤器(Filters)。
在 MVC的请求处理过程中有19个管道事件,这些事件分布在请求处理的各个节点中,⽐如BeginRequest(开始处理请求时触发)、AuthenticateRequest(对请求进⾏⾝份验证时触发)、AuthorizeRequest(对请求进程授权时触发)…等等等等。
⽽过滤器的主要作⽤就是将我们的附加逻辑注⼊到这些请求处理管道中。
在实际业务中,在Action⽅法前后添加额外附加逻辑的情况有很多,过滤器就是⽤来完成此功能。
通过过滤器可以将与业务逻辑⽆关但经常需要执⾏的代码分离开,使我们的代码逻辑性更加清晰,代码更加简洁。
过滤器的类型与作⽤MVC给我们提供了四种过滤器,基本满⾜了我们实际业务中常⽤的需求,包括以下:过滤器类型名称实现的接⼝默认的实现类作⽤执⾏的顺序与节点授权过滤器IAuthorizationFilter AuthorizeAttribute ⽤于限制进⼊控制器或控制器的某个⾏为⽅法在控制器⽅法调⽤前执⾏,所有过滤器中最先执⾏的动作过滤器IActionFilter ActionFilterAttribute⽤于进⼊动作⽅法之前或之后的处理在控制器⽅法调⽤前/后执⾏结果过滤器IResultFilter ActionFilterAttribute⽤于动作⽅法返回结果之前或之后的处理在控制器⽅法调⽤完,跳转⾄view页⾯前/后执⾏异常处理过滤器IExceptionFilter HandleErrorAttribute⽤于处理某个动作⽅法或某个控制器⾥⾯抛出的异常在控制器⽅法抛出异常时执⾏这四种类型的接⼝是MVC对过滤器的⼀个接⼝规范,同时MVC默认通过AuthorizeAttribute(授权)、HandleErrorAttribute(异常处理)、ActionFilterAttribute(动作和结果)三个类实现了这四个接⼝。
java使⽤过滤器实现登录拦截处理⽬录滤器实现登录拦截处理⼀、什么是过滤器⼆、⼯作原理及⽣命周期三、过滤器使⽤filter简易实现登录功能拦截LoginFlitercontroller结果图滤器实现登录拦截处理⼀、什么是过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹(驻留在服务器端的Web组件),在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应⼆、⼯作原理及⽣命周期举个例⼦当我们登录系统可以访问到页⾯,当退出登录后,要访问就必须重新登录,这就是过滤器起到的作⽤。
当我们访问某个接⼝时,过滤器会拦截请求,判断当前⽤户是否是登录状态,若登录则放⾏访问,若未登录则返回指定页⾯(通常为登录页或⼀个客户友好的提⽰页)这个过程包含了过滤器的⽣命周期:1.实例化2.初始化3.执⾏过滤操作(包括访问前对request操作和返回时对response的操作处理)4.销毁三、过滤器使⽤在springboot项⽬简单使⽤过滤器进⾏登录拦截处理1.实现过滤器public class MyFilter implements Filter {private static final String CURRENT_USER = "current_user";//配置⽩名单protected static List<Pattern> patterns = new ArrayList<Pattern>();//静态代码块,在虚拟机加载类的时候就会加载执⾏,⽽且只执⾏⼀次static {patterns.add(pile("/index"));patterns.add(pile("/login"));patterns.add(pile("/register"));}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpResponse);String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length());if (isInclude(url)) {//在⽩名单中的url,放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;}if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) {//若为登录状态放⾏访问filterChain.doFilter(httpRequest, httpResponse);return;} else {//否则默认访问index接⼝wrapper.sendRedirect("/index");}}@Overridepublic void destroy() {}//判断当前请求是否在⽩名单private boolean isInclude(String url) {for (Pattern pattern : patterns) {Matcher matcher = pattern.matcher(url);if (matcher.matches()) {return true;}}return false;}}2.注册过滤器@Configurationpublic class WebConfig {/*** 配置过滤器* @return*/@Beanpublic FilterRegistrationBean someFilterRegistration() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(myFilter());//拦截/*的访问多级匹配(springboot 过滤器/*以及匹配 /**多级匹配)registration.addUrlPatterns("/*");registration.setName("myFilter");return registration;}/*** 创建⼀个bean* @return*/@Bean(name = "myFilter")public Filter myFilter() {return new MyFilter();}}3.运⾏项⽬访问/index,会发现没有被拦截,返回正确结果在未登录状态,访问/update接⼝,会被拦截跳转⾄/index页在登录状态,访问/update接⼝,可以访问这⾥也可以在程序debug看下。
Java 中filter 过滤器的使用:Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。
它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应。
Filters 有许多的应用场合。
Servlet 2.3 规范建议如下的地方可以应用Filter:authentication filterslogging and auditing filtersimage conversion filtersdata compression filtersencryption filterstokenizing filtersfilters that trigger resource access eventsXSL/T filters that transform XML contentMIME-type chain filters如何实现一个过滤器呢?1.所在的类实现Filter接口public interface Filterpublic void init(FilterConfig filterConfig)throws ServletException过滤器初始化是在容器启动时自动初始化public void doFilter(ServletRequest request,ServletResponse response,FilterChainchain)throws IOException,ServletExcepton在标准Servlet中的doGet或doPost 方法中,传递参数为:HttpServletRequest、HttpServletResponse过滤器销毁public void destroy()例:如下为过滤器基本的主要结构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 javax.servlet.ServletResponse;public class MyFirstFilter implements Filter{private String encoding;public void destroy(){System.out.println("过滤器销毁");}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {System.out .println("过滤doFilter");chain.doFilter(request, response);}public void init(FilterConfig filterConfig) throws ServletException {System.out .println("过滤器初始化"); encoding = filterConfig.getInitParameter("encoding"}对应配置文件:<filter ><filter-name >encodingFilter </filter-name ><filter-class >com.shen.test.filter. MyFirstFilter </filter-class ><init-param ><param-name >encoding </param-name ><param-value >Shift_JIS </param-value ></init-param ></filter ><filter-mapping ><filter-name >encodingFilter </filter-name ><servlet-name >action </servlet-name ></filter-mapping ><servlet ><init-param ><<param-value >/WEB-INF/config/struts-config.xml,/WEB-INF/config/st ruts-config-contents.xml </param-value ></init-param ><init-param><param-name>debug</param-name><param-value>2</param-value></init-param><init-param><param-name>detail</param-name><param-value>2</param-value></init-param><load-on-startup>1</load-on-startup></servlet>如果过滤器要将内容传递到目的地,则需要FilterChain,将请求继续向下转发过滤器也会执行两次:FilterChain之前执行一次,之后再执行一次2:对某些文字进行过滤关键方法如下所示:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {System.out.println("过滤doFilter");//从页面获取内容String content=request.getParameter("content");String filterchar ="色";if(content != null && !"".equals(content)){//如果indexOf返回-1则表示没有查到所要的内容if(-1 == content.indexOf(filterchar)){chain.doFilter(request, response);}else{System.out.println("有非法文字");//可以继续做处理//如果需要的话,此处依然可以使用RequestDispatcher进行跳转}}}3:设置统一编码/*** 对内容进行统一的编码*/request.setCharacterEncoding("GBK");response.setCharacterEncoding("GBK");4:登录验证:/*** 登陆验证*/public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {/*** 登陆验证*///Session属于http范畴,把以ServletRequest对象需要先转换成HttpServletRequest对象HttpServletRequest hrequest =(HttpServletRequest) request;HttpSession session =hrequest.getSession();//request.getScheme();request.getServerName();request.getServerPo rt();//如果session不为空,则可以浏览其它页面if(null != session.getAttribute("username")){chain.doFilter(request, response);}else{//通过requestDispatcher跳转到登陆面request.getRequestDispatcher("login.jsp").forward(request,respons e);}}第二部分:javax.servlet.Filter详细介绍:过滤器(Filter)位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应。
servletfilter的执行顺序
Servlet Filter(过滤器)的执行顺序如下:
初始化过滤器:当应用程序启动时,容器会初始化所有配置的过滤器。
初始化过滤器的顺序是按照它们在web.xml 中的顺序来进行的。
请求到达过滤器链:当一个请求到达应用程序时,容器会将请求传递给第一个过滤器。
过滤器链中的过滤器执行:过滤器链是由多个过滤器组成的,它们按照web.xml中的顺序连接在一起。
每个过滤器都可以对请求进行处理,例如修改请求参数、验证用户身份等。
Servlet处理请求:当请求通过所有过滤器后,它将传递给目标Servlet进行处理。
响应返回过滤器链:当目标Servlet处理完请求并生成响应后,响应将通过过滤器链返回给客户端。
过滤器链中的过滤器执行(逆序):在响应返回过程中,过滤器将按照相反的顺序执行,即从最后一个过滤器到第一个过滤器。
这样可以对响应进行处理,例如添加响应头、修改响应内容等。
销毁过滤器:当应用程序关闭时,容器会销毁所有配置的过滤器。
销毁过滤器的顺序是按照它们在web.xml中的顺序来进行的。
需要注意的是,过滤器的执行顺序是由web.xml中的配
置决定的。
如果你在web.xml中配置了多个过滤器,并且希望它们按照特定的顺序执行,你需要确保在配置文件中按照期望的顺序列出它们。
servletfilter的执行顺序Servlet Filter是Java Servlet规范中的一种机制,用于在Web应用程序中对请求和响应进行预处理和后处理。
在Web应用程序中,Filter充当了请求链和响应链上的中间件,可以用于进行各种操作,例如身份验证、请求参数修改、日志记录等。
Servlet Filter的执行顺序取决于它们在web.xml中的注册顺序以及Filter的优先级设置。
1.在web.xml中注册Filter在web.xml配置文件中,可以为每个Filter指定一个或多个url-pattern,来指定它要处理的请求URI。
在注册Filter时,可以通过设置<filter-mapping>元素中的<url-pattern>元素来指定多个Filter的顺序以及它们处理的请求URI。
2. Filter的初始化在Servlet容器启动时,会对所有注册的Filter进行初始化。
Filter的初始化可以通过在Filter的初始化方法init()中完成。
在该方法中,可以对Filter的配置进行初始化,并加载任何需要的资源。
3.过滤器链的执行顺序当有请求到达Web应用程序时,Servlet容器会根据请求的URI匹配相应的Filter,然后按照注册的顺序依次调用它们的doFilter()方法。
Filter的doFilter()方法是Filter实际处理请求和响应的地方。
在doFilter()方法中,Filter可以对请求进行处理,并将请求传递给下一个Filter,或者将请求传递给servlet进行处理。
4. Filter链的结束如果已经到达了Filter链的末尾,或者在Filter链的中途其中一个Filter通过调用filterChain.doFilter()将请求传递给下一个Filter时,Filter链的处理就会结束。
5. Filter的销毁在Servlet容器关闭时,会对所有初始化的Filter进行销毁。
论J2EE过滤器技术框架下的统一身份认证与访问控制技术摘要:本文通过分析、研究用户身份认证、访问控制原理及j2eeserv let过滤器技术,在基于web应用系统特点和j2eeservlet 过滤器技术的基础上,提出了企业信息化应用系统的统一用户身份认证与访问控制的实现方法,并在j2ee应用框架中得到了应用。
关键词:j2eeservlet 过滤器身份认证访问控制 jsp/ serv let1引言随着信息化的深入发展,企业信息化逐渐从传统单机系统、客户/服务器转向基于internet应用、支持互联网的多层应用和瘦客户端的浏览器/服务器结构的信息系统。
同时,企业级信息系统的安全性也已成为信息化建设过程中至关重要的环节。
j2eeservlet是分布式企业架构j2ee的web组件,从servlet2.3规范开始新增了一种过滤器功能,称为serv let filter,主要作用是拦截、操纵来自客户端的请求,在资源还未发送到客户端前截取响应,并处理这些响应。
本文主要针对基于j2eeservlet过滤器技术实现企业信息系统用户的统一身份认证和资源的访问控制进行讨论。
2用户身份认证与访问控制技术分析2.1用户身份认证信息化应用系统的用户认证是指只有合法用户才能进入系统和使用系统提供的各种功能。
基于internet的多层b/s结构的应用系统,用户认证可通过以下三种方式实现:1)web server服务器实现,利用web服务器本身的用户身份功能实现;2)通过应用服务器实现,如j2ee应用服务器,它提供了基于j2ee安全基础框架的用户身份认证;3)信息化应用系统实现,或软件开发者在应用系统中结合前两种方法在系统内实现。
这三种方式各有其特点:前两种必须与web server和j2ee应用服务器相结合并利用其各自的特点进行配置实现,其灵活性较差,不能根据应用系统的需要进行定制;第三种方式,结合应用系统自身特点在应用系统内部实现。
一、概述onceperrequestfilteronceperrequestfilter是Java Web开发中常用的过滤器,主要用于在每个HTTP请求到达Web应用程序时执行一些特定的操作。
它可以用于执行一些与请求相关的初始化操作,例如设置字符编码、验证用户身份、记录日志等。
通常情况下,开发人员可以继承javax.servlet.Filter接口,并实现其doFilter方法来自定义过滤器的行为。
二、onceperrequestfilter的使用场景1. 字符编码处理:在Web应用程序中,我们经常需要对请求的参数进行字符编码处理,以防止乱吗和安全漏洞。
onceperrequestfilter可以在每个请求到达时对请求参数进行统一的编码处理,确保Web应用程序的安全性。
2. 用户身份验证:在大多数Web应用程序中,都需要对用户的身份进行验证和权限控制。
onceperrequestfilter可以在每个请求到达时对用户的身份进行验证,并根据不同的权限进行相应的处理。
3. 日志记录:Web应用程序的日志记录是非常重要的,它可以帮助开发人员排查问题并监控应用程序的运行状态。
onceperrequestfilter 可以在每个请求到达时记录请求相关的日志,包括请求参数、请求位置区域、用户身份等信息。
4. 请求包装:有时候我们需要对请求进行一些包装操作,例如对请求参数进行统一处理、添加一些额外的参数等。
onceperrequestfilter可以在每个请求到达时对请求进行包装操作,以便后续的业务逻辑处理。
5. 性能监控:一些特殊的应用程序需要对每个请求的性能进行监控,以便及时发现性能问题并进行优化。
onceperrequestfilter可以在每个请求到达时记录请求的处理时间、内存占用情况等信息。
三、onceperrequestfilter的使用方法1. 创建自定义过滤器类:我们需要创建一个自定义的过滤器类,通常情况下,该类需要继承javax.servlet.Filter接口,并实现其doFilter方法。
2022-10-27 12:40Filter(过滤器)简介Filter 的基本功能是对Servlet 容器调用Servlet 的过程进行拦截,从而在Servlet 进行响应处理的先后实现一些特殊的功能。
在Servlet API 中定义了三个接口类来开供开辟人员编写Filter 程序:Filter, FilterChain, FilterConfigFilter 程序是一个实现了Filter 接口的Java 类,与Servlet 程序相似,它由Servlet 容器进行调用和执行Filter 程序需要在web.xml 文件中进行注册和设置它所能拦截的资源:Filter 程序可以拦截Jsp, Servlet, 静态图片文件和静态Filter 的基本工作原理当在web.xml 中注册了一个Filter 来对某个Servlet 程序进行拦截处理时,这个Filter 就成为了Servlet 容器与该Servlet 程序vlet 容器发送给Servlet 程序的请求和Servlet 程序回送给Servlet 容器的相应进行拦截,可以决定是否将请求继续传递给Se在一个web 应用程序中可以注册多个Filter 程序,每一个Filter 程序都可以对一个或者一组Servlet 程序进行拦截。
若有多个Filter 程序对某个Servlet 程序的访问过程进行拦截,当针对该Servlet 的访问请求到达时,web 容器将把这多个F 链中各个Filter 的拦截顺序与它们在应用程序的web.xml 中映射的顺序一致Filter 接口init(FilterConfig filterConfig)throws ServletException:在web 应用程序启动时,web 服务器将根据web.xml 文件中的配置信存在服务器的内存中。
Web 容器创建Filter 对象实例后,将即将调用该Filter 对象的init 方法。
控制用户访问页面权限,一直都是每个项目的关键点。
最近在看servlet过滤器方面的知识,就用过滤器实现了一个很简单的权限控制:
思路是:刚学jsp时,做过一个很简单的学生查询系统,稍微改进后,现在拥有6个页面:log.jsp
login.jsp、list.jsp(显示学生信息)insert.jsp(插入一个新学生)、 change.jsp(修改学生信息)、del.jsp(删除学生)、
现在我为list.jsp inser.jsp change.jsp del.jsp四个页面分别分配一个权限(1、2、4、8),然后在数据库中建一个表page用来存储每个页面的权限。
同时,数据库中新增加一个表admin表,用来存储用户名权限及相关密码,如:用户名qsw,密码:1234 权限:1(只能访问list页面)
log.jsp页面的作用是用来登录,然后将username提交到login.jsp页面,根据用户名从数据库admin表中提取相应的权限值,将其保存在session中,attribute名称为:userpermission;这样当用户登录另外的页面的时候,就会先执行CheckFilter.java过滤器,过滤器会分别从数据库page表中取出页面的权限值,与session中的用户权限值permission进行相与操作,如果为0,则无权限访问,跳转到err.jsp页面,如果不为0,则可进行访问。
演示过程如下:
1、登录log.jsp,输入用户名qsw 密码*****,权限值为1,只能访问list.jsp页面。
2、用户登录如llist.jsp页面后,点击添加学生按钮,此时会跳转到insert.jsp页面,由于没有此权限,过滤器会将其跳转到err.jsp页面。
问题:
这种做法最大的缺点是:
每登陆一次页面,都要连接一次数据库(因为要从数据库page表中取页面权限),势必影响系统的执行效率。
所以我们在项目中一般采用的是将权限存储在.xml文件里,这样会减少很大的开销。
但缺点是安全性。
不知道如果采用tomcat数据库连接池,然后把权限存储在数据库中,这样对系统速度影响会有多大。
当然其肯定比不过读取xml文件速度,但应该比较安全。