刚刚有个朋友问我,Servlet的过滤器有什么作用?
现在发个帖子说明一下,
过滤器是一个对象,可以传输请求或修改响应。它可以在请求到达Servlet/JSP之前对其进行预处理,而且能够在响应离开Servlet
/JSP之后对其进行后处理。所以如果你有几个Servlet/JSP需要执行同样的数据转换或页面处理的话,你就可以写一个过滤器类,然后在部署描述文
件(web.xml)中把该过滤器与对应的Servlet/JSP联系起来。你可以一个过滤器以作用于一个或一组servlet,零个或多个过滤器能过滤
一个或多个servlet。
一个过滤器实现java.servlet.Filter接口并定义它的三个方法:
1. void init(FilterConfig config) throws ServletException:在过滤器执行service前被调用,以设置过滤器的配置对象。
2. void destroy();在过滤器执行service后被调用。
3. Void doFilter(ServletRequest req,ServletResponse res,FilterChain chain) throws IOException,ServletException;
可能这么说,大家还是不太理解。举个例子来说,面向对象语言的特征里有个接口的概念,一个类实现该接口,就必须要实现接口的所有方法。那么如果我写了一个类,实现这个接口又不想实现所有方法,怎么办呢?
写个抽象类,实现这个接口的所有方法,然后我写的类继承这个抽象类。就可以不用实现所有方法了。看到这里大家都懂了过滤器是干什么的吧
既然懂了,那就直接上代码说明一下怎么配置的。
开发EncodingFilter.java文件,继承自javax.servlet.Filter: package bluemoon.crm.systemmanage.struts.Filter; import java.io.*; import javax.servlet.*; public class EncodingFilter implements Filter { protected String encoding = null; protected FilterConfig config; public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; //从web.xml配置文件中获取编码配置 this.encoding = filterConfig.getInitParameter("Encoding"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(request.getCharacterEncoding() == null) { String encode = getEncoding(); if(encode != null) { //设置request的编码方式 request.setCharacterEncoding(encode); } } chain.doFilter(request,response); } public String getEncoding() { return encoding; } public void destroy() { } }
在web.xml文件中加入如下配置信息: <!-- 页面请求编码过滤器 注意每个页面的pageEncoding="GB2312" --> <filter> <filter-name>encodingFilter</filter-name> <filter-class>bluemoon.crm.systemmanage.struts.Filter.EncodingFilter</filter-class> <init-param> <param-name>Encoding</param-name> <param-value>GB2312</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <!-- 对全部的jsp页面有效,比较郁闷的是没有太多的配置方式 --> <url-pattern>/*</url-pattern> </filter-mapping>
用户是否登陆过滤器:
1.首先增加一个Action、ActionForm & JSP: login.jsp中为一个登陆表单:
UserActionForm.java为一个Struts的ActionForm。
UserAction.java将用户登陆信息添加到session中。
开发UserLoginedFilter.java: package bluemoon.crm.systemmanage.struts.Filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.*; import bluemoon.crm.systemmanage.struts.forms.UserActionForm; public class UserLoginedFilter extends HttpServlet implements Filter { protected FilterConfig config; public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { RequestDispatcher dispatcher = request.getRequestDispatcher("userLogin.jsp"); HttpServletRequest userRequest = (HttpServletRequest)request; UserActionForm userActionForm = (UserActionForm)userRequest.getSession().getAttribute("userActionForm"); if(userActionForm == null || userActionForm.getUser_name() == null || userActionForm.getUser_name().trim().length()<1) { System.out.println("用户未登录!"); dispatcher.forward(request,response); return; } System.out.println("用户已登录!"); chain.doFilter(request,response); } public void destroy() { } }
在web.xml文件中添加如下配置信息: <!—用户是否登陆过滤器配置 注意只过虑jsp页面,不过虑.do --> <filter> <filter-name>userLoginedFilter</filter-name> <filter-class>bluemoon.crm.systemmanage.struts.Filter.UserLoginedFilter</filter-class> </filter> <filter-mapping> <filter-name>userLoginedFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <!—用户是否登陆过滤器配置结束 -->
用户是否登陆过滤器在多模块中的应用: 1.修改上面的过滤器代码: package bluemoon.crm.systemmanage.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.*; import bluemoon.crm.systemmanage.struts.forms.UserForm; //用户未登陆过滤器 public class UserNoLoginedFilter extends HttpServlet implements Filter { protected FilterConfig config; public void init(FilterConfig filterConfig) throws ServletException { this.config = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //首先预定义到要转向的页面,由此带来的问题就是userLogin.jsp页面的图片必须要使用绝对路径,方法见userLogin.jsp页面 RequestDispatcher dispatcher = request.getRequestDispatcher("/toLogin.do?prefix=&page=/userLogin.jsp"); //注意在struts-config.xml中增加一个Action,如下: /* *<action * attribute="userForm" * name="userForm" * path="/toLogin" * scope="request" * type="org.apache.struts.actions.SwitchAction" /> */ // 从session中获取用户form HttpServletRequest userRequest = (HttpServletRequest)request; UserForm userForm = (UserForm)userRequest.getSession().getAttribute("userForm"); //如果未登陆则没有userFrom信息 if(userForm == null || userForm.getUser_name() == null || userForm.getUser_name().trim().length()<1) { System.out.println("用户未登录!"); //分发到登陆页面 dispatcher.forward(request,response); //((HttpServletResponse)response).sendRedirect("toModule.do?prefix=&page=/userLogin.jsp"); return; } System.out.println("用户"+userForm.getUser_name()+"已登录!"); chain.doFilter(request,response); } public void destroy() { } }
注:版权所有,未经本人同意不得转载