java filter 实现权限控制
import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; /** * Created by Administrator on 2016/11/23. */ public class PermissionFilter implements Filter { private HttpServletRequest request; private HttpServletResponse response; @Override public void init(FilterConfig filterConfig) throws ServletException { } /*** * 请求服务时 * @param request * @param response * @param chain * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { /** * httpRequest.getRequestDispatcher("/helloWorld").forward(httpRequest, response); 服务器端转发,不改变浏览器端URL地址,常用 httpResponse.sendRedirect(uri); 浏览器端重定向,改变URL在浏览器地址栏 */ /** * 1,doFilter的第一个参数为ServletRequest对象。此对象给过滤器提供了对进入的信息(包括 * 表单数据、cookie和HTTP请求头)的完全访问。第二个参数为ServletResponse,通常在简单的过 * 滤器中忽略此参数。最后一个参数为FilterChain,此参数用来调用servlet或JSP页。 */ this.request =(HttpServletRequest)request; /** * 如果处理HTTP请求,并且需要访问诸如getHeader或getCookies等在ServletRequest中 * 无法得到的方法,就要把此request对象构造成HttpServletRequest */ this.response = (HttpServletResponse) response; // 取得根目录所对应的绝对路径: String currentURL = this.request.getRequestURI(); // 截取到当前文件名用于比较 String targetURL = currentURL.substring(currentURL.indexOf("/", 1), currentURL.length()); HttpSession session = this.request.getSession(false); //拦截其他请求: // 用户权限不够是,重定向到提示权限不够接口 //不过滤登入的action 用户登录请求和提示用户登录请求直接过 if (!"/login".equals(targetURL)&&!"/nopermission".equals(targetURL)&&!"/nologin".equals(targetURL)) { // 用户未登录,跳转到提示接口 if (session == null || session.getAttribute(Constants.UserLogin.LOGINUSERMSG) == null) { this.request.getRequestDispatcher("/user/nologin").forward(request, response); return; } // 用户已登录,判断权限 else{ if("/permission".equals(targetURL)) { UserVO userVO = new UserVO(); userVO = (UserVO) session.getAttribute(Constants.UserLogin.LOGINUSERMSG); //权限不够,跳转到提示接口 if (userVO.getLevel()!=1){ this.request.getRequestDispatcher("/user/nopermission").forward(request, response); return; } } } } // 加入filter链继续向下执行 chain.doFilter(request, response); /** * 调用FilterChain对象的doFilter方法。Filter接口的doFilter方法取一个FilterChain对象作 为它 * 的一个参数。在调用此对象的doFilter方法时,激活下一个相关的过滤器。如果没有另 * 一个过滤器与servlet或JSP页面关联,则servlet或JSP页面被激活。 */ } /*** * 服务重启之后 */ @Override public void destroy() { this.request.getSession(false).setAttribute(Constants.UserLogin.LOGINUSERMSG,null); } }
<filter> <filter-name>permissionFilter</filter-name> <filter-class>com.common.PermissionFilter</filter-class> </filter> <filter-mapping> <filter-name>permissionFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <!-- 没有配置dispatcher就是默认request方式的 --> <dispatcher>FORWARD</dispatcher> <dispatcher>ERROR</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter-mapping>
上面两个是过滤器和web.xml配置代码。
https://github.com/Enast/hummer