Servlet3.0下@WebFilter注解配置Filter
Filter(过滤器)主要对请求到达前进行处理,也可以在请求结束后进行处理,类似于链式。一个请求可以被多个过滤器拦截到,会依次进入各个Filter中,放行后直至进入Servlet,Servlet处理请求结束后,回到各个Filter继续执行后面的代码,先执行的Filter后执行完。
常用到的地方:
配置Filter:
@WebFilter常用属性
属性 | 类型 | 是否必需 | 说明 |
---|
asyncSupported | boolean | 否 | 指定Filter是否支持异步模式 |
dispatcherTypes | DispatcherType[] | 否 | 指定Filter对哪种方式的请求进行过滤。 支持的属性:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST; 默认过滤所有方式的请求 |
filterName | String | 否 | Filter名称 |
initParams | WebInitParam[] | 否 | 配置参数 |
displayName | String | 否 | Filter显示名 |
servletNames | String[] | 否 | 指定对哪些Servlet进行过滤 |
urlPatterns/value | String[] | 否 | 两个属性作用相同,指定拦截的路径 |
用户权限过滤示例:
1.方式一,@WebFilter注解方式
自定义过滤器,实现javax.servlet.Filter接口,通过注解方式配置。拦截所有的请求,放行登录页面、登录操作请求,其余请求需要在登录后才可访问。同时配置参数,指定要放行的路径和请求的字符集。
- @WebFilter(filterName = "loginFilter",
- urlPatterns = "/*",
- initParams = {
- @WebInitParam(name = "loginUI", value = "/home/loginUI"),
- @WebInitParam(name = "loginProcess", value = "home/login"),
- @WebInitParam(name = "encoding", value = "utf-8")
- })
- public class LoginFilter implements Filter {
- private FilterConfig config;
-
- @Override
- public void init(FilterConfig config) throws ServletException {
- this.config = config;
- }
-
-
- @Override
- public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
- throws IOException, ServletException {
-
- String loginUI = config.getInitParameter("loginUI");
- String loginProcess = config.getInitParameter("loginProcess");
- String encoding = config.getInitParameter("encoding");
-
-
- HttpServletRequest request = (HttpServletRequest) req;
- HttpServletResponse response = (HttpServletResponse) res;
-
-
- request.setCharacterEncoding(encoding);
-
-
- String uri = request.getRequestURI();
- if (uri.contains(loginUI) || uri.contains(loginProcess)) {
-
- chain.doFilter(request, response);
- } else {
- if (request.getSession().getAttribute("user") == null) {
-
- response.sendRedirect(request.getContextPath() + loginUI);
- } else {
-
- chain.doFilter(request, response);
- }
- }
- }
-
- @Override
- public void destroy() {
- this.config = null;
- }
- }
2.方式二,web.xml方式配置
通过在web.xml文件中配置,去掉方式一中的@WebFilter注解,其余代码相同
- <filter>
- <filter-name>loginFilter</filter-name>
- <filter-class>cn.edu.njit.filter.LoginFilter</filter-class>
- <init-param>
- <param-name>loginUI</param-name>
- <param-value>/home/loginUI</param-value>
- </init-param>
- <init-param>
- <param-name>loginProcess</param-name>
- <param-value>home/login</param-value>
- </init-param>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>loginFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
3.注
(1).Filter和Servlet比较相似,从属性以及配置方式上可以看出,可以理解为Servlet的加强版;
(2).Filter中对权限的过滤、字符编码的处理、日志的记录可以看成是各个Servlet中重复代码的抽取;
(3).对于字符编码的处理,request.setCharacterEncoding()对post方式的请求有效;若是get方式,可以使用new String(xxx.getBytes("iso-8859-1"), "utf-8")进行处理,否则表单的中文会乱码;也可以使用代理方式,每当通过request.getParameter()时自动进行编码处理;