使用SpringMVC拦截器做一个简单的权限控制

编写一个继承HandlerInterceptorAdapter的拦截器:

package com.tzj.web.interceptor;

import java.io.PrintWriter;
import java.util.Map;
import java.util.Map.Entry;

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

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.tzj.Constants;

public class SecurityInterceptor extends HandlerInterceptorAdapter {

    @Override
    
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession(true);
        // 从session 里面获取用户名的ID和所属权限组ID
        String userId = (String) session.getAttribute(Constants.USER_ID);
        Integer userGrouping = (Integer) request.getSession().getAttribute(Constants.USER_GROUPING);
        // 系统全部权限
        Map<Integer, String> allFunction = (Map<Integer, String>) request .getSession().getAttribute(Constants.ALL_FUNCTION);
        // 用户所拥有权限
        Map<Integer, String> userFunction = (Map<Integer, String>) request .getSession().getAttribute(Constants.USER_FUNCTION);

        // 设置编码
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("UTF-8");
        PrintWriter out = response.getWriter();
        StringBuilder builder = new StringBuilder();
        String requestUri = request.getRequestURI(); 
        
        // 判断如果没有取到用户信息,提示用户进行登陆,并跳转到登陆页面
        if (null == userId || "".equals(userId)) { // 用户未登录
            if("/".equals(requestUri) || "".equals(requestUri)){
                response.sendRedirect(request.getContextPath() + Constants.LOGIN_URL_MESSAGE);
            }else{
                response.sendRedirect(request.getContextPath() + Constants.LOGIN_URL_NOT_MESSSAGE);
            }
            return false;
        }

        // 用户已经登录 但是不属于任何权限组
        if (null == userGrouping || "".equals(userGrouping)) {

            builder.append("<script type=\"text/javascript\" charset=\"UTF-8\">");
            builder.append("alert(\"你没有权限,请联系管理员,获取相应权限!\");");
            builder.append("location.href=\"javascript:history.go(-1)\";</script>");
            out.print(builder.toString());
            out.close();
            return false;
        }

        
        if (isIntercept(allFunction, requestUri)) { // 需要拦截URl
            if (isHavePermission(userFunction, requestUri)) {// 用户有该访问权限
                return true;
            } else {// 用户登录,但是没有访问权限
                builder.append("<script type=\"text/javascript\" charset=\"UTF-8\">");
                builder.append("alert(\"你没有权限,请联系管理员,获取相应权限!\");");
                builder.append("location.href=\"javascript:history.go(-1)\";</script>");
                out.print(builder.toString());
                out.close();
                return false;
            }
        } else {// 需要拦截URl
            return true;
        }
    }

    // 是否需要拦截
    public boolean isIntercept(Map<Integer, String> allFunction,
            String requestUri) {
        // 对需要拦截的权限进行权限验证
        for (Entry<Integer, String> entry : allFunction.entrySet()) {
            // 有权限则不进行拦截 放行
            if (null != entry.getValue() && !"".equals(entry.getValue()) && -1 != requestUri.indexOf(entry.getValue())) {
                return true;
            }
        }
        return false;
    }

    // 是否有权权限
    public boolean isHavePermission(Map<Integer, String> userFunction, String requestUri) {
        // 对需要拦截的权限进行权限验证
        for (Entry<Integer, String> entry : userFunction.entrySet()) {
            // 有权限则不进行拦截 放行
            if (null != entry.getValue() && !"".equals(entry.getValue()) && -1 != requestUri.indexOf(entry.getValue())) {
                return true;
            }
        }
        return false;
    }
}

在配置文件中添加配置:

    <!-- Url拦截 -->
    <mvc:interceptors>  
        <mvc:interceptor>
            <!-- 只拦截带有"/tzj/app/"请求 -->
            <mvc:mapping path="/**/tzj/app/**"/>
             <!-- 带有"/tzj/app/errorInfo"请求不进行拦截 -->
            <mvc:exclude-mapping path="/**/tzj/app/errorInfo"/>
            <bean class="com.tzj.web.interceptor.ServiceInterceptor"/>
        </mvc:interceptor> 
    </mvc:interceptors>


转载于:https://my.oschina.net/sodeve/blog/389457

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值