springmvc的拦截器代码:
package com.lingshi.bookstore.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;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
// 执行完毕,返回前拦截
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
// 在处理过程中,执行拦截
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
// 在拦截点执行前拦截,如果返回true则不执行拦截点后的操作(拦截成功)
// 返回false则不执行拦截
HttpSession session = request.getSession();
//String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的
// if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1) {// 说明登录成功 或者 执行登录功能
if(session.getAttribute("LOGIN_USER")!=null) {
// 登录成功不拦截
return true;
}else {
// 拦截后进入登录页面
response.sendRedirect(request.getContextPath()+"/system/login");
return false;
}
}
}
springmvc的配置:
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<!-- 拦截所有mvc控制器 -->
<mvc:mapping path="/**"/>
<!-- mvc:exclude-mapping是另外一种拦截,它可以在你后来的测试中对某个页面进行不拦截,这样就不用在
LoginInterceptor的preHandler方法里面获取不拦截的请求uri地址了(优选) -->
<mvc:exclude-mapping path="/system/login" />
<bean class="com.lingshi.bookstore.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
springmvc的过滤器配置:
package com.lingshi.bookstore.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class LoginFilter implements Filter {
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
throws IOException, ServletException {
// TODO Auto-generated method stub
HttpServletRequest request = (HttpServletRequest)arg0;
HttpServletResponse response = (HttpServletResponse)arg1;
HttpSession session = request.getSession();
if(session.getAttribute("LOGIN_USER")==null
&& request.getRequestURI().indexOf("/system/login") == -1){
// 没有登录
response.sendRedirect(request.getContextPath()+"/system/login");
}else{
// 已经登录,继续请求下一级资源(继续访问)
arg2.doFilter(arg0, arg1);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
过滤器在web.xml配置
<!-- 使用filter实现登录控制 -->
<filter>
<filter-name>SessionFilter</filter-name>
<filter-class>com.lingshi.bookstore.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SessionFilter</filter-name>
<!-- 所有的管理页面需要登录后才能访问 -->
<url-pattern>/views/*</url-pattern>
</filter-mapping>
SpringBoot的mvc拦截器配置:
/**
* 进行登录检查
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 这是在方法执行之前执行的方法
* @param request
* @param response
* @param handler
* @return
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object user = request.getSession().getAttribute("username");
System.out.println("输出一次看看结果:"+user);
if(user == null){
// 未登陆,则返回登陆页面
request.setAttribute("msg","没有权限,请先登陆");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else{
// 以登录,放行
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}
然后注册到容器中
// 所有的WebMvcConfigurerAdapter组件都会一起起作用
// @Bean 是将组件加入到容器中(@Bean 是重点)
@Bean
public WebMvcConfigurerAdapter webMvcConfigurerAdapter(){
WebMvcConfigurerAdapter adapter = new WebMvcConfigurerAdapter(){
@Override
public void addViewControllers(ViewControllerRegistry registry){
registry.addViewController("/").setViewName("login");
registry.addViewController("/login.html").setViewName("login");
registry.addViewController("/main.html").setViewName("dashboard");
}
// 注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry){
// 静态资源:*.css,*.js
// springBoot已经做好了静态资源映射的问题,所有不用担心静态资源的拦截问题
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login");
}
};
return adapter;
}