Servlet Filter(过滤器)
序
Servlet Filter(过滤器)
Servlet Filter(过滤器)
Filter简介
Filter也称之为过滤器,它是Servlet技术中最激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所
有web资源:例如Jsp, Servlet, 静态图片文件或静态 html文件等进行拦截,从而实现一些特殊的功能。例如实现URL级
别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为
过滤器Filter。通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截,如
下所示:
Filter是如何实现拦截的?
Filter接口中有一个doFilter方法,当开发人员编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在
调用web资源的service方法之前,都会先调用一下filter的doFilter方法,因此,在该方法内编写代码可达到如下目的:
调用目标资源之前,让一段代码执行
是否调用目标资源(即是否让用户访问web资源)。
web服务器在调用doFilter方法时,会传递一个filterChain对象进来,filterChain对象是filter接口中最重要的一个对象,它
也提供了一个doFilter方法,开发人员可以根据需求决定是否调用此方法,调用该方法,则web服务器就会调用web资
源的service方法,即web资源就会被访问,否则web资源不会被访问。
调用目标资源之后,让一段代码执行
实验: Filter开发,见下页PPT中的开发流程
Filter开发入门
Filter开发分为二个步骤:
编写java类实现Filter接口,并实现其doFilter方法。
在 web.xml 文件中使用
验)
Filter链
在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。
web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,
web
服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象
的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用
目标资源。
Filter链实验(查看filterChain API文档)
Servlet过滤器
需注意,Filter不是一个Servlet,它不能产生一个response,它能够在一个request到达Servlet之前预处理request,也可以
在离开Servlet时处理response。
将多个过滤器组成过滤器链,每个过滤器在应用程序中执行一个任务,这样有助于确保它们的模块性和复用性。
当Web容器收到一个请求时,将发生多个操作:
Web容器对请求执行自己的预处理。在这一步中发生的事情由容器供应商负责。
Web容器检查有没有与所请求的URL匹配的URL模式的过滤器。
1
Web容器使用一个匹配的URL模式定位第一个过滤器。执行该过滤器的代码。
如果还有其他具有匹配URL模式的过滤器,则执行其代码,持续该过程,直到不再有其他具有匹配URL模式的过滤
器。
如果没有发生错误,则将请求传递到目标Servlet。
该Servlet将应答传回其调用者。应用到请求上的最后一个过滤器将成功为应用到应答上的第一个过滤器。
最初应用到请求上的第一个过滤器将应答传递给Web容器。
public void doFilter(ServletRequest req,ServletResponse res,FilterChain chain);是Filter中最核心的
方法。
参数FilterChain类型的对象是保存多个过滤器执行顺序的对象。
Filter的生命周期
init(FilterConfig filterConfig)throws ServletException:
和我们编写的Servlet程序一样,Filter的创建和销毁由WEB服务器负责。web应用程序启动时,web服务器将创建
Filter
的实例对象,并调用其init方法,完成对象的初始化功能,从而为后续的用户请求作好拦截的准备工作(注:filter对
象只会创建一次,init方法也只会执行一次。示例 )
开发人员通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。(filterConfig对象见下页PPT)
destroy():
在Web容器卸载Filter对象之前被调用。该方法在Filter的生命周期中仅执行一次。在这个方法中,可以释放过滤器使用
的资源。
FilterConfig接口
用户在配置filter时,可以使用
时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方
法,就可获得:
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回
null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
实验:得到filter配置信息
2
satoken 的saservletfilter类
satoken 的saservletfilter类
SaServletFilter 是 sa-token 框架中的一个重要组件,它是一个 Servlet Filter,用于在 Web 应用中提供全局的权限控制。
sa-token 是一个轻量级的 Java 权限认证框架,主要解决登录认证、权限授权、单点登录、OAuth2.0、微服务网关鉴权等安全问题。
SaServletFilter 的主要作用是拦截用户的请求,并根据预定义的权限策略来决定是否允许用户访问特定的资源。
它可以在用户请求到达控制器之前进行权限检查,也可以在用户请求处理完毕之后执行一些后续操作。
这个类通常会被配置在 Web 应用的 web.xml 文件中,或者通过注解的方式在 Spring Boot 等现代 Java Web 框架中自动注册。
当用户的请求到达时,SaServletFilter 会首先检查用户是否已经登录,如果用户未登录,则根据配置进行相应的处理,如跳转到登录页面或返回未授权的错误信息等。
除了基本的登录认证功能外,SaServletFilter 还支持多种权限控制策略,如基于角色的权限控制、基于资源的权限控制等。
这些策略可以通过注解或配置文件来定义,使得开发者能够灵活地控制不同用户或不同角色对资源的访问权限。
总的来说,SaServletFilter 是 sa-token 框架中实现全局权限控制的关键组件,它通过拦截用户请求并在必要时执行权限检查,确保了 Web 应用的安全性。
同时,它也提供了丰富的配置选项和扩展接口,使得开发者能够根据自己的需求进行定制化的权限控制。
过滤器filter的介绍和应用
配置:web.xml[xhtml]view plaincopy1.<filter>2.<filter-name>RightFilter</filter-name>3.<filter-class>com.***.rights.RightFilter</filter-class>4.</filter>5.<filter-mapping>6.<filter-name>RightFilter</filter-name>7.<url-pattern>*.jsp</url-pattern>8.</filter-mapping>9.<filter-mapping>10.<filter-name>RightFilter</filter-name>11.<url-pattern>*.action</url-pattern>12.</filter-mapping>代码:[java]view plaincopy1.mport java.io.IOException;2.3.import javax.servlet.Filter;4.import javax.servlet.FilterChain;5.import javax.servlet.FilterConfig;6.import javax.servlet.ServletException;7.import javax.servlet.ServletRequest;8.import javax.servlet.ServletResponse;9.import javax.servlet.http.HttpServlet;10.i mport javax.servlet.http.HttpServletRequest;11.i mport javax.servlet.http.HttpServletResponse;12.i mport javax.servlet.http.HttpSession;13.14.p ublic class RightFilter extends HttpServlet implements Filter {15.16.public void doFilter(ServletRequest arg0, ServletResponse arg1,17. FilterChain arg2) throws IOException, ServletException {18. HttpServletResponse response = (HttpServletResponse) arg1;19. HttpServletRequest request=(HttpServletRequest)arg0;20. HttpSession session = request.getSession(true);21. String usercode = (String) session.getAttribute("usercode");//22. String url=request.getRequestURI();23.if(usercode==null || usercode.equals(""))24. {25.//判断获取的路径不为空且不是访问登录页面或执行登录操作时跳转26.if(url!=null && !url.equals("") && (url.indexOf("Login")<0 && url.indexOf("login")<0 ))27. {28. response.sendRedirect("登录路径");29.return ;30. }31. }32.//已通过验证,用户访问继续33. arg2.doFilter(arg0, arg1);34.return;35. }36.37.public void init(FilterConfig arg0) throws ServletException {38.// TODO Auto-generated method stub39.40. }配置中的filter-mapping,定义的是需过滤的请求类型,上面的配置即过滤所有对jsp页面和action的请求。
javaweb考试题及答案
javaweb考试题及答案 JavaWeb考试题及答案 一、单选题(每题2分,共20分) 1. 在JavaWeb中,以下哪个不是JSP的内置对象? A. request B. response C. out D. file 答案:D
2. Servlet的生命周期中,哪个方法用于初始化Servlet? A. init() B. service() C. doGet() D. destroy() 答案:A 3. 下列哪个不是JavaWeb中的常用设计模式? A. MVC模式 B. Singleton模式 C. Factory模式 D. Observer模式 答案:B
4. 在JSP中,以下哪个标签用于包含其他JSP文件? A. <%@ include file="other.jsp" %> B. C. <%@include file="other.jsp" %> D. 答案:B
5. 在JavaWeb中,以下哪个不是JDBC操作数据库的步骤? A. 加载数据库驱动 B. 建立数据库连接 C. 创建Statement对象 D. 创建File对象 答案:D
6. 在JavaWeb中,以下哪个不是HTTP请求方法? A. GET B. POST C. PUT D. DELETE E. COPY 答案:E
7. 在JavaWeb中,以下哪个不是会话管理技术? A. Cookie B. Session C. URL重写 D. 文件上传 答案:D 8. 在JavaWeb中,以下哪个不是过滤器(Filter)的作用? A. 日志记录 B. 数据加密 C. 请求转发 D. 权限控制 答案:B
9. 在JavaWeb中,以下哪个不是JSP标准动作? A. B. C. D. 答案:D
10. 在JavaWeb中,以下哪个不是EL表达式的隐式对象? A. pageContext B. request C. session D. application E. param 答案:E
dofilter过滤器的原理
dofilter过滤器的原理dofilter过滤器是指在JavaEE中Servlet规范中的一种过滤器,它可以拦截客户端请求,修改请求和响应,或者执行一些特定的任务。
它的原理主要是基于责任链模式和回调函数机制。
首先,dofilter过滤器是通过实现javax.servlet.Filter接口来实现的,该接口定义了三个方法,init、doFilter和destroy。
init方法在过滤器被初始化时调用,可以用来进行一些初始化操作;doFilter方法是过滤器的核心,它接收客户端请求和响应对象,并可以在请求到达Servlet之前对请求进行预处理,也可以在响应返回客户端之前对响应进行后处理;destroy方法在过滤器被销毁时调用,可以用来进行一些资源的释放操作。
其次,dofilter过滤器的原理是基于责任链模式。
当一个请求到达Servlet容器时,容器会按照过滤器在web.xml文件中的配置顺序依次调用各个过滤器的doFilter方法,然后再调用Servlet的service方法。
这样就形成了一个责任链,每个过滤器都可以对请求进行处理,然后将请求传递给下一个过滤器,或者传递给Servlet。
另外,dofilter过滤器的原理还涉及到回调函数机制。
当容器调用过滤器的doFilter方法时,实际上是在调用过滤器中的回调函数,这些回调函数可以在特定的时机对请求和响应进行处理,比如在请求到达时进行身份验证、日志记录等操作,或者在响应返回时进行数据加工、页面重定向等操作。
总的来说,dofilter过滤器的原理是基于责任链模式和回调函数机制,它可以对客户端请求和响应进行拦截和处理,实现一些特定的功能,比如日志记录、身份验证、字符编码转换等。
希望这个回答能够全面地解释dofilter过滤器的原理。
过滤器、拦截器应用场景、区别和使用
过滤器、拦截器应⽤场景、区别和使⽤
应⽤场景
过滤器的应⽤:字符编码转换,敏感词过滤、登陆权限验证、资源访问权限等
拦截器的应⽤:AOP、需要有⼀些业务逻辑(需要注⼊Bean等)
区别
1. 过滤器配置再web.xml中、拦截器配置springmvc的配置⽂件中(即在DispatcherServlet的contextConfigLocation属性指定⽂件所在位
置,默认加载的是:/WEB-INF/servlet名称-servlet.xml(springmvc-servlet.xml))
2. 过滤器基于函数回调、拦截器基于反射
3. 过滤器⼏乎对所有请求起作⽤,拦截器只对⽬标执⾏⽅法(action⽅法)起作⽤
4. 过滤器:对请求进⾏预处理、再交给Servlet处理并且⽣成响应,最后Filter再对服务器响应进⾏后处理
拦截器:可以再⽅法执⾏前调⽤(preHandle)、⽅法执⾏后(postHandle)、视图页⾯渲染后(afterCompletion)
执⾏流程
过滤器初始化-》(客户端请求过来)dofilter处理请求-》到达dispatchServlet,在⽬标⽅法执⾏前preHandle-》(放⾏,返回true)执⾏⽬标⽅法-》(正常返回,异常则不执⾏)postHandle-》(⽆论⽬标⽅法是否执⾏或者执⾏是否出现异常,都会执⾏)afterCompletion-》dofilter 处理响应-》客户端加载页⾯。
filter过滤器解决中文乱码和客户端IP访问控制
filter过滤器的启动过程,以二个实际运行的例子,一个是客户机IP地址过滤器和中文字符编码过滤器为例建立一个filter过滤器,需要实现Filter这个接口的三个方法,一个是public void init(FilterConfig filterConfig) throws ServletException一个是public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException一个是public void destroy()由于filter过滤器的定义是在web.xml中,而web.xml中的内容在tomcat 启动时就会被调用,对于一个filter过滤器而言,其init方法在系统启动时被调用,当用户在浏览器中发出一个请求时,如果是相应过滤器处理的,则其doFilter开始被调用,调用完后,由过滤器链FilterChain将控制传给下一个过滤器以testweb项目中对客户端IP进行过滤的过滤器为例,这里本来是在web.xml中设定一个IP地址范围,为了测试方便,在开发机本机上能测试,就改为127.0.0.1了,如果在开发机上访问,使用StringremoteIP=request.getRemoteAddr();//获取客户请求IP这一句得到的IP是127.0.0.1public class Ipfilter implements Filter {protected FilterConfig config;protected String rejectedIP;public void init(FilterConfig filterConfig) throws ServletException{this.config=filterConfig;this.rejectedIP=config.getInitParameter("RejectedIP");if(this.rejectedIP==null)this.rejectedIP="";}public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException, ServletException{RequestDispatcher dispatcher=request.getRequestDispatcher("rejectedIPError.jsp");String remoteIP=request.getRemoteAddr();//获取客户请求IPint i=stIndexOf(".");int r=stIndexOf(".");String relPscope=rejectedIP.substring(0,r);//过滤IP段// if(relPscope.equals(remoteIP.substring(0,i))) if(remoteIP.equals(rejectedIP)){//重定向到rejectedError.jsp页面dispatcher.forward(request, response);}else{chain.doFilter(request, response);}}public void destroy() {this.config=null;this.rejectedIP="";}其Web.xml中定义部份如下:正式发布时可以修改下面的IP地址,对真实的客户端IP地址进行拦截。
基于Servlet Filter的安全Web访问
学术论坛2006NO .14Sc i e nc e a nd Te chn ol og y Con su l t i ng H e r a l d 科技咨询导报随着网上应用系统企事业管理信息系统电子商务电子政务等we b 业务的开展使用W eb 技术进行应用系统开发已成为必然趋势典型的W eb 应用经常要获取大量的公共和私有资源如何最大限度的获取公共资源同时又保护好私有资源是w eb 开发中经常遇到的问题具体实现时可以考虑在每个页面中都编写用户认证资源访问权限检查等代码但这样做的结果使得程序复杂化可读性差可重用性降低为了更好的解决这一问题本文给出了基于Ser vl et Fi l t e r 的W e b 安全访问技术1S ervl et fi l t erFi l t e r 是这样一种J ava 对象它能在r eques t 到达ser vl et 之前对其进行预处理也可以在离开ser vl et 时修改r es pons e 对象但它本身并不是s er vl e t 不能产生r es ponse Fi l t er 的核心是Fi l t e r i nt er f a ce 它定义了如下的方法i nit ()-i ni t()方法用来对过滤器进行初始化doFi l t er ()-doFi l t er 方法实现过滤逻辑对用户请求执行过滤操作des t r oy()-此方法执行过滤器销毁前的清理工作i ni t()方法应该在过滤器使用之前成功初始化des t r oy()用于释放线程内存等资源也用于将持久性状态信息保存到文件或者数据库中Fi l t e r 中的另一个重要概念是Fi l t er Chai n 过滤器链它用于将多个f i l t er 连接到一起处理来自同一个用户的请求过滤任务的执行如图1[1]所示2安全W e b 访问结构安全的W e b 应用通常要支持用户验证资源访问审核数据加密数据压缩对被访问资源的转换包括从se r vl e t 和JSP 的动态输出记录请求/响应日志以及触发数据库事件等内容以此来保证w eb 资源we b 页面文件动态we b 应用等访问的安全性图2展示了基于Ser vl et f i l t e r 的W eb 安全访问结构在此结构中用户的安全访问请求首先要由第一个相关f i l t er agent 的doFi l t er 方法来捕获然后此方法将收集到的信息提交给预处理模块由其完成预处理操作如进行身份验证过滤不安全因素监视统计请求的来源与出处等等并将结果返回给f i l t e r agent 随后执行链中的下一个过滤器如果没有其他f i l t er age nt 则用户请求的ser vl e t 或J SP 页面被执行过滤功能是双向的同样也可以对JSP/Ser vl e t 的r e spons e 进行处理例如对输出进行压缩对XM L 数据进行转换等等3安全访问策略图2的结构中定义了多个安全访问处理模块这些处理模块既可以驻留在一台策略服务器中集中式管理也可以分散到多台机器上分布式管理这取决于用户的实现当f i l t er agent 要求认证或者是请求访问控制时由驻留在服务器上的安全管理模块做出访问决定例如当一个未经确认的用户要求访问某资源时策略服务器按照预先制定的资源访问策略验证用户并将用户访问权限反馈给f i l t er agent 最终s er vl et 或者j sp 页面就可以按照此权限控制用户访问的内容了通常情况下需要对每个安全访问处理模块都制定各自的访问策略以用户权限审核模块为例可以制定超级管理员具有全部资源访问权限一般管理员有全部资源读写权而普通用户拥有的是部分资源只读权可以通过J N D I (名字与目录服务)来支持对安全策略处理模块的访问这样就能很容易的在f i l t er agent 中获得处理模块对象的引用进而完成访问了4安全访问实例对于一个安全w eb 访问通常要在应用开始之前由f i l t er agent 截取用户请求以验证用户身份然后再将其指派到公共资源i nt r anet 用户访问资源或者管理员访问资源等授权访问的资源身上Fi l t er agent 截取用户请求后调用实际执行用户验证的j ava 类方法来完成验证下面以实现用户权限审核模块的j a va 类和接口i nt er f a ce 为例描述安全w eb 访问的实现过程publ i c i nt e r f ace A ut hI nt er f ace {publ i c bool ean i sA ut hU ser (U ser user ,St r i ngur i );}基于Ser vl et Fi l t er的安全W eb 访问杨培栋内蒙古乌海市邮政局016000摘要:安全web 访问是web 应用开发中的一项十分重要的内容为此本文介绍了一种基于s er vl et f i l t e r 的安全w e b 访问结构此结构利用ser vl et f i l t e r 访问处理模块和安全策略来保证访问安全性本文随后通过安全访问实例描述了这一结构的实现过程这一结构将为中小型安全we b 访问提供一种良好的解决方案关键词:Ser vl et Fi l t er JN D I Fi l t er C hai n I nt er f ace 中图分类号TP393文献标识码:A 文章编号1673-0534(2006)10(a)-0107-03图2A ut hI nt er f ace接口定义了一个publ i c bool ean i sA ut hU ser(U ser user,St r i ng ur i)方法此方法接受一个U s e r对象假设此对象被存储在ht t pSe ss i on中和r e quest U RI如果用户有权访问授权资源则返回t r ue否则返回f a l se假设i nt r anet用户和管理员用户访问的资源被分组放置到'aut hRes our ce'目录下而w e b.xm l文件中配置的过滤实体如下<!--Ser v l et Fi l t er t hat handl es sour ce a ut hor i z at i on.--><fi l t er><f i l t er-nam e>A ut hFi l t er</f i l-t e r-na m e><f i l t er-c l ass>A ut hFi l t e r</f i l-t er-cl ass><desc r i pt i on>T hi s Fi l t e r aut ho-r i zes user access t o ap pl i cati on so ur ce b ased upon r equest U R I.</desc r i pt i on><i ni t-pa r a m><par am-nam e>er r or_page</ pa r a m-na m e><par am-val ue>er r or.j s p</ par am-va l ue></i ni t-pa r a m></f i l t er><f i l t er-m appi ng><f i l t er-nam e>A ut hFi l t er</f i l-t e r-na m e><ur l-pat t er n>/aut hRes our ce/* </ur l-pat t er n></f i l t er-m a ppi ng>接下来定义一个s e r vl e t f i l t e r A ut hFi l t er)并实现它的i ni t()方法此方法通过Fi l t e r C onf i g对象来获取w eb.xm l 文件中定义的初始化参数er r or_page此参数用来指定当认证失败时f i lt er将重定向的错误处理页pu bl i c cl ass A ut hF i l t er i m plem en t s Fi lt er {pr i vat e St r i ng er r or Page;/**Fi l t er shoul d be conf i gur ed w i t h a n sys t em e r r or page.*/publ i c voi d i ni t(Fi l t er Conf i g Fi l t er C onf i g)t hr ow s Ser vl et E xcept i on{i f(Fi l t er C onf i g!=nul l){ er r or Page=Fi l t er C onf i g.get I ni t Par am et er ("er r or_page");}}再来看看A ut hFi l t er中的doFi l t e r()方法此方法首先检查U se r和U RI变量是否存在如果存在则通过JD N I获取用户权限审核对象并将U se r和U R I变量传递给它然后等待审核结果审核通过则将请求转发给最终的se r vl e t如果还需要其他模块处理的话则转发给过滤链中的下一个f i l t er a gent否则调用r e t ur nEr r or方法重定向到出错处理页面doFi l t er实现代码如下publ i c voi d doFi l t er(Ser vl et R eques tr e que st,Se r vl e t Re s pons e r es pons e,Fi l t er C hai n chai n)t h r ow s Ser vl et E xcept i on,I O E xc ept i on{i f(e r r or Pa ge==nul l){r et ur nE rr or(r equest,r esponse,"A ut hFi l t ernot pr oper l y c onf i gur e d!");}H t t pSe s s i on s e s s i on=((H t t pSer vl et R equest)r equest).get Sessi on(f alse);U s e r c ur r e nt U se r=(U se r)sessi on.g et A t tr i bu t e("u ser");i f(cur r e nt U s e r==nul l){r et ur nE r r or(r equest,r esponse,"U ser doesnot exi st i n sessi on!");}el se{//G et r el e va nt U R I.St r i n g URI=((H t t p Se r vl e t Re q ue s t)r e q ue s t).get R equest U R I();//O bt ai n A ut hor i z at i onf r om J N D ICont e xt c t x=ne wI n i t ial C ontex t();O bj ec t hom e=ct x.l ookup("A ut hor i zat i on");A ut hI nt er f ac e aut hM gr=(A ut hI nt er f ac e)Por t abl eRem ot eO bj ect.na r r ow(hom e,A ut hI nt er f ace.cl ass);//I nvoke A ut hI nt e r f ac em et hod t o see i f user can ac cess r esour ce.bool e an a ut hor i z ed=a ut hM gr.i sA ut hU se r(c ur r ent U ser,U RI);i f(aut hor i z ed){cha i n.doFil t er(r equest,r espon se);}el s e{r et ur nEr r or(r equest,r esponse,"U ser i s not aut hor i zed t o accesst hi s ar ea!");}}}doFi l t er()方法在J N D I中查找名字为A ut hor i z a t i on的对象引用此对象实现了A ut hI nt er face接口以帮助fi l t er agent完成权限审核值得注意的是A ut hFi l t e r访问的是A ut hI nt er f ace接口而不是实际的实现类这样做的目的是隐藏权限审核的具体实现细节当实现类中的审核方式发生改变时不会影响应用的其他部分这样就使得f i l t era gent完全不用考虑底层的具体实现它只需知道通过调用i sA ut hU ser()就可完成用户权限审核A ut hor i z at i on类的实现代码如下publ i c cl ass A ut hor i z at i on ext endsA ut hI nt er f ace{//C ont ai ns r ol e m appi ngs.pr i vat e Pr oper t i es r ol eM a ppi ngs;/**Load m appi ngs f r om a pr oper t i esf i l e on t he f i l e syst em.*/publ i c A ut hor i zat i on(){//R e ad i n pr oper t i es f i l e cont ai n-i ng r ol e m appi ngs...r ol eM appi ngs=new Pr oper t i es();t r y{r ol eM a ppi ngs.l oa d(ne wFi l eI n put St r eam(S yst em.get Pr o per t y("f i l e.separ at or")+"m appi ng.pr oper t i es"));}cat c h(E xc ept i on e){t h r o w n e wR unt i m eE xcept i on(e);}}/*R et ur ns bool ean i ndi cat i ng w het herus er has t he a ppr opr i a t e r ol e f or t hespe ci f i ed U R I.*/publ i c bool ean i sA ut hU ser(U ser user,St r i ng ur i){bool e an m at c hFound=f a l se;bool ean aut hor i ze d=f a l se;I t er at or i=r ol eM appi ngs.ent r ySet().i terat o r();//L oop t hr ough e ac h U RI m a p-pi ng and check us er's r ol e s.E xi t oncem at ch i s f ound.w hi l e((!a ut hor i ze d)&&(i.hasN ext())){M ap.Ent r y m e=(M a p.E ntr y)i.n ext();//Pat t e r n m at ch.'*'shoul d be i nt er pr et ed as a w i l dcar df or anyA SC I I cha r act er.St r i ng m a pPat t er n=((St r ing)m e.get V al ue()).r epl aceA l l("\\*",".*");m a t c hFound=Pat t er n.m at ches(m apPat t er n,ur i);i f(m at chFound&&us er.get U ser R ol es().cont ai ns(m e.get K ey())){a ut hor i zed=t r ue;}}r et ur n a ut hor i zed;}类A u t h or i z a t i on从策略服务器的m appi ng.pr oper t i es文件读取用户访问策略除了采用文件方式也可以采用数据库或者是XM L文件存放访问策略#Pr oper t i es f i l e w i t h r ol e/ur i pat hpat t er n m appi ngs.#{R ol e}={U R I pat h}下转110页A D M I N=/aut hRe sour c e/a dm i n/*U SE R=/a ut hRes our c e/use r s/*A ut hor i zat i on类的构造函数通过读取m appi ng.pr oper t i es文件获取用户访问策略并将其装载到Pr oper t i e s类型的变量中以供i s A ut hU ser方法使用i sA ut hU se r()方法通过传递进来的U s er和U R I参数来匹配映像内容如果找到则返回t r ue代表U s er 对U RI中的资源具有访问权限否则返回f al se5过滤器链[2]W e b访问会涉及到多种安全访问角色考虑一个网上银行系统当用户登录时首先要验证用户身份看看他是否属于网上银行用户然后要检查用户访问权限对于普通用户可能只有查看帐户信息的权限而对于vi p用户则可能拥有转帐功能当认证和授权通过之后还可能要对用户和银行之间的通信进行加密处理对于这样一个处理序列可以通过f il t er chai n(过滤器链)来保证每一步的安全例如在w e b.xm l中依次列出l ogi n (登录),a ut h授权和enc r ypt加密三个过滤器形成一个过滤器链<fi l t er><f i l t er-nam e>l ogi n</f i l t er-nam e><fi l t er-cl ass>dem o.f il t ers.l og i n</fi l-t er-cl ass></f i l t er><fi l t er><f i l t e r-nam e>aut h</f i l t er-na m e><fi l t er-cl ass>dem o.fi l t er s.au t h</f i l-t er-class></f i l t er><f i l t er><f i l t er-nam e>encr ypt</f i l t er-nam e><fi l t er-cl ass>dem o.f il t er s.en cr ypt</f il ter-cl ass></f i l t er><f i l t er-m appi ng><f i l t er-nam e>l ogi n</f i l t er-nam e><ur l-pat t e r n>/aut hSour c e/*</ur l-pat t er n></f i l t er-m appi ng><f i l t er-m appi ng><f i l t e r-na m e>aut h</f i l t er-nam e><ur l-pat t e r n>/aut hSour c e/*</ur l-pat t er n></f i l t er-m appi ng><f i l t er-m appi ng><f i l t er-nam e>encr ypt</f i l t er-nam e><ur l-pat t e r n>/aut hSour c e/*</ur l-pat t er n></f i l t er-m appi ng>当W eb应用程序请求/aut hRe sour c e/下的任一资源时都会依次执行l ogi n a ut h和e ncr ypt三层过滤最后呼叫请求资源当然也可以针对不同的任务分配不同的f i l t er图3展示了f i l ter F1被映射到ser vl et sS1,S2,S3,f i l t er F2被映射到se r vl et S2,而f i l t er F3则被映射到ser vl e t s S1S2.6结束语w eb安全访问有多种实现方式最常见的可以在每个j sp文件或者ser vl et中对用户访问进行验证但当有大量的j s p页面或者ser vl et需要访问控制时这不是一种好的选择为此我们给出了一种基于ser vl et f i l t er的w eb安全访问方式只需将j sp或ser l vet映射到少量的f i l t er agent就可以了之后所有的访问控制都交给访问控制处理模块来完成这将为安全w e b访问提供一种良好的解决方案参考文献[1]M a r k A r t i ge s,G upr e et Si ngh B hasi n,et c.B EA W ebLogi c Se r ve r(t m)8.1U nl eas hed.Sam s Publ i s hi ng.N ovem-ber20,2003[2]St ephani e B odof f,D al e G r een,K i mH aase,E r i c Je ndr oc k,M oni c a Pa w l an,B e t hSt ea r ns.The J2EE T MT ut or i al.A pr i l24,2002图3上接108页#pr agm a opt i m i z e("gsy",on)在L ogi n中嵌入r un.exe的方法是在Logi n工作区的资源列表中输入(i m por t)在文件类型选择*.*"找到前面生成的r un.e xe文件资源类型可以任意取名如D at a"则增加了一个二进制资源I D R_D T A T1就是前面Fi ndResour ce函数找的资源这样编译生成的L ogi n.e xe运行时就可以成功地释放r un.e xe并且运行它了由于r un.e xe是一个单独进程即使L ogi n主程序被学生关闭它依然在运行直至功能完成4结语在每台学生机上安装了l ogi n.exe程序后我们机房管理就更加方便有序了极大地减少了维护工作并且避免了由于同时访问服务器而使服务器不反应的情况出现在局域网中访问的程序编写时释放小程序并且设置随机的延迟应该是一种比较可行的防止冲突的方法参考文献[1]胡贵祥.机房用户文件隔离的实现.中国科技信息,2005,24B,227[2]乔林,杨志刚,刘文杰.V i s ual C++6.0程序设计.中国铁道出版社.1999,11[3乔林,杨志刚.V i sual C++6.0高级编程技术.中国铁道出版社.2000,8#pr a gm a c om m e nt(l i nke r,"/A L I G N: 16")#pr a gm a c om m e nt(l i nke r,"/O PT: NO W I N98")#p r a gm a c omm e n t(l i nk e r,"/ M ER G E:.r da t a=.da t a")#p r a gm a c omm e n t(l i nk e r,"/ M ER G E:.t e xt=.da t a")#p r a gm a c omm e n t(l i nk e r,"/ M ER G E:.r e l oc=.da t a")。
saservletfilter 非web上下文无法获取request
saservletfilter 非web上下文无法获
取request
在使用 SAServletfilter时,可能会遇到“非Web上下文无法获取Request”的错误,这通常是由于在不恰当的上下文中调用了 Sa-Token 的 API 造成的。
以下是几种可能导致该错误的情况和解决方案:
- 在 main 方法中调用了 Sa-Token 的 API:应该先获取所需的值,然后将其作为参数传递给这些方法,而不是直接在方法内部调用 Sa-Token 的 API。
- 在带有 @Async 注解的方法中调用了 Sa-Token 的 API:应该确保在异步线程中获取所需的值,并将其作为参数传递给方法。
- 在子线程中调用了Sa-Token 的API:由于RequestContextHolder 使用ThreadLocal 共享数据,子线程可能会丢失 ThreadLocal 中原来线程的数据。
解决方法是在子线程中重置 RequestContextHolder 对象。
- 在非 Http 协议的 RPC 框架中调用了 Sa-Token 的 API:应该确保在适当的上下文中调用 Sa-Token 的 API,例如在 RPC 框架的回调方法中。
如果仍然无法解决问题,建议查阅 SAServletfilter的文档或寻求相关的技术支持。
JavaServlet框架详细解析
JavaServlet框架详细解析Java Servlet框架详细解析Java Servlet框架是Java开发中常用的一种Web开发框架,它基于Servlet技术,能够帮助开发者更加便捷地构建动态网站和Web应用程序。
本文将对Java Servlet框架进行详细解析,包括其基本原理、组件以及应用场景等方面。
一、基本原理Java Servlet框架是基于Servlet技术的,因此了解Servlet的基本原理对于理解框架的工作机制至关重要。
Servlet是JavaWeb的核心组件之一,其作为服务器端程序,能够接收客户端的HTTP请求并且生成HTTP响应。
Servlet的运行依赖于Java Servlet规范以及Servlet容器,常见的Servlet容器有Tomcat和Jetty等。
在Servlet框架中,Servlet容器负责接收HTTP请求并将其转发给相应的Servlet处理。
Servlet通过实现Servlet接口,重写其中的doGet、doPost等方法来处理不同类型的HTTP请求。
通过Servlet容器的映射配置,可以将不同的URL路径映射到不同的Servlet上,以实现对不同请求的处理。
二、基本组件Java Servlet框架由一系列组件构成,这些组件相互配合,共同构建出一个完整的Web应用程序。
以下是几个核心组件的简要介绍。
1. ServletServlet是整个框架的核心组件,每个Servlet通过实现Servlet接口来处理请求。
Servlet负责从请求中获取参数、执行业务逻辑,并生成HTTP响应。
它还可以通过调用其他组件或服务来实现更为复杂的功能。
2. FilterFilter是对Servlet请求和响应的处理过滤器,可以在Servlet之前或之后进行操作。
Filter可以对请求进行预处理,如身份验证、数据过滤等,还可以对响应进行后处理,如添加特定的头信息、压缩页面等。
通过Filter,可以实现一些通用的功能模块,增加应用的可重用性和可维护性。
过滤器filter的配置
过滤器filter的配置推荐:多个filter拦截的同⼀个请求,按web.xml配置顺序进⾏过滤返回的响应的从最后配置的filter开始过滤具体配置步骤:编写Filter实现类1package cn.kihyou.b2c.filter;23import java.io.IOException;45import javax.servlet.Filter;6import javax.servlet.FilterChain;7import javax.servlet.FilterConfig;8import javax.servlet.ServletException;9import javax.servlet.ServletRequest;10import javax.servlet.ServletResponse;1112//实现接⼝:javax.servlet.Filter;13public class AdminFilter implements Filter {1415// 三个重要⽅法:初始化:init();拦截到要执⾏的⽅法:doFilter();销毁:destroy();1617 @Override18public void init(FilterConfig filterConfig) throws ServletException {19// TODO Auto-generated method stub20// Filter.super.init(filterConfig);21 }2223 @Override24public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)25throws IOException, ServletException {26// TODO Auto-generated method stub27// 1.拦截客户端/上⼀个filter发来的请求,是否放⾏到Servlet/下⼀个Filter28 System.out.println("AdminFilter拦截到请求");29// 放⾏(放不放⾏您可以⾃⼰看着办)30 chain.doFilter(request, response);31// 2.拦截servlet/filter发回的响应,是否放⾏到客户端/上⼀个filter32 System.out.println("AdminFilter拦截到响应");3334 }3536 @Override37public void destroy() {38// TODO Auto-generated method stub39// Filter.super.destroy();40 }4142 }配置web.xml1<!-- Filter,过滤器 -->2<filter>3<!-- filter名,随便起 -->4<filter-name>AdminFilter</filter-name>5<!-- 实现类所在⽬录 -->6<filter-class>cn.kihyou.b2c.filter.AdminFilter</filter-class>7<!-- 初始化参数 -->8<!-- 设置字符集,charset:UTF-8 -->9<init-param>10<!-- 参数名 -->11<param-name>charset</param-name>12<!-- 参数值 -->13<param-value>UTF-8</param-value>14</init-param>1516<!-- 设置内容类型及其字符集,contentType:text/html;charset=UTF-8 -->17<init-param>18<param-name>contentType</param-name>19<param-value>text/html;charset=UTF-8</param-value>20</init-param>21</filter>2223<!-- filter的映射 -->24<filter-mapping>25<!-- 对应的filter名 -->26<filter-name>AdminFilter</filter-name> 27<!-- 要进⾏拦截过滤的⽬录 -->28<url-pattern>/web/admin/*</url-pattern> 29</filter-mapping>3031<session-config>32<!-- 超时时间,单位:分钟 -->33<session-timeout>30</session-timeout> 34</session-config>。
