spring+spring-mvc+mybatis框架权限的实现

/**
 * 登陆的时候需要拦截器
 * 框架的拦截器体现了一种设计模式(适配器模式)
 * 1)实现接口 HandlerInterceptor
 * 2)继承父类 HandlerInterceptorAdapter
 * 
 * a)判断用户是否登陆
 * b)如果登陆,继续访问
 * c)如果没有登陆,跳转回到登陆页面。
 * @author 18801

 * */

package com.atguigu.atcrowdfunding.interceptors;

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

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

import com.atguigu.atcrowdfunding.bean.User;

public class LoginInterceptor extends HandlerInterceptorAdapter {

	/**
	 * 在控制器执行之前进行拦截和处理
	 * 请求可以根据方法的返回结果来确定是否需要继续执行,true,继续执行,false,请求结束
	 */
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
				
		HttpSession session = request.getSession();


			//判断用户是否登陆
			
			User loginUser = (User)session.getAttribute("loginUser");
			
			if ( loginUser == null ) {
				//如果没有登陆,跳转回到登陆页面。 
				response.sendRedirect(session.getServletContext().getContextPath() + "/login.htm");
				return false;
			} else {
				//如果登陆,继续访问	
				return true;
			}
//		}
	}

	/**
	 * 此方法在处理器完成之后执行
	 */
	public void postHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		super.postHandle(request, response, handler, modelAndView);
	}

	/**
	 * 此方法在请求结束时(视图渲染完毕)执行
	 */
	public void afterCompletion(HttpServletRequest request,
			HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		super.afterCompletion(request, response, handler, ex);
	}


}
在Spring_-mvc。xml的配置文件加入配置 

 
 
   <mvc:interceptors>
           <mvc:interceptor>
              <mvc:mapping path="/**"/>
              <mvc:exclude-mapping path="/login/index.do"/>
              <bean class="com.lanke.app.interceptor.LoginInterceptor"></bean>
          </mvc:interceptor>

      </mvc:interceptors> 


<mvc:exclude-mapping path="/login/index.do"/>的意思是 对这个链接不进行拦截(可以设置多个)
 
 
 
 
做到这里我们只是让拦截器起拦截作用,接下来是登陆授权(用户的权限是放在session里的)

 
 
 
 
package com.atguigu.atcrowdfunding.interceptors;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import com.atguigu.atcrowdfunding.bean.Permission;
import com.atguigu.atcrowdfunding.manager.service.PermissionService;
import com.atguigu.atcrowdfunding.util.StringUtil;

/**
 * 授权拦截器
 * 只有用户拥有相应的权限,才能发送相应的请求。
 * 1)获取请求路径
 * 2)判断当前路径需要不需要授权
 * 3)如果不需要授权,那么直接访问
 * 4)如果需要授权,那么判断当前的用户是否具有相应的权限
 * 5)如果有相应的权限,那么继续访问
 * 6)如果没有相应的权限,跳转到错误页面
 * @author 18801
 *
 */
public class AuthInterceptor extends HandlerInterceptorAdapter {

	@Autowired
	private PermissionService permissionService;
	
	public boolean preHandle(HttpServletRequest request,
			HttpServletResponse response, Object handler) throws Exception {
		
		// 1)获取请求路径
		 String uri = request.getRequestURI();
		
		 // 2)判断当前路径需要不需要授权
		 // 2-1) 获取所有的授权访问路径

		 Set<String> authPathSet =
		     (Set<String>)request.getSession().getServletContext().getAttribute("authPathSet");
		 
		 if ( authPathSet.contains(uri) ) {
			 // 4)如果需要授权,那么判断当前的用户是否具有相应的权限
			 Set<String> userAuthPathSet = (Set<String>)request.getSession().getAttribute("userAuthPathSet");
			 if ( userAuthPathSet.contains(uri) ) {
				// 5)如果有相应的权限,那么继续访问
				 return true;
			 } else {
				// 6)如果没有相应的权限,跳转到错误页面
				 response.sendRedirect(request.getSession().getServletContext().getContextPath() + "/error.htm");
				 return false;
			 }
			 
		 } else {
			// 3)如果不需要授权,那么直接访问
			 return true;
		 }
	}

}

简单的权限控制就可以实现了
 
 
 
 

 
 
 
 
 
 
 <mvc:exclude-mapping path="/login/index.do"/>的意思是 对这个链接不进行拦截(可以设置多个)
用户的权限是放在session里的
 
 

猜你喜欢

转载自blog.csdn.net/weixin_40813139/article/details/78862971