JSP中用filter 过滤某个包中的所有servlet
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP中用filter 过滤某个包中的所有servlet相关的知识,希望对你有一定的参考价值。
请问我应该如何配置XML才可以让CommentFilter过滤web包下的所有servlet呢?
Filter开发分为二个步骤:1.编写java类实现Filter接口,并实现其doFilter方法。2.在web.xml文件中使用和元素对编写的filter类进行注册,并设置它所能拦截的资源。Filter链在一个web应用中,可以开发编写多个Filter,这些Filter组合起来称之为一个Filter链。web服务器根据Filter在web.xml文件中的注册顺序,决定先调用哪个Filter,当第一个Filter的doFilter方法被调用时,web服务器会创建一个代表Filter链的FilterChain对象传递给该方法。在doFilter方法中,开发人员如果调用了FilterChain对象的doFilter方法,则web服务器会检查FilterChain对象中是否还有filter,如果有,则调用第2个filter,如果没有,则调用目标资源。Filter链实验(查看filterChainAPI文档)Filter的部署-注册FiltertestFitlerorg.test.TestFiterword_file/WEB-INF/word.txt1.用于为过滤器指定一个名字,该元素的内容不能为空。2.元素用于指定过滤器的完整的限定类名。3.元素用于为过滤器指定初始化参数,它的子元素指定参数的名字,指定参数的值。在过滤器中,可以使用FilterConfig接口对象来访问初始化参数。元素用于设置一个Filter所负责拦截的资源。一个Filter拦截的资源可通过两种方式来指定:Servlet名称和资源访问的请求路径子元素用于设置filter的注册名称。该值必须是在元素中声明过的过滤器的名字设置filter所拦截的请求路径(过滤器关联的URL样式)指定过滤器所拦截的Servlet名称。指定过滤器所拦截的资源被Servlet容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST。用户可以设置多个子元素用来指定Filter对资源的多种调用方式进行拦截。子元素可以设置的值及其意义:REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。INCLUDE:如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。ERROR:如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。Tip:Filter的部署—映射Filter示例:testFilter/test.jsptestFilter/index.jspREQUESTFORWARDFilterConfig接口:用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得:StringgetFilterName():得到filter的名称。StringgetInitParameter(Stringname):返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.EnumerationgetInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。publicServletContextgetServletContext():返回Servlet上下文对象的引用。 参考技术Aweb.xml中这样配置:
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>com.zq.servlet.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/servlet/Login</url-pattern>
</servlet-mapping>
或者不配置web.xml在servlet中写注解:
@WebServlet("/servlet/Login")
配置fliter可以在web.xml中这样写:
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.zy.filter.UserLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
或者不配置web.xml在filter中写注解:
@WebFilter(filterName="/MyFilter",urlPatterns="/servlet/*")
即在所有想过滤的servlet名字前加上“/setvlet”在过滤的时候过滤路径就可以写成“/servlet/*”这样就能过滤所有的Servlet。
参考技术B 1、在Jsp页面将文本框输入域放在html表单form之中提交2、后台定义一个过滤器继承Filter.java
3、在过滤器中的doFilter方法中,将参数ServletRequest转化为HttpServletRequest
4、利用HttpServletRequest.getParameter();方法即可获取对应输入域的value值。
示例:
在Jsp页面:
<form>
<input type="text" name="username" value="zhangsan"/>
</form>
后台过滤器:
public class TestFilter implements Filter
@Override
public void destroy()
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain filter) throws IOException, ServletException
HttpServletRequest res = (HttpServletRequest) request;
//获取页面的username输入框的值
String username = request.getParameter("username");
return;
@Override
public void init(FilterConfig arg0) throws ServletException
参考技术C 这个是没有办法的,项目发布,路径中是没有包的概念的
可以将servlet的路径统一加一个前缀/f/*servlet
然后过滤f下所有文件即可,否则只能将所有servlet路径一个一个配置进去 参考技术D 可以通过URL来进行过滤,首先你先要将所有的servlet的名称规范一下,比如 xxxServlet;
然后在web.xml中将CommentFilter的过滤范围配置成 /* ,过滤所有的请求,
最后在过滤器中获得请求的URL,在将含有Servlet的字符的URL处理处理掉,这样就达到过滤的效果了
以上是关于JSP中用filter 过滤某个包中的所有servlet的主要内容,如果未能解决你的问题,请参考以下文章
如何按 Django-filter 包中的日期字段进行过滤?