需求介绍
1.在未登录情况下,访问网站其他界面时强制跳转至网站登录页
通过拦截器实现请求拦截
方式一:实现HandlerInterceptor接口
package com.yuebai.finance.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.yuebai.finance.bean.User;
import com.yuebai.finance.util.Const;
/**
*
* @ClassName: LoginInterceptors
* @Description: 通过实现HandlerInterceptor接口,实现拦截
* @author yanqinghai
* @date 2020年8月6日
*/
public class LoginInterceptors implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
HttpSession session = request.getSession(true);
User user = (User)session.getAttribute(Const.LOGIN_USER);
if (user == null) { //未登录
response.sendRedirect(request.getContextPath()+"login.htm");
return false;
} else { //登录
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
方式二:继承HandlerInterceptorAdapter实现类
package com.yuebai.finance.interceptor;
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.yuebai.finance.bean.User;
import com.yuebai.finance.util.Const;
/**
*
* @ClassName: LoginInterceptor
* @Description: 继承exends HandlerInterceptorAdapter 对方法进行重写
* @author yanqinghai
* @date 2020年8月6日
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//获取session域中的对象
//true,表示将之前分配过的session返回,如果没有分配过,那么就会创建一个新的返回
//false,表示将之前分配过的session返回,如果没有分配过,那么就会返回null
HttpSession session = request.getSession(true);
User user = (User)session.getAttribute(Const.LOGIN_USER);
if (user == null) { //session中没有登录信息
//重定向到登录页面
response.sendRedirect(request.getContextPath()+"/login.htm");
return false;
}else { //session域中存在登录信息
return true;
}
}
}
在springmvc-context.xml文件中配置拦截器
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/**"/>
<!-- 白名单,排除拦截 -->
<mvc:exclude-mapping path="index.htm"/>
<mvc:exclude-mapping path="login.htm"/>
<mvc:exclude-mapping path="dologin.do"/>
<bean id="loginInterceptor" class="com.yuebai.finance.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
在配置拦截器时遇到的问题:cvc-complex-type.2.4.a: Invalid content was found starting with element ‘bean’. One of ‘{“http://www.springframework.org/schema/mvc”:mapping}’ is expected.
解决办法:
<!-- 错误代码!!!!!!! -->
<mvc:interceptors>
<mvc:interceptor>
<bean id="loginInterceptor" class="com.yuebai.finance.interceptor.LoginInterceptor"></bean>
<!-- 拦截所有请求 -->
<mvc:mapping path="/**"/>
<!-- 白名单,排除拦截 -->
<mvc:exclude-mapping path="index.htm"/>
<mvc:exclude-mapping path="login.htm"/>
<mvc:exclude-mapping path="dologin.do"/>
</mvc:interceptor>
</mvc:interceptors>
<!-- 改正后的正确代码!!!!!!!!!
1.修改了<bean></bean>标签的书写位置,放到最后位置
-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有请求 -->
<mvc:mapping path="/**"/>
<!-- 白名单,排除拦截 -->
<mvc:exclude-mapping path="index.htm"/>
<mvc:exclude-mapping path="login.htm"/>
<mvc:exclude-mapping path="dologin.do"/>
<bean id="loginInterceptor" class="com.yuebai.finance.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>