Java拦截器使用

关于java拦截器的说明,我就不多解释了,直接看代码
首先要在spring-mvc.xml中定义一个拦截器,
在这里插入图片描述

其中不需要拦截的路径都可以先定义好。
在建立一个拦截器的类,实现HandlerInterceptor,定义一个list,接收不需要拦截的路径,写上get;set;方法。
在preHandle这个方法里面里面进行拦截,
package com.lj.interceptor;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.lj.po.User;
import com.lj.service.IPowerService;
import com.lj.vo.PowerVo;
public class Authority implements HandlerInterceptor {
@Autowired
IPowerService iPowerService;
private List excludeUrls;// 不需要拦截的资源

/**
 * @return the excludeUrls
 */
public List<String> getExcludeUrls() {
	return excludeUrls;
}

/**
 * @param excludeUrls
 *            the excludeUrls to set
 */
public void setExcludeUrls(List<String> excludeUrls) {
	this.excludeUrls = excludeUrls;
}

/**
 * 完成页面的render后调用
 */
@Override
public void afterCompletion(HttpServletRequest request,
		HttpServletResponse response, Object object, Exception e)
		throws Exception {

}

/**
 * 在调用controller具体方法后拦截
 */
@Override
public void postHandle(HttpServletRequest request,
		HttpServletResponse response, Object object,
		ModelAndView modelAndView) throws Exception {

}

/**
 * 在调用controller具体方法前拦截
 */
@Override
public boolean preHandle(HttpServletRequest request,
		HttpServletResponse response, Object object) throws Exception {
	Map<String, Integer> map = new HashMap<String, Integer>();
	String requestUri = request.getRequestURI();
	String contextPath = request.getContextPath();
	String url = requestUri.substring(contextPath.length());
	if (url.indexOf("Content") > -1) {//图片以及一些js、css的引用放行
		return true;
	}

	if (excludeUrls.size() > 0) {
     //循坏判断当前请求的路径是否在放行的list里,在则放行,不在则拦截
		for (int i = 0; i < excludeUrls.size(); i++) {

			if (url.indexOf(excludeUrls.get(i)) > -1) {
				return true;
			}
		}

	}
    //获取登录人的session
	User user = (User) request.getSession().getAttribute("USERINFO");
	if (user == null) {
		//session为空,则拦截并跳转界面到登录界面
		request.getRequestDispatcher("/Jsp/Login.jsp").forward(request,
				response);
		return false;
	}
	//session不为空,查询用户权限
	map.put("userid", user.getUserid());
	List<PowerVo> list = iPowerService.findPower(map);
     
	if ((list == null)) {// 如果没有登录或登录超时
		request.setAttribute("msg", "您还没有登录或登录已超时,请重新登录,然后再刷新本功能!");
		request.getRequestDispatcher("/error/noSession.jsp").forward(
				request, response);
		return false;
	}

	if (list != null) {
        
		if (list.size() > 0) {
			//循坏判断请求的路径是否在权限的路径中,不在则显示没有权限的界面,在的继续放行
			int k = 0;
			for (int i = 0; i < list.size(); i++) {

				if (url.indexOf(list.get(i).getModuleurl()) > -1) {// 如果当前用户没有访问此资源的权限
					k++;
				}
				if (url.split("/")[1].equals(list.get(i).getModuleurl()
						.split("/")[1])) {
					k++;
				}
			}
			if (k == 0) {

				request.getRequestDispatcher("/error/noSecurity.jsp")
						.forward(request, response);
				return false;
			}

		} else {

			 request.getRequestDispatcher("/error/noSecurity.jsp").forward(
					request, response);
			return false;
		}
	}
	return true;
}

}

好了,权限拦截已完成,成果图如下:
在这里插入图片描述
将权限关闭,员工则没有进入模块的权限,被拦截,进入另外的界面,如下图:
在这里插入图片描述

好了,这就是使用拦截器做的权限拦截,还有就是控制没有登录,不能进入主界面,登录的session过期则会提示重新登录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值