Java Web应用中基于Filter的访问权限控制实现
- 格式:doc
- 大小:327.50 KB
- 文档页数:6
JavaWeb三⼤组件1.javaweb三⼤组件:servlet,listener,filter;都需要在web.xml中配置(除了两个感知监听器)。
2.服务器端⼩程序每个Servlet都是唯⼀的,能处理的请求是不同的(⽐如登录,查询);前⾯的调度由tomcat完成;要完成获取请求数据,处理请求,完成响应的任务。
3.实现servlet的三种⽅法:javax.servlet.Servlet接⼝,GenericServlet抽象类(service⽅法待实现),HttpServlet类(常⽤)。
4.Servlet接⼝5⼤⽅法:其中3个⽣命周期⽅法不由我们来调⽤,由Tomcat调⽤;对象也不⽤我们来创建,Tomcat创建。
4.1:init(ServletConfig):⽣命周期⽅法,在对象创建之后只执⾏⼀次;当第⼀次被请求才被创建;4.2:destroy():⽣命周期⽅法,在servlet对象被销毁之前调⽤,只调⽤⼀次;⽐如IO流等释放(很少);服务器被关闭时调⽤;4.3:service(ServletRequest,ServletResponse):⽣命周期⽅法,被调⽤多次⽤来处理请求;4.4:getServletConfig()(有⽤),getServletInfo()(⽆⽤)。
5.浏览器如何访问Servlet:必须把Servlet绑定到⼀个路径(web.xml配置):<servlet>name,class</servlet>,<servlet-mapping>name,url-pattern</servlet-mapping>,其中pattern必须/开头。
6.Servlet单例,线程不安全,效率⾼。
7.ServletConfig接⼝:对应的就是web.xml⾥的本Servlet的配置信息被xml解析器解析后,加载到⾥⾯;返回的实例的实现类是Tomcat提供的;7.1:getServletName()(⼏乎没⽤);7.2:getServletContext()(有⽤);7.3:getInitParameter[Names()]:初始化参数相关8.ServletRequest(Tomcat封装的请求信息),ServletResponse(设置状态码,设置响应头,发送html代码)。
filter 获取请求方法Filter 是 Java Web 应用中的一种重要组件,用于拦截请求和响应。
通过在 Filter 中对请求、响应进行过滤和处理,可以对请求进行控制、转发、修改、记录等操作。
对于请求方法,使用 Filter 可以获取请求的方法类型,包括 GET、POST、PUT、DELETE 等,以便进行相应的处理。
获取请求方法的方式在 Filter 中获取请求方式有多种方式,可以通过 Request 对象获取,也可以通过FilterConfig 对象获取。
1.通过 Request 对象获取请求方法类型在 Filter 中,可以通过 HttpServletRequest 类型的对象 request 来获取请求方法类型,具体代码如下:```public class MyFilter implements Filter {}```在上述代码中,通过 FilterConfig 对象的 getInitParameter 方法获取请求方法类型,然后在 doFilter 方法中根据不同类型进行相应的操作。
使用场景通过 Filter 获取请求方法类型可以用于实现权限控制、日志记录等功能。
1.权限控制在 Web 应用中,有些页面或接口只能通过特定的请求方法类型访问,例如只能通过POST 方法提交数据。
通过 Filter 获取请求方法类型可以实现这种权限控制,具体实现方式如下:2.日志记录总结通过 Filter 获取请求方法类型是一种很常见也很有用的技巧,在权限控制、日志记录等场景中都能发挥重要作用。
在实际开发中,可以根据具体需求选择不同的实现方式,或者根据实际情况进行改进和优化。
Java过滤器Filter使⽤详解<div id="post_detail">转载请注明原⽂地址:在我的项⽬中有具体应⽤:https:///ygj0930/CoupleSpace过滤器过滤器是处于客户端与服务器资源⽂件之间的⼀道过滤⽹,在访问资源⽂件之前,通过⼀系列的过滤器对请求进⾏修改、判断等,把不符合规则的请求在中途拦截或修改。
也可以对响应进⾏过滤,拦截或修改响应。
如图,浏览器发出的请求先递交给第⼀个filter进⾏过滤,符合规则则放⾏,递交给filter链中的下⼀个过滤器进⾏过滤。
过滤器在链中的顺序与它在web.xml中配置的顺序有关,配置在前的则位于链的前端。
当请求通过了链中所有过滤器后就可以访问资源⽂件了,如果不能通过,则可能在中间某个过滤器中被处理掉。
在doFilter()⽅法中,chain.doFilter()前的⼀般是对request执⾏的过滤操作,chain.doFilter后⾯的代码⼀般是对response执⾏的操作。
过滤链代码的执⾏顺序如下:过滤器⼀般⽤于登录权限验证、资源访问权限控制、敏感词汇过滤、字符编码转换等等操作,便于代码重⽤,不必每个servlet中还要进⾏相应的操作。
下⾯是过滤器的简单应⽤:1:创建过滤器如图,新建⼀个class,实现接⼝Filter(注意:是javax.servlet中的Filter)。
2:重写过滤器的doFilter(request,response,chain)⽅法。
另外两个init()、destroy()⽅法⼀般不需要重写。
在doFilter⽅法中进⾏过滤操作。
常⽤代码有:获取请求、获取响应、获取session、放⾏。
剩下的代码就是根据session的属性进⾏过滤操作、设置编码格式等等了,看情况⽽定。
HttpServletRequest request=(HttpServletRequest) arg0;//获取request对象HttpServletResponse response=(HttpServletResponse) arg1;//获取response对象HttpSession session=request.getSession();//获取session对象过滤操作代码......chain.doFilter(request, response);//放⾏,通过了当前过滤器,递交给下⼀个filter进⾏过滤3:在web.xml中配置过滤器。
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应用程序之间,用于检查和修改两者之间流过的请求和响应。
java中filter函数的用法Java8引入了一种新的函数式编程思想,即Stream API。
Stream API提供了一个称为filter的内置函数,它可以让开发人员在集合上执行一些基本的操作,例如查找、筛选和操作。
本文将讨论在Java 中filter函数的用法。
Filter函数是Stream API中最有用的函数之一,它可以从集合中选择满足特定条件的元素。
它的基本原理很简单:对集合中的每个元素应用给定的test函数,如果test函数返回true,则保留该元素,否则,将其舍弃。
在使用filter函数之前,要遵循一些重要的规则。
首先,test 函数必须接受一个参数,类型必须与集合元素类型相同,并且必须返回boolean类型的结果。
其次,filter函数不会改变集合中的元素,而是对元素进行复制,根据test函数的返回值确定是否将复制的元素加入新的集合中。
最后,返回的新集合可以有(也可以没有)与原集合相同的元素,但也可能不同。
现在,让我们来看一个实际的例子,即从一个整型列表中查找偶数的简单示例。
在Java中,使用filter函数可以轻松实现此目的。
在此示例中,test函数将接受一个整型参数,并根据测试结果返回true或false://在此处定义lambda表达式Predicate<Integer> evenIntegers = (Integer i) -> i%2==0; //在此处调用filter函数List<Integer> evenList =list.stream().filter(evenIntegers).collect(Collectors.toLis t());以上代码段使用lambda表达式定义了一个test函数,该函数检查传递给它的参数是否为偶数。
然后,我们可以使用filter函数将元素从原始列表中剔除,并将剩余元素收集到新的evenList列表中。
Java访问权限控制Java访问权限控制修饰符⽤来定义类、⽅法或者变量,通常放在语句的最前端。
Java语⾔提供了很多修饰符,主要分为以下两类:访问修饰符⾮访问修饰符其中⾮访问修饰符主要有:static、final、abstract、synchronized和volatile,⾮访问修饰符根据各⾃的特性来保证特定功能的实现。
Java中使⽤访问控制符来保护对类、变量、⽅法和构造⽅法的访问,访问控制修饰符对应的权限控制的⼤⼩情况为:public > protected > default(包访问权限) > private。
1. 编译单元和包编译单元:即为最⼩的可以被编译且执⾏的Java⽂件。
⼀个.java⽂件就是⼀个编译单元,⼀个编译单元必须只包含有⼀个public类,可以包含有其他⾮public的类,并且⽤publi类标⽰的类名必须和⽂件名相同。
如果.java⽂件中不包含有publi类,则这个类也是没有意义的,因为不能被外界所访问。
.java⽂件中包含有⼏个类,编译后就会⽣成⼏个.class⽂件。
包含有⼀组类,是以⼀个名字空间集合在⼀起的类⽽已。
2. 访问控制修饰符public : 对所有类可见使⽤对象:类、接⼝、变量、⽅法protected : 对同⼀包内的类和所有⼦类可见使⽤对象:变量、⽅法。
注意:不能修饰类(外部类)default (即缺省,什么也不写): 在同⼀包内可见,不使⽤任何修饰符使⽤对象:类、接⼝、变量、⽅法。
private : 在本类中可见使⽤对象:变量、⽅法。
注意:不能修饰类(外部类)private和protected修饰符不能⽤以修饰类/接⼝2.1 公有访问修饰符-public被声明为 public 的类、⽅法、构造⽅法和接⼝能够被任何其他类访问。
如果⼏个相互访问的 public 类分布在不同的包中,则需要导⼊相应 public 类所在的包。
由于类的继承性,类所有的公有⽅法和变量都能被其⼦类继承。
filter过滤器原理Filter过滤器是Java Servlet规范中的一个重要组成部分,它主要用于Web应用程序中对请求或响应进行一些处理或修改。
Filter过滤器能够拦截客户端请求和响应,并对其进行一些预处理或后处理,同时不对底层资源进行任何的改变。
在Web应用程序中,客户端的请求会按照一定的顺序被多个过滤器拦截,最后才会到达目标Servlet或JSP页面。
过滤器的拦截顺序是由web.xml文件中的顺序决定的,顺序越靠前的过滤器越先拦截请求。
Filter过滤器的工作过程可以用下面的流程来描述:1、当客户端发起请求时,服务器会根据客户端请求的URL找到相应的Servlet或JSP 页面。
2、在Servlet或JSP页面被执行之前,在过滤器链中的第一个过滤器会被调用。
这个过滤器可以实现一些真正的过滤操作,比如验证用户身份等。
3、当第一个过滤器完成处理后,请求会按照web.xml文件中定义的顺序,依次经过它后面的过滤器。
4、如果过滤器链中有多个过滤器,请求将根据它们的顺序进行处理。
当请求到达最后一个过滤器时,如果没有被任何一个过滤器拦截,则将请求传递给目标Servlet或JSP 页面。
5、在Servlet或JSP页面处理请求并生成响应后,响应会按照相反的顺序经过过滤器链中的过滤器进行处理或修改,最终响应到达客户端。
通过使用Filter过滤器,可以有效的将Web应用程序的功能模块拆分成多个独立的模块,这些模块可以按照一定的顺序调用,扩展或修改Web应用程序的行为。
具体的优点包括:1、实现模块可复用性:在一个应用程序中,多个模块可能会需要进行相同或相似的过滤操作,而使用Filter可以将这些操作独立出来,易于重复使用。
2、抽象控制流:通过使用Filter可以抽象出整个请求和响应的控制流,实现更细粒度的控制。
3、有效的处理URL:通过Filter可以有效的处理URL,实现URL的解析和路由处理。
4、可扩展性:在Web应用程序中,Filter可以很方便的进行增加、删除或修改,从而实现Web应用程序的功能扩展。
shirofilter 注解
ShiroFilter是Apache Shiro框架中的一个核心组件,用于进行权限过滤和认证控制。
通过在Java Web应用程序的web.xml 中配置ShiroFilter,可以对请求进行过滤,检查用户的身份认证和访问权限。
ShiroFilter使用过滤器链机制来处理请求。
在配置文件中,可以指定一个或多个过滤器链,并定义它们的顺序和应用条件。
当一个请求进入应用程序时,ShiroFilter会按照过滤器链的顺序依次对请求进行过滤和处理,直到找到适合请求的过滤器。
注解是在Shiro框架中用于简化权限配置的一种方式。
通过在Java类或方法上使用注解,可以声明该类或方法需要进行身份认证或授权的权限,而无需在配置文件中进行繁琐的配置。
ShiroFilter会自动检查注解,并根据注解来进行相应的权限检查和处理。
例如,可以在一个Controller类的方法上使用
@RequiresPermissions注解来声明需要特定权限才能访问该方法。
当请求进入ShiroFilter时,它会检查当前用户的权限是否满足@RequiresPermissions注解指定的权限要求,如果不满足则会返回相应的错误信息或跳转到指定的页面。
通过使用ShiroFilter和注解,开发人员可以更加方便地进行权限控制,减少了繁琐的配置和代码。
同时,注解还可以提供更加细粒度的权限控制,使得权限管理更加灵活和精确。
七年级下册地理人教版电子书停课不停学!为方便孩子们提前预习,方便广大教师提前备课,下面小编给大家整理了关于七年级下册地理人教版电子书的内容,欢迎阅读,内容仅供参考!七年级下册地理人教版电子书微信搜索关注公众号:5068教学资料查看完整版电子课本可微信搜索公众号【5068教学资料】,关注后对话框回复【7】获取七年级电子课本资源。
七年级地理下册知识点(一)亚洲1.地理位置亚洲位于北半球和东半球,北临北冰洋,南临印度洋,东临太平洋,东北以白令海峡与北美洲为界,东南隔海与大洋洲相望,西南以苏伊士运河与非洲为界,西北以乌拉尔山脉、乌拉尔河、里海、大高加索山脉、黑海和土耳其海峡与欧洲为界。
2.亚洲是世界上面积最大的洲,也是世界上跨纬度最广、东西距离最长的洲。
3.亚洲是世界上面积最大的洲,也是世界上跨纬度最广、东西距离最长的洲。
4.亚洲是世界三大宗教佛教、伊斯兰教、基督教的发源地。
5.地势:亚洲地势起伏很大,中部高,四围低。
6.亚洲之最(1)世界最高的高原:青藏高原(2)世界最高的峰:珠穆朗玛峰(3)世界面积最大的平原:亚马孙平原亚洲面积最大的平原:西西伯利亚平原(4)世界最大的湖泊:里海7.气候:亚洲大陆跨寒、温、热三带。
气候的主要特征是气候类型复杂多样、季风气候典型和大陆性显著。
8.亚洲是世界上人口最多的大洲,其中东亚。
东南亚是人口密集区。
9.亚洲人口最多的国家是中国,第二是印度。
10.新加坡是亚洲人口密度最大的国家。
人口密度最小的国家是蒙古。
(二)中东1.中东战争:阿拉伯国家与以色列的战争;两伊战争:伊朗和伊拉克?2.中东战争:阿拉伯国家与以色列的战争;两伊战争:伊朗和伊拉克?。
3.中东地区气候干燥,主要有热带沙漠气候,地中海气候,温带大陆性气候。
4.中东地区的人们主要信仰伊斯兰教、犹太教和基督教。
(三)欧洲西部1.西欧指欧洲西部濒临大西洋的地区和附近岛屿,包括英国、爱尔兰、荷兰、比利时、卢森堡、法国和摩纳哥。
Java Web应用中基于Filter的访问权限控制实现
作者:向大芳
来源:《软件导刊》2017年第01期
摘要摘要:简要描述了常规使用Java脚本实现的jsp页面访问权限控制,并详细阐述了Filter的基本原理和实现方式。
在此基础上,运用Filter构建访问权限控制方案,并将其与Java 脚本方案进行对比分析。
结果表明,使用Filter对用户请求进行预处理,实现对jsp页面访问权限进行控制的方案,具备开发容易、效率高的优势。
关键词关键词:Java;服务请求;Web应用
DOIDOI:10.11907/rjdk.161995
中图分类号:TP312文献标识码:A文章编号文章编号:16727800(2017)001004103
0引言
实现对页面访问权限的控制是所有Web应用中一个无法回避的问题,对于Java Web应用而言,惯常的做法是使用Java脚本来实现,但这种实现方式比较繁琐,需要在每个要求控制的页面上都添加控制脚本。
该方式还有一个更致命的问题:当控制代码发生改变时,修改维护的工作量极大。
Filter又称过滤器,是从Servlet2.3开始增加的功能,它可以改变用户Request 请求和修改一个Response响应[13]。
充分利用Filter过滤器的这一特性使得程序员可以在用户请求页面资源时,拦截request请求并进行权限验证,从而拒绝非法访问请求。
本文将分别运用Java脚本和Filter过滤器来实现访问权限控制,并对两种方案的优劣进行对比分析。
1基于Java脚本方案的访问权限控制实现
在Filter出现之前,在Java Web应用中实现访问权限控制最常见的方案就是Servlet+Java 脚本。
其基本原理是Servlet控制器负责处理请求并进行用户合法性验证,Java脚本负责页面访问权限控制。
当用户通过浏览器发出登录请求Request时,该请求会被交给负责控制登录请求的控制器Servlet,Servlet控制器则调用Service方法进行响应。
该方法的原型如下:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
登录请求参数的传递有两种方式:一种是Get方式,另一种是Post方式。
根据请求参数传递方式的不同,Service方法调用不同的处理请求方法:doGet和doPost。
其中doGet方法用于处理Get方式的请求,doPost方法用于处理Post方式的请求。
通过表单Form登录通常采用的是Post请求方式,因此需要在doPost方法中实现对用户合法性进行验证,如果验证通过则将验证通过标识或者用户名等标识符以keyvalue键值对的形式保存在本次会话的HttpSession类型的实例化Session对象中。
假设登录页面文件为login.jsp,登录成功的目标页面为xx.jsp,表单Form的登录请求参数被封装为一个对象loginUser,该对象具有获取用户名的方法getName(),判断用户合法性的方法原型为:
当Web应用启动时会去装载Filter接口的实现类,Web容器首先实例化Filter实现类,并通过该实例对象调用其init()方法进行初始化。
初始化完成的Filter对象被Web容器保存进应用级的集合容器中去等待用户访问资源。
当用户访问的资源与web.xml配置文件中配置的Filter的url-pattern相匹配时,该请求即被拦截,此时,容器会取出Filter实例对象调用其doFilter方法。
当应用服务被停止或重新装载时,则会执行Filter实例化对象的destroy方法将该对象销毁。
如前所述,编译完成后的Filter实现类字节码文件(.class文件)并不具备对各种请求进行拦截过滤处理的能力,开发人员还必须在Web应用中对Filter进行一系列的配置。
配置Filter 有两种方式:一种是在web.xml文件中进行配置,另外一种是在Filter实现类中使用Annotation注解@WebFilter方式进行配置。
3基于Filter方案的访问权限控制实现
使用Filter实现Java Web应用中的页面访问权限控制比较容易,与Java脚本方案相同的是在处理登录请求的Servlet中,将验证通过标识符或者用户名等标识符以keyvalue键值对的形式保存在HttpSession实例对象中。
然后编写用于用户访问权限控制的过滤器类,假定过滤器类名为CheckFilter,则该类的声明如下:
public class CheckFilter implements Filter;
在该过滤器类的doFilter方法里,尝试从HttpSession实例对象中获取保存登录验证通过标识符的keyvalue键值对。
如果该键值对存在,则说明该用户是通过登录验证的用户,放行请求,否则强制跳转至登录页面。
假设Session中保存登录验证通过标识符的keyvalue键值对的key值为user,登录页面为login.jsp。
则实现访问权限控制的核心代码如下:
4结语
在几乎所有的Java Web应用中都存在用户访问权限控制的需求,实验结果表明,采用Java脚本方案进行访问控制,即便是采用改进型的方案,需要在大量的jsp页面中编写访问控制代码,极其繁琐。
而采用Filter过滤器实现用户访问控制,实现简便,配置完成后,即可对需要进行访问控制的页面进行自动过滤,无需修改任何jsp页面的代码,开发效率高且维护方便。
在Web应用规模和控制逻辑复杂程度增大的情况下,Filter方案相比传统的Java脚本方案极具优势。
参考文献:
[1]李刚.JSP/Servlet及相关技术详解[M].北京:电子工业出版社,2013.
[2]王鑫印.基于Filter技术的Web个性化服务应用研究[J].微机发展,2003(12):9395.
[3]Alur D.J2EE核心模式[M].北京:机械工业出版社,2002.
[4]李建.Java Web开发中过滤器组件应用及实例解析[J].电脑开发与应用,2009(11):58.
[5]张庆辉,李海涛.基于XML与FILTER的Web访问[J].电脑知识与技术,2009(36):1058710589.
[6]李博文.浅谈运用Java Web解决用户登录的安全问题[J].信息科技,2011(1):195196.
责任编辑(责任编辑:孙娟)
第1期吴思颖,李亚楠,王年丰,等:基于双处理器的四旋翼飞行控制系统研究软件导刊2017年标题。