URL权限过滤

import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.FilterChain;
import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletResponse;

public class PermissiondoFilter implements Filter {

    private FilterConfig filterConfig;
    private FilterChain chain;
    private HttpServletRequest request;
    private HttpServletResponse response;

    public void destroy() {
        this.filterConfig = null;
    }

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }

    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse, FilterChain chain) {
        this.chain = chain;
        this.request = (HttpServletRequest) servletRequest;
        this.response = ((HttpServletResponse) servletResponse);
        String url = request.getRequestURI();
        System.out.println("访问的完整路径-->" + url);

        try {
            HttpSession session = request.getSession();
            // 获取网站访问根目录
            String accessPath = request.getContextPath();
            System.out.println("-访问的网站根目录-" + accessPath);

            // 截获根目录以后的路径即'/项目名'以后的路径;
            url = url.substring(accessPath.length() + 1, url.length());
            System.out.println("-访问-" + url);
            LoginUser loginUser = (LoginUser) session.getAttribute("loginUser");
            System.out.println("url-->" + url);
            if (noVerifyUrl(url, request)) {
                chain.doFilter(request, response);
            } else if (loginUser == null) {
                response.sendRedirect(accessPath + "/login.jsp");
            } else {
                System.out.println(loginUser.getUserName() + "-访问-" + url);

                verifyUrl(url, loginUser);
            }
        } catch (Exception sx) {
            sx.printStackTrace();
        }
    }

    /**
     * @param url
     *            当前请求的url
     * @param loginUser
     *            当前登录用户
     * @throws IOException
     * @throws ServletException
     */
    private void verifyUrl(String url, LoginUser loginUser) throws IOException,
            ServletException {

        // 获取user拥有的所有资源串
        String sturl = loginUser.getUrl();
        System.out.println("可以访问的地址--->" + sturl);

        String url1 = null;
        String url2 = null;
        String url3 = null;
        url1 = url.substring(0, url.indexOf("/"));

        if (sturl.indexOf(url) >= 0) {
            System.out.println("有权访问!");
            chain.doFilter(request, response);
            return;
        }

        url1 = url.substring(0, url.indexOf("/") + 1);
        if (sturl.indexOf(url1 + "*") >= 0) {
            System.out.println("有权访问!");
            chain.doFilter(request, response);
            return;
        }

        url2 = url.substring(url1.length(), url.length());
        if (null != url2) {
            while (url2.contains("/")) {
                url2 = url.substring(url1.length(), url.length());
                url1 = url1 + url2.substring(0, url2.indexOf("/") + 1);
                url3 = url1 + "*";
                System.out.println("可以访问的地址url3--->" + url3);
                if (sturl.indexOf(url3) >= 0) {
                    System.out.println("有权访问!");
                    chain.doFilter(request, response);
                    return;
                }
            }
        }
        System.out.println("无权限!");
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().println("<div>Sorry,您没有权限访问该资源!</div>");
    }

    /**
     * 是否需要判断权限,如客户端浏览、登录页面则不需要判断权限
     */
    protected boolean noVerifyUrl(String url, HttpServletRequest request) {
        // login.action
        String exclude = "login.jsp,loginAction.action";
        if (exclude.indexOf(url) >= 0) {
            return true;
        }
        return false;
    }
    
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值