web开发之登录拦截器

作者: 根艮哏艮根 | 来源:发表于2018-07-16 15:39 被阅读1次

    我们在进行web开发的时候,通常会限制用户的合法性,即登陆拦截和验证,只是为了保障系统的安全,只将我们规定的个别请求可直接访问,其余的必须经过拦截器来进行验证,那么拦截器到底该怎么写呢?下面就将Spring MVC和JFinal中的登录拦截器的写法记录一下,我们一起进步

    Spring MVC中的登录拦截

    1.编写登录拦截类

    /**
     * @ClassName: LoginFilter
     * @author Liu_xg
     * @date 2018年5月3日
     * @Description: TODO 登陆拦截及验证
     */
    public class LoginFilter implements Filter {
        private String[] paths;
    
        @Override
        public void destroy() {
    
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
                throws IOException, ServletException {
            
            HttpServletRequest request = (HttpServletRequest) req;
            HttpServletResponse response = (HttpServletResponse) resp;
            //设置字符集为utf-8
            request.setCharacterEncoding("UTF-8");
            String path=request.getServletPath();
            for (String p : paths) {
                if (path.equals(p)) {
                    chain.doFilter(request, response);
                    return;
                }
            }
            HttpSession session=request.getSession();
            try {
                String username=(String) session.getAttribute("username");
                if(username==null){
                    //判断session是否为空,为空的话就页面重定向到登陆界面
                    response.sendRedirect(request.getContextPath()+"/text/index");
                    return;
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                //判断session是否为空,为空的话就页面重定向到登陆界面
                response.sendRedirect(request.getContextPath()+"/text/index");
                e.printStackTrace();
                return;
            }
            chain.doFilter(request, response);
            
    
        }
    
        @Override
        public void init(FilterConfig config) throws ServletException {
            // 将配置的放行url取出来
            paths = config.getInitParameter("excPath").split(",");
        }
    
    }
    

    2.在web.xml中配置不需要拦截的请求

    <filter>
        <filter-name>filter</filter-name>
        <filter-class>com.ftwj.interceptor.LoginFilter</filter-class>
        <init-param>
            <param-name>excPath</param-name>
            <param-value>/text/index,/text/login,/text/register,/check/loginname,
            /check/password,/check/pswContain,/user/register</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>filter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    

    其中<param-value>标签中就是不需要拦截的请求

    JFinal中的登录拦截

    1.编写登录拦截类

    /**  
    * @ClassName: LoginInterceptor  
    * @author Liu_xg  
    * @date 2018年5月10日  
    * @Description: TODO  登陆拦截器
    */
    public class LoginInterceptor implements Interceptor {
    
        @Override
        public void intercept(Invocation inv) {
            try {
                //取到session
                HttpSession session=inv.getController().getSession();
                if(session==null){
                    inv.getController().redirect("/toLogin");
                }else{
                    if(session.getAttribute("user")!=null){
                        User user=(User) session.getAttribute("user");
                        if(user!=null){
                            inv.invoke(); 
                        }else{
                            inv.getController().redirect("/toLogin");
                        }
                    }else{
                        inv.getController().redirect("/toLogin");
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                inv.getController().redirect("/toLogin");
            }
        }
    }
    

    2.将拦截器注册到框架中

       /**
         * 配置路由
         * 
         * @param me
         */
        @Override
        public void configRoute(Routes me) {
    
            // 配置拦截器
            me.addInterceptor(new LoginInterceptor());
    
            me.add("/", LoginController.class, "/WEB-INF/views/login");
            me.add("/main", MainController.class, "/WEB-INF/views/main");
            me.add("/menu", MenuController.class, "/WEB-INF/views/menu");
            me.add("/user", UserController.class, "/WEB-INF/views/user");
            me.add("/role", RoleController.class, "/WEB-INF/views/role");
    
        }
    

    3.设置不需要拦截的请求

    1).这种方式是将整个controller都不拦截

    /**
     * @ClassName: LoginController
     * @author Liu_xg
     * @date 2018年5月4日
     * @Description: TODO 登陆控制器
     */
    
    @Clear(LoginInterceptor.class)
    public class LoginController extends Controller {
          ******
    }
    

    2).这种方式是不拦截此方法

       /**
         * 登陆,判断账号和密码是否正确
         */
        @Clear(LoginInterceptor.class)
        public void login() {
          *********
        }
    

    相关文章

      网友评论

        本文标题:web开发之登录拦截器

        本文链接:https://www.haomeiwen.com/subject/vadbpftx.html