您的位置:首页 > 编程语言 > Java开发

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

2015-03-20 00:00 369 查看
编写一个继承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/jav
7fe1
ascript\" 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: