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之三大利器相关推荐

  1. java web三大组件之filter过滤器

    过滤器是java web中相当重要的组成成分,是JavaWeb三大组件之一,它与Servlet很相似.不过过滤器有以下三条特性: 过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servle ...

  2. java怎么监听多个组件,java web(五):java web三大组件之另外两个和八大监听器

    java的三大组件指Servlet.Filter.Listener.八大监听器指八个接口.前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置, Listener监听那些事件. ...

  3. java简述会话对象的生命周期_简述Java Web三大作用域对象

    Java Web三大作用域对象 这三个对象的作用域和生命周期--从上往下依次递增: 上面最小,下面最大. 1.HttpServletRequest--请求对象 HttpServletRequest是生 ...

  4. Java Web 三大框架开发资料

    Spring MVC Controller配置方式 Spring MVC 中,配置Controller时使用的是URL对应Bean的方式. 在SpringMVC中,对于Controller的配置方式有 ...

  5. canoe开发从入门到精通pdf_阿里技术官手写801页PDF《精通Java Web整合开发》

    基础篇 第1~3章为基础篇,重点讲解基于开源架构Java EE应用开发的优势及其开发运行环境的安装配置,同时对JSP技术体系也进行了详细介绍. 基础篇的主要内容包括: Java Web应用开发技术选用 ...

  6. 阿里巴巴的相关-----ODPS技术架构、Java Web架构、PAI机器学习平台

    摘要:ODPS是分布式的海量数据处理平台,提供了丰富的数据处理功能和灵活的编程框架.本文从ODPS面临的挑战.技术架构.Hadoop迁移到ODPS.应用实践注意点等方面带领我们初步了解了ODPS的现状 ...

  7. Java Web应用实践

    <JAVA WEB应用实践> 第一章 .JSP的认识 1.Tomcat7 的目录结构: 目录 说明 /bin 存放用于启动和停止Tomcat的脚本文件 /conf 存放Tomcat服务器的 ...

  8. java web开发初学_2018年学习Web开发的绝对初学者指南

    java web开发初学 This post was originally published on Coder-Coder.com. 该帖子最初发布在Coder-Coder.com上 . If yo ...

  9. Java Web开发API Boy如何进阶?

    导语 | Java Web后台开发基本都离不开Spring生态这一套,Spring框架功能极其强大,会帮忙做许多工作,我们通常只需要在一个函数(包含request和response两个入参)中写处理逻 ...

  10. Java Web 前端高性能优化(一)

    Web 发展的速度让许多人叹为观止,层出不穷的组件.技术,只需要合理的组合.恰当的设置,就可以让 Web 程序性能不断飞跃.所有 Web 的思想都是通用的,它们也可以运用到 Java Web.这一系列 ...

最新文章

  1. 原来安全也能像足球那么踢的
  2. leader选举的原理
  3. 美团深度学习系统的工程实践
  4. redis内存淘汰和持久化_redis 持久化
  5. PSP 版本6.60 破解 PRO-B10自制系统升级图文教程
  6. iOS10.3正式版发布:iOS10.3新功能有哪些? 韩俊强的博客
  7. 网络同步在游戏历史中的发展变化(二)—— Lockstep与帧同步
  8. 024《孤独是生命的礼物》读后感
  9. 【AnimeJs】——仿Animejs徒手实现SVG动画
  10. storj主网挖矿指南
  11. 针对优衣库商品的图片获取(第一张)以及excel图片链接显示成图片
  12. IB选课建议有哪些,怎么选课比较好?
  13. 博客阅读:图解Transformer(The Illustrated Transformer)
  14. HDU - 1284 钱币兑换问题 (找规律/完全背包)
  15. 猴子吃桃问题。猴子第1天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了1个。第2天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天想再吃时,就只剩一个
  16. 怎样实现群晖(NAS)中查看是谁添加、修改、删除文件内容
  17. 基础教育弊端日益显现 中国课程改革势在必行
  18. 计算机网络—ip数据报分片
  19. RBG像素值读取方法
  20. Vue element 下拉框 可输入可选择(无bug)

热门文章

  1. Unity小组工程实践项目《最强外卖员》策划案纠错文档
  2. 最新Keil MDK 5.37下载
  3. 深入学习华为云IOT云平台与LiteOS轻量级物联网系统
  4. GB35114---基于pjsip协议库开发问题
  5. Java实现简单的文本编辑器
  6. 工业控制领域关键技术趋势
  7. Java之路:你真的了解final吗?
  8. 计算机办公自动化应用课程,1-《计算机应用基础(办公自动化)》课程标准.doc
  9. 2020年系统分析师下午论文真题
  10. 高等数学-不定积分基本公式