过滤器六:url-pattern设置过滤范围

目录

一:引入问题:

二:url-pattern设置过滤范围简介:

三:案例演示

0.准备内容:

1.情况一:web.xml中的url-pattern是/test.jsp时:

2.情况二:web.xml中的url-pattern是/servlet/*时:

四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点

1.第一个注意的点,Servlet的url设置成“/”,可以充当根路径,此时过滤器的url-pattern设置成“/”的时候,过滤器可以拦截这个Servlet

2.第二个需要注意的点:默认的首页index.jsp会让第一点中的东西失效

3.面对1、2两个注意点,一个不错的做法

4.复合url-pattern:同时过滤多种url

五:设置过滤范围:注解的写法


一:引入问题:

        通常url-pattern设置成“/*”;即对所有请求进行过滤;但是当有特殊要求的时候,即改变过滤范围的时候如何做?


二:url-pattern设置过滤范围简介:


三:案例演示

0.准备内容:

案例:包括UrlPatternFilter过滤器类;SampleServlet1这个Servlet类;test.jsp;

test.jsp:访问的url为:localhost:8080/url-pattern/test.jsp

SampleServlet1这个Servlet:访问的url为:localhost:8080/url-pattern/servlet/sample1

package com.imooc.filter;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class SampleServlet1
 */
@WebServlet("/servlet/sample1")
public class SampleServlet1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public SampleServlet1() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		// 仅为演示目的,这儿打印类名
		response.getWriter().println("This is"+this.getClass().getSimpleName());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

过滤器类:UrlPatternFilter:本篇博客的主要目的是url-pattern,所以在这个过滤器的doFilter方法中,就打印请求的url:

package com.imooc.filter;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class UrlPatternFilter implements Filter{

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		// 这儿打印拦截到的url
		System.out.println("拦截到"+req.getRequestURL()); // getRequestURL选用的是返回值为StringBuffer的那一个
		chain.doFilter(request, response);
		
	}

	@Override
	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

1.情况一:web.xml中的url-pattern是/test.jsp时:

当web.xml中的url-pattern是/test.jsp时:即此时是资源的精准匹配。

访问test.jsp时:

但是如果,访问SampleServlet1的时候: 

     

2.情况二:web.xml中的url-pattern是/servlet/*时:

如果想让过滤器拦截到localhost:8080/url-pattern/servlet/sample1,url-pattern应该这样设置:

效果:发现,此时可以拦截到localhost:8080/url-pattern/servlet/sample1了;

注解:<url-pattern></url-pattern>标签中的url值,如只写/servlet/*就行了,而不用写成/url-pattern/servlet/*,即其省略了上下文路径!


四:着重说明:“三:案例演示”部分的补充说明:几个需要注意的点

/:映射的问题:需要说明的几个容易出错的问题!!!

1.第一个注意的点,Servlet的url设置成“/”,可以充当根路径,此时过滤器的url-pattern设置成“/”的时候,过滤器可以拦截这个Servlet

首先,创建SampleServlet2:这个Servlet的url为“/”,即代表,要把这个Servlet设置成项目的默认首页,即当直接访问localhost:8080/url-pattern/的时候,会访问这个Servlet,然后这个Servlet会转到特定的前端界面(html或jsp等啦);

同时,web.xml中的过滤器的url-pattern设置为:“/”,以期访问SampleServlet2的时候,过滤器能够拦截这个请求:

如果访问:localhost:8080/url-pattern/:后面不增加其他任何资源,其直接访问的是SampleServlet2(即此时,SampleServlet2看来就像是应用的“默认首页”(其实不能这么说啦));同时,过滤器也拦截了这个请求;

但是,需要注意,这个“/”映射web应用根路径的时候,只对Servlet起作用!而且:默认的首页index.jsp会让其失效!!!

…………………………………………………… 

2.第二个需要注意的点:默认的首页index.jsp会让第一点中的东西失效

如果此时在项目中,增加一个index.jsp:默认首页

那么此时,访问localhost:8080/url-pattern/的时候,SampleServlet2和index.jsp哪个生效嘞?

此时,再访问localhost:8080/url-pattern/:后面不增加其他任何资源的时候,访问的是默认首页index.jsp,而不是访问SampleServlet2了;同时在程序的控制台,也并没有被过滤器拦截的记录。

疑问:即也配置了SampleServlet2的url为“/”,即设置了根路径,,也在web.xml中配置了过滤器url-pattern为“/”;为什么访问localhost:8080/url-pattern/的时候,不仅没有访问SampleServlet2,而且过滤器也没有对localhost:8080/url-pattern/进行拦截呐???

原因:这里涉及到了Tomcat的一个底层机制,尽管在url中访问的是“/”(根路径,也就是localhost:8080/url-pattern/啦),但是因为web.xml配置了默认首页(就是index.html,index.jsp那些啦),实际上在访问localhost:8080/url-pattern/这个根路径的时候,隐式的跳转到了index.jsp;            同时过滤器并没有拦截index.jsp;

同时发现,默认首页的优先级是比Servlet(url设置成"/")要高的,一旦设置了默认首页(如有了index.jsp)后,会让上面的那个路径设置成“/”的SampleServlet2失效,也就是上面所说的“默认首页index.jsp会让“/”的作用失效”。

如果,已经有了index.jsp,还想让过滤器对index.jsp(默认首页)进行拦截的话,此时过滤器的url-pattern需要设置成:*.jsp,或者/index.jsp才行;

……………………………………………………

3.面对1、2两个注意点,一个不错的做法

为了避免上述问题,不错的做法是:在实际项目开发中,尽量不要设置index.jsp这样的默认首页;而是设置url为“/”的Servlet,通过这个映射到根路径的Servlet,来去跳转到指定的页面进行显示。这样做可以保证(url设置成“/”的)Servlet不会失效,又能手动的控制我们要显示的页面是哪个;!!!!!!!!!!

……………………………………………………

4.复合url-pattern:同时过滤多种url

对于过滤器来说,既想对默认根路径进行过滤,又想对所有jsp进行过滤,还想对所有Servlet前缀的url进行过滤,这种复合的应该怎么做?

结果:发现,此时访问默认首页index.jsp也被过滤器拦截了:很简单,因为,index.jsp是默认首页,当浏览器访问localhost:8080/url-pattern/的时候,自然会访问index.jsp;但是,又因为在过滤器中添加了*.jsp,所以自然也会对index.jsp进行拦截了。


五:设置过滤范围:注解的写法

猜你喜欢

转载自blog.csdn.net/csucsgoat/article/details/114273595