• 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配置代码。

  • 相关阅读:
    时区 : America/Mexico_City 中文:美国中部时间(墨西哥城) 的夏令时
    Android中的常见时区
    嵌套滚动demo
    Android之获得内存剩余大小与总大小
    通过ip获取地理位置信息
    9.png(9位图)在android中作为background使用导致居中属性不起作用的解决方法
    Android ActivityManagerService 基本构架详解
    Eclipse 常用快捷键 (动画讲解)(转载)
    eclipse安装svn插件,在输入url后,一直卡在in progress界面不懂。
    android——背景颜色渐变(梯度变化)
  • 原文地址:https://www.cnblogs.com/HendSame-JMZ/p/6095026.html
Copyright © 2020-2023  润新知