JavaWeb过滤器(Filter)
参考:https://blog.csdn.net/yuzhiqiang_1993/article/details/81288912
原理:
一般实现流程:
1、新建一个类,实现Filter接口
2、实现doFilter()方法,打印一句话,来证明能够进行拦截
3、在web.xml中进行配置(参照Servlet配置)
4、访问一个页面,看看能不能拦截
1、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 UserFilter implements Filter { @Override public void destroy() { // TODO Auto-generated method stub } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 获取session对象,判断是否登录 HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; HttpSession session = req.getSession(); if(session.getAttribute("user")==null){ // 非法访问,没有登录,跳转到登录页面 session.setAttribute("error","非法访问"); // 保存客户想要去的地址, 登录成功后则直接跳转,而不是到首页 // 获取请求的地址, 包括工程名,但是不包括参数 System.out.println(req.getRequestURI()); // 获取请求的参数 System.out.println("参数:" + req.getQueryString()); // 获取当前项目的绝对路径,方法已过时,不推荐使用 推荐使用 request.getServletContext().getRealPath("") System.out.println(req.getRealPath("")); // 获取请求的地址, 但是不包括工程名和参数 System.out.println(req.getServletPath()); // 此方法需要在servlet 3.0的版本上使用, 开发的环境需要J2EE6 运行需要Tomcate7.0 //System.out.println("request.getServletContext().getRealPath:" +request.getServletContext().getRealPath("")); String goURL=req.getServletPath(); if(req.getQueryString()!=null){ goURL += "?" + req.getQueryString(); } System.out.println(goURL); session.setAttribute("goURL", goURL); res.sendRedirect(req.getContextPath() + "/login.jsp"); System.out.println(req.getContextPath()); }else{ // 如果有下一个过滤器则跳转到下一个过滤器否则目标页面 chain.doFilter(request, response); } } }
session.setAttribute("error","非法访问")可以用对象取代,如:
request.getSession().setAttribute("humanSession", human对象);
2、web.xml配置
<filter> <filter-name>userFilter</filter-name> <filter-class> cn.***.UserFilter </filter-class> </filter> <filter-mapping> <filter-name>userFilter</filter-name> <url-pattern>/user/*</url-pattern><br> <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>