Filter过滤器

来源:互联网 发布:关于乔任梁网络暴力 编辑:程序博客网 时间:2024/05/21 06:37

今天学习了一点java 的Filter过滤器,实现了非法用户访问问题。

写一点心得吧。

Filter是一个过滤器,所谓过滤器嘛,就是我们熟知的筛子,将我们要的东西留下来,然后对筛到的东西进行一下操作,然后在放走。filter就是类似一个功能。

Filter的作用是用于过滤、拦截请求或响应消息,可以在Servlet或JSP页面运行之前和之后被自动调用。

废话不多说,还是用代码说话:

package com.shopping.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;import javax.servlet.http.HttpSession;public class UserCheckFilter implements Filter {private FilterConfig filterConfig;//登录页面,当用户没有登录是,将会首先转到这个页面private String loginPage = "adminLogin.jsp";    public UserCheckFilter() {        // TODO Auto-generated constructor stub    }public void destroy() {// TODO Auto-generated method stubfilterConfig = null;}public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;//获得请求页面String uri = req.getRequestURI();//通过判断session中是否具有adminuser菜蔬来判断用户是否已经登录HttpSession session = req.getSession(true);//如果访问登录页面或已经登录if(uri.endsWith(loginPage) || uri.endsWith("adminLoginServlet") || session.getAttribute("adminuser") !=null){chain.doFilter(req, res);return;}//尚未登录,得发访问else{//跳转到登录页面res.sendRedirect(loginPage);}// pass the request along the filter chainchain.doFilter(request, response);}public void init(FilterConfig fConfig) throws ServletException {//通过FilterConfig获得web.xml中设置的舒适化参数filterConfig = fConfig;if(filterConfig.getInitParameter("loginPage") != null){loginPage = filterConfig.getInitParameter("loginPage");}}}


web.xml中是这样的:

<filter>    <display-name>UserCheckFilter</display-name>    <filter-name>UserCheckFilter</filter-name>    <filter-class>com.shopping.filter.UserCheckFilter</filter-class> <init-param>     <param-name>loginPage</param-name>     <param-value>adminLogin.jsp</param-value> </init-param>  </filter>  <filter-mapping>    <filter-name>UserCheckFilter</filter-name>    <url-pattern>/UserCheckFilter</url-pattern>  </filter-mapping>




web.xml文件是对Filter的注册;

来看一下源码:


destroy方法、doFilter方法、init方法三个必备的方法,方法不多说,见文知意。

来看init方法的参数FilterConfig fConfig,FilterConfig是可以从web.xml文件中读出Filter配置时定义的一些参数变量<init-param></init-param>中的

再看看HttpServletRequest和HttpServletResponse,其实HttpServletRequest和HttpServletResponse其实是实现了ServletRequest和ServletResponse接口的。只不过他其中多了一些关于http的定义。

然后在看看url和uri吧,这个东西挺让人纠结的,到底什么是uri啊,好像只听说过url。

其实url是uri的一种标识方法,uri(Uniform Resource Identifier通用资源标识符,url是uri的一种。


一般情况下,url使用的是绝对地址,uri就可以是相对的,也可以是绝对的。

     有一点大家一定有注意,当我们在项目中创建了过滤器或监听器,但是我们不想用了,就把它的.java文件删除掉了,如果是这样的话,那么当我们重新加载项目的时候就会报错,这是因为在我们加载项目的时候,服务器会自动的加载web.xml文件中配置,而且是顺序加载,所以当遇到我们配置了但是已经无源文件,那么当然会报错。

解决办法,当我们删除一个监听或者是一个过滤器时,一定要将web.xml文件的配置和.java文件一起删除掉。

个人心得,如有错误请留言,大家一起交流学习。