javascript
拦截器---SpringMVC(权限拦截)
攔截器
概述
SpringMVC的處理器攔截器類似于Servlet開發(fā)中的過濾器Filter,用于對處理器進行預(yù)處理和后處理。開發(fā)者可以自己定義一些攔截器來實現(xiàn)特定的功能。
**過濾器與攔截器的區(qū)別:**攔截器是AOP思想的具體應(yīng)用。
過濾器
- servlet規(guī)范中的一部分,任何java web工程都可以使用
- 在url-pattern中配置了/*之后,可以對所有要訪問的資源進行攔截
攔截器
- 攔截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用
- 攔截器只會攔截訪問的控制器方法, 如果訪問的是jsp/html/css/image/js是不會進行攔截的
自定義攔截器
那如何實現(xiàn)攔截器呢?
想要自定義攔截器,必須實現(xiàn) HandlerInterceptor 接口。
1、新建一個Moudule , springmvc-07-Interceptor , 添加web支持
2、配置web.xml 和 springmvc-servlet.xml 文件
3、編寫一個攔截器
package com.kuang.interceptor;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class MyInterceptor implements HandlerInterceptor {//在請求處理的方法之前執(zhí)行//如果返回true執(zhí)行下一個攔截器//如果返回false就不執(zhí)行下一個攔截器public boolean preHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("------------處理前------------");return true;}//在請求處理方法執(zhí)行之后執(zhí)行public void postHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)throws Exception {System.out.println("------------處理后------------");}//在dispatcherServlet處理后執(zhí)行,做清理工作.public void afterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("------------清理------------");} }4、在springmvc的配置文件中配置攔截器
<!--關(guān)于攔截器的配置--> <mvc:interceptors><mvc:interceptor><!--/** 包括路徑及其子路徑--><!--/admin/* 攔截的是/admin/add等等這種 , /admin/add/user不會被攔截--><!--/admin/** 攔截的是/admin/下的所有--><mvc:mapping path="/**"/><!--bean配置的就是攔截器--><bean class="com.kuang.interceptor.MyInterceptor"/></mvc:interceptor> </mvc:interceptors>5、編寫一個Controller,接收請求
package com.kuang.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody;//測試攔截器的控制器 @Controller public class InterceptorController {@RequestMapping("/interceptor")@ResponseBodypublic String testFunction() {System.out.println("控制器中的方法執(zhí)行了");return "hello";} }6、前端 index.jsp
<a href="${pageContext.request.contextPath}/interceptor">攔截器測試</a>7、啟動tomcat 測試一下!
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xsNxRTbL-1609816486371)(data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVQImWNgYGBgAAAABQABh6FO1AAAAABJRU5ErkJggg==)]
驗證用戶是否登錄 (認證用戶)
實現(xiàn)思路
1、有一個登陸頁面,需要寫一個controller訪問頁面。
2、登陸頁面有一提交表單的動作。需要在controller中處理。判斷用戶名密碼是否正確。如果正確,向session中寫入用戶信息。返回登陸成功。
3、攔截用戶請求,判斷用戶是否登陸。如果用戶已經(jīng)登陸。放行, 如果用戶未登陸,跳轉(zhuǎn)到登陸頁面
測試:
1、編寫一個登陸頁面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head><h1>登錄頁面</h1> <hr><body> <form action="${pageContext.request.contextPath}/user/login">用戶名:<input type="text" name="username"> <br>密碼:<input type="password" name="pwd"> <br><input type="submit" value="提交"> </form> </body> </html>2、編寫一個Controller處理請求
package com.kuang.controller;import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpSession;@Controller @RequestMapping("/user") public class UserController {//跳轉(zhuǎn)到登陸頁面@RequestMapping("/jumplogin")public String jumpLogin() throws Exception {return "login";}//跳轉(zhuǎn)到成功頁面@RequestMapping("/jumpSuccess")public String jumpSuccess() throws Exception {return "success";}//登陸提交@RequestMapping("/login")public String login(HttpSession session, String username, String pwd) throwsException {// 向session記錄用戶身份信息System.out.println("接收前端==="+username);session.setAttribute("user", username);return "success";}//退出登陸@RequestMapping("logout")public String logout(HttpSession session) throws Exception {// session 過期session.invalidate();return "login";} }3、編寫一個登陸成功的頁面 success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head><title>Title</title> </head> <body><h1>登錄成功頁面</h1> <hr>${user} <a href="${pageContext.request.contextPath}/user/logout">注銷</a> </body> </html>4、在 index 頁面上測試跳轉(zhuǎn)!啟動Tomcat 測試,未登錄也可以進入主頁!
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html><head><title>$Title$</title></head><body><h1>首頁</h1><hr> <%--登錄--%><a href="${pageContext.request.contextPath}/user/jumplogin">登錄</a><a href="${pageContext.request.contextPath}/user/jumpSuccess">成功頁面</a></body> </html>5、編寫用戶登錄攔截器
package com.kuang.config;import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException;public class LoginIntercepor implements HandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {// 如果是登陸頁面則放行System.out.println("uri: " + request.getRequestURI());if (request.getRequestURI().contains("login")) {return true;}HttpSession session = request.getSession();// 如果用戶已登陸也放行if(session.getAttribute("user") != null) {return true;}// 用戶沒有登陸跳轉(zhuǎn)到登陸頁面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response);return false;}public void postHandle(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView)throws Exception {}public void afterCompletion(HttpServletRequest httpServletRequest,HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {} }6、在Springmvc的配置文件中注冊攔截器
<!--關(guān)于攔截器的配置--> <mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean id="loginInterceptor" class="com.kuang.interceptor.LoginInterceptor"/></mvc:interceptor> </mvc:interceptors>7、再次重啟Tomcat測試!
OK,測試登錄攔截功能無誤.
總結(jié)
以上是生活随笔為你收集整理的拦截器---SpringMVC(权限拦截)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二手笔记本电脑怎么选配置?
- 下一篇: 6000左右电脑配置单?