Argo源码阅读(四):Servlet过滤器

本文探讨了Argo中Servlet过滤器的角色,它在用户访问权限检查等场景下发挥作用。通过实现javax.servlet.Filter接口的doFilter方法来实现过滤功能。此外,文章提到了使用@WebFilter注解进行过滤器配置的现代方法,提供了相关示例,并强调了urlPatterns属性的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Filter通常在一个web应用上的主要功能之前或之后执行一小段功能,比如判断用户是否有访问的权限。

 

Filter实现javax.servlet.Filter接口,由方法doFilter实现过滤功能。

 

Filter指南:

http://www.avajava.com/tutorials/lessons/what-is-a-filter-and-how-do-i-use-it.html

 

指南中的例子:显示url请求参数

public class MyFilter implements Filter {

	FilterConfig filterConfig = null;

	public void init(FilterConfig filterConfig) throws ServletException {
		this.filterConfig = filterConfig;
	}

	…

	public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
			throws IOException, ServletException {
		servletResponse.setContentType("text/html");
		
		PrintWriter out = servletResponse.getWriter();
		out.println("my-param (InitParameter): " + filterConfig.getInitParameter("my-param"));
		out.println("<br/><br/>Parameters:<br/>");
		Enumeration<String> parameterNames = servletRequest.getParameterNames();
		if (parameterNames.hasMoreElements()) {
			while (parameterNames.hasMoreElements()) {
				String name = parameterNames.nextElement();
				String value = servletRequest.getParameter(name);
				out.println("name:" + name + ", value: " + value + "<br/>");
			}
		} else {
			out.println("---None---<br/>");
		}

		out.println("<br/>Start Regular Content:<br/><hr/>");
		filterChain.doFilter(servletRequest, servletResponse);
		out.println("<br/><hr/>End Regular Content:<br/>");

	}

}


@WebFilter注解

除了在web.xml中配置Filter外,也可以使用@WebFilter注解。

 

@WebFilter例子

http://www.codejava.net/java-ee/servlet/webfilter-annotation-examples


 @WebFilter的urlPatterns属性是必须的,被@WebFilter注解的类必须实现javax.servlet.Filter接口。

@WebFilter(
    attribute1=value1,
    attribute2=value2,
    ...
)
public class TheFilter implements javax.servlet.Filter {
    // implements Filter's methods
}

Argo中的过滤器


/**
* 利用Filter来实行调度
*/
@WebFilter(urlPatterns = {"/*"},
        dispatcherTypes = {DispatcherType.REQUEST},
        initParams = {@WebInitParam(name = "encoding", value = "UTF-8")}
)
public class ArgoFilter implements Filter {

    private ArgoDispatcher dispatcher;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {


        ServletContext servletContext = filterConfig.getServletContext();

        try {
            dispatcher = ArgoDispatcherFactory.create(servletContext);
            dispatcher.init();
        } catch (Exception e) {

            servletContext.log("failed to argo initialize, system exit!!!", e);
            System.exit(1);

        }

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpReq = (HttpServletRequest) request;
        HttpServletResponse httpResp = (HttpServletResponse) response;

        dispatcher.service(httpReq, httpResp);

    }

    @Override
    public void destroy() {
        dispatcher.destroy();
    }
}

@WebFilter(urlPatterns = {"/*"}表示ArgoFilter将过滤所有请求


在init中初始化了ArgoDispatcher实例,以后所有都将交给ArgoDispatcher处理。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值