登录过滤器,css样式过滤问题解决方法

过滤器的详解以及实现(样式问题解决方法在代码注释中!)

过滤器

过滤器 (filter)是一个程序,它先于与它相关的servlet或jsp页面运行在服务器上,当服务器启动时,加载web.xml时过滤器就被加载了

  • 过滤器中三个方法:
    • 1.init():初始化调用,在tomcat启动时自动被调用。
    • destroy():销毁方法
    • doFilter():处理请求

过滤器就是个特殊的servlet

过滤器对客户的请求进行处理,处理完成后,它会交给下一个过滤器处理,这样客户的请求在过滤器链里逐个处理,直到请求发送到目标为止。

过滤器应用:

实际开发过程中,过滤器可以用来对用户进行统一的身份判断,ip访问限制、用户发送请求的字符编码转换、对请求和响应信息进行加密和解密、记录用户的登录日志等等。

过滤器调用顺序是web.xml中配置的顺序

过滤器的实现

接下来给大家上一段代码,是一个简单的登录,注册过滤,大家可以直接拷贝到项目中更改路径就可以使用

import java.io.IOException;
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 Filter implements javax.servlet.Filter {

	public Filter() {
		// TODO Auto-generated constructor stub
	}

	public void destroy() {
		// TODO Auto-generated method stub
	}
	public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain) throws IOException, ServletException {
		// 转化为我们习惯用的request和response对象(个人习惯)
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		// 设置编码格式
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		//获取传来的请求
		String uri = request.getRequestURI();
		// 对请求的字符串进行截取 例如http://localhost:8080/aaa/bbb.jsp中我们想要的请求字符串为bbb.jsp
		uri = uri.substring(uri.lastIndexOf("/")+1);
		// 放行登录注册界面和请求以及相对应的效验请求还有css样式!!!很多人加了过滤器没有放行样式所以导致样式都没了
		// 解决方法放行样式:如下
		if (uri.equals("login.jsp") || uri.equals("checkUserTele.do") || uri.equals("reguser.do")
				 || uri.equals("checkUserCardId.do") || uri.equals("userLogin.do") || uri.equals("insertUser.do")
				 || uri.indexOf(".jpg") > 0 || uri.indexOf(".jpeg") > 0 || uri.indexOf(".png") > 0 
				|| uri.indexOf(".gif") > 0 || uri.indexOf(".css") > 0
				|| uri.indexOf("js") > 0) {
			// 放行到下一个过滤器,如果是最后一个,跳转到对应请求处理方法
			chain.doFilter(request, response);
			return;
		}
		//session检查,看session中是否有登录过的用户
		HttpSession session = request.getSession();
		// 我的登录方法中,登录成功就往session中存一个用户信息,key为login
		Object object = session.getAttribute("login");
		if (object == null) {
			// 没有就跳转到登录
			response.sendRedirect("login.jsp");
		}else{
			// 有就向下执行
			chain.doFilter(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

现在虽然我们写好了过滤器,但是并没有起作用,我们还需要让工程指导过滤器的存在,所以我们要在web.xml中配置,上文提到过了 过滤器的执行顺序就是web.xml中配置的顺序,所以放在第一个过滤器,也就是web-app标签下的第一个

<!-- 登录过滤器 -->
   <filter>
    <display-name>Filter</display-name>
    <filter-name>Filter</filter-name>
    <!-- 下面就是你过滤器的路径,双击你的过滤器类名拷贝一下路径 -->
    <filter-class>com.cyz.filter.Filter</filter-class>
  </filter> 
  <filter-mapping>
    <filter-name>Filter</filter-name>
    <!-- 下面是想拦截的请求 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>

以上整个过滤器就已经成功在你项目中成功引用了
也可以通过使用*.do来过滤请求,
这样如果我们在页面中的请求中添加后缀名.do就可以避免对静态资源的过滤了,也就不需要对静态资源做特殊处理了.
感谢大家的支持!

你可能感兴趣的:(登录过滤器,css样式过滤问题解决方法)