SpringBoot MVC(攔截器、異常)

SpringBoot MVC 靜態(tài)資源存放和訪問

在SpringBoot中提供幾個約定的靜態(tài)資源存放路徑。

src/main/resources/public (優(yōu)先級最低)

src/main/resources/static

src/main/resources/resources

src/main/resources/META-INF/resources (優(yōu)先級最高)

自定義靜態(tài)資源路徑,需要定義配置類

@Configuration

public class MyStaticConfiguration implements WebMvcConfigurer{

? ? public void addResourceHandlers(ResourceHandlerRegistry registry) {

? ? ? ? registry.addResourceHandler("/**").addResourceLocations(

? ? ? ? ? ? ? ? "classpath:/mystatic/",

? ? ? ? ? ? ? ? "classpath:/resources/",

? ? ? ? ? ? ? ? "classpath:/static/",

? ? ? ? ? ? ? ? "classpath:/public/"

? ? ? ? ? ? ? ? );? } }

SpringBoot MVC異常處理機制

SpringBoot底層提供了一個ErrorMvcAutoConfiguration自動配置組件,創(chuàng)建了一個BasicErrorController對象,該Controller提供了/error請求響應(yīng)處理,當框架一旦捕獲到程序異常就會自動轉(zhuǎn)發(fā)/error請求,就會看到一個白板提示頁面“Whitelabel Error Page”。

1.如果需要自定義異常界面,可以編寫一個ErrorController覆蓋底層自動配置BasicErrorController功能。

@Controller

public class MyErrorController implements ErrorController{

? ? @RequestMapping("/error")

? ? public ModelAndView errorHtml() {

? ? ? ? ModelAndView mav = new ModelAndView();

? ? ? ? mav.setViewName("myerror");

? ? ? ? return mav;? }

? ? @Override

? ? public String getErrorPath() {

? ? ? ? return "/error"; } }

2.如果需要處理某一個或多個Controller中產(chǎn)生的異常,使用@ExceptionHandler標記

//在Controller類中添加下面的方法

@ExceptionHandler

@ResponseBody

public String errorException(Exception ex) {

? ? return "發(fā)生異常:"+ex.getClass().getName();

}

如果需要重用,可以將該方法封裝,采用繼承形式使用。如果使用@ControllerAdvice表示所有Controller繼承使用了。

@ControllerAdvice//等價于其他controller都繼承BasicController

public class BasicController {

? ? @ExceptionHandler

? ? @ResponseBody

? ? public String errorException(Exception ex) {

? ? ? ? return "發(fā)生異常:"+ex.getClass().getName();? } }


SpringBoot MVC攔截器

1.編寫攔截器組件,實現(xiàn)HandlerInterceptor接口

preHandle、postHandle、afterCompletion

@Component

public class CheckLoginInterceptor implements HandlerInterceptor{

? ? public boolean preHandle(HttpServletRequest request,

? ? ? ? ? ? HttpServletResponse response, Object handler)

? ? ? ? ? ? throws Exception {

? ? ? ? Object user = request.getSession().getAttribute("user");

? ? ? ? if(user == null) {

? ? ? ? ? ? //設(shè)置響應(yīng)界面

? ? ? ? ? ? response.sendRedirect("/tologin");

? ? ? ? ? ? return false;//表示未登錄 }

????????return true;//表示已登錄 }}

2.配置攔截器,實現(xiàn)WebMvcConfigurer接口

@Component

public class InterceptorConfiguration implements WebMvcConfigurer{

? ? @Autowired

? ? private CheckLoginInterceptor check;

? ? public void addInterceptors(InterceptorRegistry registry) {

? ? ? ? registry.addInterceptor(check).addPathPatterns("/**").excludePathPatterns("/tologin"); }}


SpringBoot Servlet/Filter

Filter使用

1.編寫Filter組件,實現(xiàn)Filter接口

2.配置Filter組件

使用@Bean+FilterRegistrationBean配置

@Configuration

public class ServletConfiguration {

? ? @Bean

? ? public FilterRegistrationBean<Filter> checkLoginFilter(){

? ? ? ? FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<Filter>();

? ? ? ? bean.setFilter(new CheckLoginFilter());

? ? ? ? List<String> urls = new ArrayList<String>();

? ? ? ? urls.add("/*");

? ? ? ? bean.setUrlPatterns(urls);

? ? ? ? return bean;? } }

提示:多個Filter執(zhí)行順序按bean.setOrder(1)指定。

使用@ServletComponentScan+@WebFilter配置

@WebFilter(filterName="checkLoginFilter",urlPatterns= {"/*"})

public class CheckLoginFilter implements Filter{

? ? @Override

? ? public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

? ? ? ? ? ? throws IOException, ServletException {

? ? ? ? HttpServletRequest httpRequest = (HttpServletRequest)request;

? ? ? ? HttpServletResponse httpResponse = (HttpServletResponse)response;

? ? ? ? String uri = httpRequest.getRequestURI();

? ? ? ? if(!uri.equals("/tologin")) {

? ? ? ? ? ? Object user = httpRequest.getSession().getAttribute("user");

? ? ? ? ? ? if(user==null) {

? ? ? ? ? ? ? ? //未登錄

? ? ? ? ? ? ? ? httpResponse.sendRedirect("/tologin");

? ? ? ? ? ? ? ? return; } }

? ? ? ? chain.doFilter(httpRequest, httpResponse);? } }

啟動類前面追加@ServletComponentScan

@SpringBootApplication

@MapperScan(basePackages= {"cn.xdl.dao"})

@ServletComponentScan//掃描servlet、filter、listener

public class RunBoot {

? ? public static void main(String[] args) {

? ? ? ? SpringApplication.run(RunBoot.class, args); } }

提示:多個Filter執(zhí)行順序按類名字典順序調(diào)用。


SpringBoot Servlet

1.編寫Servlet組件,繼承HttpServlet

2.配置Servlet組件

使用@Bean+ServletRegistrationBean配置

@Bean

public ServletRegistrationBean<Servlet> someServlet(){

? ? ServletRegistrationBean<Servlet> bean = new ServletRegistrationBean<Servlet>();

? ? bean.setServlet(new SomeServlet());

? ? bean.setLoadOnStartup(1);

? ? List<String> urls = new ArrayList<String>();

? ? urls.add("/some");

? ? urls.add("/some.do");

? ? bean.setUrlMappings(urls);

? ? return bean; }

使用@ServletComponentScan+@WebServlet配置

@WebServlet(name="helloservlet",urlPatterns= {"/some","/some.do"})

public class SomeServlet extends HttpServlet{

? ? public void service(HttpServletRequest request,HttpServletResponse response) throws IOException {

? ? ? ? ? ? PrintWriter out = response.getWriter();

? ? ? ? ? ? out.println("Hello Servlet");

? ? ? ? ? ? out.flush();

? ? ? ? ? ? out.close();? } }

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容