实现后具体效果:如果用户没有登录,跳转到登录页面
在web.xml中定义SpringMVC前端控制器配置拦截所有请求
<!-- 定义Spring MVC的前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
</servlet>
<!-- 让Spring MVC的前端控制器拦截所有请求 -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
在Springmvc-config配置拦截器
<!-- 定义Spring MVC的拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/*"/>
<!-- 自定义判断用户权限的拦截类 -->
<bean class="csh.hrm.interceptor.AuthorizedInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
拦截请求后到csh.hrm.interceptor.AuthorizedInterceptor类下去做相应的判断
AuthorizedInterceptor类:
/**
* 判断用户权限的Spring MVC的拦截器
*/
public class AuthorizedInterceptor implements HandlerInterceptor {
/** 定义不需要拦截的请求 */
private static final String[] IGNORE_URI = {"/loginForm", "/login","/404.html"};
/**
* 该方法需要preHandle方法的返回值为true时才会执行。
* 该方法将在整个请求完成之后执行,主要作用是用于清理资源。
*/
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception exception)
throws Exception {
}
/**
* 这个方法在preHandle方法返回值为true的时候才会执行。
* 执行时间是在处理器进行处理之 后,也就是在Controller的方法调用之后执行。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView mv) throws Exception {
}
/**
* preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
* 当preHandle的返回值为false的时候整个请求就结束了。
* 如果preHandle的返回值为true,则会继续执行postHandle和afterCompletion。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
/** 默认用户没有登录 */
boolean flag = false;
/** 获得请求的ServletPath */
String servletPath = request.getServletPath();
/** 判断请求是否需要拦截 */
for (String s : IGNORE_URI) {
if (servletPath.contains(s)) {
flag = true;
break;
}
}
/** 拦截请求 */
if (!flag){
/** 1.获取session中的用户 */
User user = (User) request.getSession().getAttribute(HrmConstants.USER_SESSION);
/** 2.判断用户是否已经登录 */
if(user == null){
/** 如果用户没有登录,跳转到登录页面 */
request.setAttribute("message", "请先登录再访问网站!");
request.getRequestDispatcher(HrmConstants.LOGIN).forward(request, response);
return flag;
}else{
flag = true;
}
}
return flag;
}
}
userController:
@RequestMapping(value="/login")
public ModelAndView login(String loginname,String password,HttpSession session,ModelAndView mv){
User user=userService.login(loginname, password);
if(user!=null){
// 将用户保存到HttpSession当中
session.setAttribute(HrmConstants.USER_SESSION, user);
// 客户端跳转到main页面
mv.setViewName("redirect:/main");
}else {
mv.addObject("message", "登录名或密码错误!请重新输入");
mv.setViewName("forward:/loginForm");
}
return mv;
}
如果用户登录就将信息存入Session中,这样在拦截判断的时候如果能取到对应的session值,就是有登录,返回true,否则跳转到登录页面