Java Web之三大利器
生活随笔
收集整理的這篇文章主要介紹了
Java Web之三大利器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Java Web 三大利器主要有:
- 1.過濾器。
- 2.攔截器。
- 3.監聽器。
一、過濾器
1.什么是過濾器?
過濾器是JavaWeb的三大組件之一。
過濾器它是 JavaEE 的規范,可以在瀏覽器以及目標資源之間起到一個過濾的作用,它的作用是:攔截請求,過濾響應。
Web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。
2.過濾器的應用場景有哪些?
- (1)登錄驗證。
- (2)權限檢查。
- (3)事務管理。
- (4)統一編碼處理。
- (5)敏感字符處理。
3.過濾器的生命周期是什么?
- (1)服務器啟動,首先執行構造方法和init方法(這兩個方法只執行一次)
- (2)當有匹配過濾條件的請求時執行doFilter方法(該方法可以執行多次)
- (3)服務器正常關閉的時候,或者該Filter類重新加載的時候會執行destroy方法(該方法只執行一次)
4.過濾器權限校驗代碼該怎么寫?
@Component public class FilterPerm implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("init......");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;System.out.println("FilterPerm," + request.getRequestURI());RespVO vo = new RespVO();PrintWriter out = null;response.setCharacterEncoding("UTF-8");response.setContentType("application/json; charset=utf-8");try {String token = request.getParameter("token") == null ? null : request.getParameter("token");if (token == null || token == "") {vo.setCode(400);vo.setMsg("未攜帶Token");}if (token != null && "abcdef".equals(token)) {filterChain.doFilter(servletRequest, servletResponse);System.out.println("通過");}if (token != null && !"abcdef".equals(token)) {vo.setCode(403);vo.setMsg("訪問未授權");}} catch (Exception e) {e.printStackTrace();vo.setCode(500);vo.setMsg("Server Error");}out = response.getWriter();String json = JSONUtil.toJsonPrettyStr(vo);// 返回json信息給前端out.append(json);out.flush();}@Overridepublic void destroy() {System.out.println("destroy......");} }二、攔截器
1.什么是攔截器?
Java里的攔截器是動態攔截Action調用的對象,它提供了一種機制可以使開發者在一個Action執行的前后執行一段代碼,也可以在一個Action執行前阻止其執行,同時也提供了一種可以提取Action中可重用部分代碼的方式。
2.攔截器的應用場景有哪些?
- (1)權限控制。
- (2)日志打印。
- (3)參數校驗。
3.攔截器如何實現對權限的控制?
核心代碼:
AuthInterceptor.java
@Component public class AuthInterceptor implements HandlerInterceptor {/*** 忽略攔截的url*/private String urls[] = {"/xxnet/token"};/*** 進入controller層之前攔截請求** @param httpServletRequest* @param httpServletResponse* @param o* @return* @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {String url = httpServletRequest.getRequestURI();String username = httpServletRequest.getHeader("username");String password = httpServletRequest.getHeader("password");// 遍歷需要忽略攔截的路徑for (String item : this.urls) {if (item.equals(url)) {return true;}}if (username == null || password == null) {httpServletResponse.setCharacterEncoding("UTF-8");httpServletResponse.setContentType("application/json; charset=utf-8");PrintWriter out = null;ResultBody res = new ResultBody(ResultCode.TOKEN_ERROR.getCode(), ResultCode.TOKEN_ERROR.getMsg());res.setMsg("用戶名或密碼不能為空");res.setCode("400");String json = JSONUtil.toJsonPrettyStr(res);httpServletResponse.setContentType("application/json");out = httpServletResponse.getWriter();// 返回json信息給前端out.append(json);out.flush();return false;}if (username != null && password != null) {httpServletResponse.setCharacterEncoding("UTF-8");httpServletResponse.setContentType("application/json; charset=utf-8");PrintWriter out = null;try {//獲取用戶名和密碼Props props = new Props("auth.properties");String userName = props.get(CommonConstant.USERNAME).toString();String pwd = props.get(CommonConstant.USERNAME).toString();if (userName.equals(userName) && pwd.equals(password)) {return true;} else if (!userName.equals(userName) || !pwd.equals(password)) {ResultBody res = new ResultBody();res.setMsg("用戶名或密碼錯誤");res.setCode("500");String json = JSONUtil.toJsonPrettyStr(res);httpServletResponse.setContentType("application/json");out = httpServletResponse.getWriter();// 返回json信息給前端out.append(json);out.flush();return false;} else {ResultBody res = new ResultBody();res.setMsg("未登錄,暫無權限");res.setCode("500");String json = JSONUtil.toJsonPrettyStr(res);httpServletResponse.setContentType("application/json");out = httpServletResponse.getWriter();// 返回json信息給前端out.append(json);out.flush();return false;}} catch (Exception e) {e.printStackTrace();httpServletResponse.sendError(500);return false;}}return true;}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {// System.out.println("視圖渲染之后的操作");}}WebConfig.java
@Configuration public class WebConfig implements WebMvcConfigurer {@Autowiredprivate AuthInterceptor authInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authInterceptor).addPathPatterns("/**")//攔截所有的路徑.excludePathPatterns( //添加不攔截路徑"/favicon.ico","/swagger-resources/**", //js靜態資源"/webjars/**", //css靜態資源"/api-doc/**","/doc.html","/v2/api-docs/**");} }三、監聽器
1.什么是監聽器?
監聽器,字面上的理解就是監聽觀察某個事件(程序)的發生情況,當被監聽的事件真的發生了的時候,事件發生者(事件源) 就會給注冊該事件的監聽者(監聽器)發送消息,告訴監聽者某些信息,同時監聽者也可以獲得一份事件對象,根據這個對象可以獲得相關屬性和執行相關操作。
2.監聽器的應用場景有哪些?
- (1)網站初始化。
- (2)統計在線人數。
- (3)統計網站訪問量。
- (4)實現訪問監控。
3.以統計在線人數,對應的監聽器代碼該如何編寫?
UserHttpSessionListener.java
/*** 使用HttpSessionListener統計在線用戶數的監聽器*/ @Component public class UserHttpSessionListener implements HttpSessionListener {private static final Logger logger = LoggerFactory.getLogger(UserHttpSessionListener.class);/*** 記錄在線的用戶數量*/public Integer count = 0;@Overridepublic synchronized void sessionCreated(HttpSessionEvent httpSessionEvent) {logger.info("新用戶上線了");count++;httpSessionEvent.getSession().getServletContext().setAttribute("count", count);}@Overridepublic synchronized void sessionDestroyed(HttpSessionEvent httpSessionEvent) {logger.info("用戶下線了");count--;httpSessionEvent.getSession().getServletContext().setAttribute("count", count);} }TestController.java
@RestController @RequestMapping("/listener") public class TestController {GetMapping("/total") public String getTotalUser(HttpServletRequest request, HttpServletResponse response) {Cookie cookie;try {// 把sessionId記錄在瀏覽器中cookie = new Cookie("JSESSIONID", URLEncoder.encode(request.getSession().getId(), "utf-8"));cookie.setPath("/");//設置cookie有效期為2天,設置長一點cookie.setMaxAge( 48*60 * 60);response.addCookie(cookie);} catch (UnsupportedEncodingException e) {e.printStackTrace();}Integer count = (Integer) request.getSession().getServletContext().getAttribute("count");return "當前在線人數:" + count; }}總結
以上是生活随笔為你收集整理的Java Web之三大利器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SPI通讯协议
- 下一篇: python seaborn boxpl