/**
* 登陆的时候需要拦截器
* 框架的拦截器体现了一种设计模式(适配器模式)
* 1)实现接口 HandlerInterceptor
* 2)继承父类 HandlerInterceptorAdapter
*
* a)判断用户是否登陆
* b)如果登陆,继续访问
* c)如果没有登陆,跳转回到登陆页面。
* @author 18801
简单的权限控制就可以实现了
* 登陆的时候需要拦截器
* 框架的拦截器体现了一种设计模式(适配器模式)
* 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里的