一、springboot2.0+访问静态资源总是被拦截,而且项目本身并没有自定义拦截器
springboot1.0访问项目静态资源时,可以默认取static目录下边寻找静态资源,但是升级到springboot2.0后,已经无法利用这种方式正常访问到静态资源了。
解决方式一:
在application.properties中添加路径及静态资源配置,但这种方法亲测不行,还是贴上配置方式。
静态文件路径配置
spring.resources.static-locations= classpath:/static //此配置为静态资源的真实路径
spring.mvc.static-path-pattern=/resources/static/** //此配置为访问静态资源的url配置
解决方式二:
使用静态资源映射器,此种方式,需要继承WebMvcConfigurationSupport类。
package com.example.springboot;
import com.alibaba.druid.support.http.StatViewServlet;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import java.util.List;
@SpringBootApplication
@MapperScan(value = "com.example.springboot.dao")
@EnableTransactionManagement
public class SpringbootApplication extends WebMvcConfigurationSupport {
@Autowired
HandlerMethodArgumentResolver handlerMethodArgumentResolver;
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
//druid连接池页面配置
@Bean
public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
registrationBean.addInitParameter("allow", "127.0.0.1");// IP白名单 (没有配置或者为空,则允许所有访问)
registrationBean.addInitParameter("deny", "");// IP黑名单 (存在共同时,deny优先于allow)
registrationBean.addInitParameter("loginUsername", "root");
registrationBean.addInitParameter("loginPassword", "1234");
registrationBean.addInitParameter("resetEnable", "false");
return registrationBean;
}
/**
* 原先的参数映射器是加在xml中进行配置的,使用springboot的时候需要用这种方式进行配置
* 此处使用webmvcConfigurerAdapter可以正常使用
*
* @param argumentResolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(handlerMethodArgumentResolver);
}
/**
* 静态资源映射器,需要注意的是:这种方式为在全局的基础上配置,如果要自定义
* 类去继承该类,别忘了要打上@configuration注解
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
二、登录拦截的简单实现。
1.基于上述代码,依旧重写SpringbootApplication类的addInterceptors方法,此方法为应用程序添加请求拦截器。
/**
* 服务请求拦截器,通过excludePathPatterns过滤掉不需要拦截的请求,或者通过addPathPatterns添加需要拦截的请求,设置为/*则拦截所有请求,如果只配置/则是精确匹配
* @param registry
*/
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/loginPage"); //请求登录页面不做拦截
}
以上内容针对请求进行了拦截,当用户直接请求登录页面时,不做拦截,否则会出现用户未登录而无限拦截请求情况。
2.拦截器实现
package com.example.springboot.common.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* Created by ZhangPei on 2019/9/29.
*/
public class LoginInterceptor implements HandlerInterceptor {
/**
* 在请求被处理之前做的事情
* @param request
* @param response
* @param handler
* @return
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException, ServletException {
StringBuffer requestURL = request.getRequestURL();
System.out.println("本次请求url为:" + requestURL);
HttpSession session = request.getSession();
boolean isLogin = false;
if (session != null) {
//如果用户登录成功,则会把用户的sessionID和塞进session中
Object loginFlag = session.getAttribute(session.getId());
if (loginFlag instanceof Boolean) {
isLogin = (boolean) loginFlag;
}
}
if (!isLogin) {
response.sendRedirect("/loginPage");
}
return isLogin;
}
/**
* 在服务器受理请求后,但在渲染视图层之前做的事情
* @param request
* @param response
* @param handler
* @param modelAndView
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws ServletException, IOException {
}
/**
* 在视图层渲染之后做的事情
* @param request
* @param response
* @param handler
* @param ex
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}
网友评论