java 拦截器的作用?

    xiaoxiao2022-07-12  159

    转载注明出处~

    1.拦截器都是做什么的?

    做的事和请求和响应有关。(比如前端的css或者一些加载的路径都会走这个拦截器)

    访问日志(记录访客的ip,来源),在线统计人数,字符集转换,身份验证

    可以不破坏你的业务逻辑  在你的业务之外做一些其他事情~

    .过滤器(Filter):所谓过滤器顾名思义是用来过滤的,Java的过滤器能够为我们提供系统级别的过滤,也就是说,能过滤所有的web请求, 这一点,是拦截器无法做到的。在Java Web中,你传入的request,response提前过滤掉一些信息,或者提前设置一些参数,然后再传入servlet或 者struts的action进行业务逻辑,比如过滤掉非法url(不是login.do的地址请求,如果用户没有登陆都过滤掉),或者在传入servlet或者struts 的action前统一设置字符集,或者去除掉一些非法字符(聊天室经常用到的,一些骂人的话)。filter 流程是线性的,url传来之后,检查之后, 可保持原来的流程继续向下执行,被下一个filter, servlet接收。     2.监听器(Listener):Java的监听器,也是系统级别的监听。监听器随web应用的启动而启动。Java的监听器在c/s模式里面经常用到,它 会对特定的事件产生产生一个处理。监听在很多模式下用到,比如说观察者模式,就是一个使用监听器来实现的,在比如统计网站的在线人数。 又比如struts2可以用监听来启动。Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前、发生后可以做一些必要的处理。     3.拦截器(Interceptor):java里的拦截器提供的是非系统级别的拦截,也就是说,就覆盖面来说,拦截器不如过滤器强大,但是更有针对性。 Java中的拦截器是基于Java反射机制实现的,更准确的划分,应该是基于JDK实现的动态代理。它依赖于具体的接口,在运行期间动态生成字节码。 拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其 执行,同时也提供了一种可以提取Action中可重用部分代码的方式。在AOP中,拦截器用于在某个方法或者字段被访问之前,进行拦截然后再之前或 者之后加入某些操作。java的拦截器主要是用在插件上,扩展件上比如 Hibernate Spring Struts2等,有点类似面向切片的技术,在用之前先要在 配置文件即xml,文件里声明一段的那个东西。

    转自:https://www.cnblogs.com/austinspark-jessylu/p/7453302.html

     

    通过项目的调试,在自己的项目中,拦截器是要取一下token的,然后从redis中获取到用户的信息。

    比如:

    private void conversionUserInfo(HttpServletRequest request, String authToken) { try { Object obj = redisService.get(authToken); if (null != obj) { UserInfo userInfo = (UserInfo) obj; request.setAttribute("requestUserName", "LOGIN_" + userInfo.getUserName()); } else { request.setAttribute("requestUserName", "LOGIN_UNKNOWN_USER"); } } catch (Exception e) { log.error("[BaseInterceptor] 失败; error message = {}", e.getMessage()); } }

    在preHandle之后,便要进行postHandle也就是把刚刚set进去的属性,打印出来~

     比如打印一下请求开始的时间,还有从预处理到preHandle的时间。

    打印日志可以追加一下请求的URI 还有请求的类型,是POST还是GET等等

    private StringBuilder prepareRequestContentLog(HttpServletRequest request, String username, Long timeDiff) { StringBuilder content = new StringBuilder(); content.append("["); content.append(username); content.append("] "); if (timeDiff != null) { content.append("["); content.append(timeDiff); content.append("ms] "); } content.append(request.getRequestURI()); String method = request.getMethod(); if ("POST".equals(method)) { appendPostParams(content, request); } else if ("GET".equals(method)) { appendGetParams(content, request); } return content; }

     

    2. 获取POST请求中的参数,并打印(使用request.getParameterMap();)

    private void appendPostParams(StringBuilder content, HttpServletRequest request) { Map parameterMap = request.getParameterMap(); if (parameterMap != null && parameterMap.size() != 0) { content.append("?"); for (Object key : parameterMap.keySet()) { content.append(key); content.append("="); content.append(request.getParameterValues(key.toString())[0]); content.append("&"); } content.deleteCharAt(content.length() - 1); } }

    3. 获取GET请求的参数,并打印(使用request.getQueryString();)

    private void appendGetParams(StringBuilder content, HttpServletRequest request) { String queryString = request.getQueryString(); if (!StringUtils.isBlank(queryString)) { content.append("?"); content.append(queryString); } }

    4. StringBuffer的delete方法与deleteCharAt的区别

    delete方法与deleteCharAt两个方法都是用来删除StringBuffer字符串指定索引字符的方法,

    delete(int  a,int  b)有两个参数,使用时删除索引从a开始(包含a)到b(不包含b)的所有字符;

    deleteCharAt(int  a)只有一个参数,使用时删除索引为a的字符;

    5. @Nullable ModelAndView modelAndView

    @NonNull可以标注在方法、字段、参数之上,表示对应的值不可以为空@Nullable注解可以标注在方法、字段、参数之上,表示对应的值可以为空

    ModelAndView :

    在我们项目中这一项是为null,也没有用到。 这个是以前会用到的东西 现在HTML和接口分离。也就不怎么用了

    ModelAndView包含两部分:一个View和一个Model View由setViewName()方法来决定,决定让ViewResolver去哪里找View文件,并找到是哪个jsp文件; Model由addObject()方法来决定,它的本质是java的HashMap,键值对;

    核心就是Object\LinkedHashMap,完全是Java的标准容器(对象)。

    参考:https://www.cnblogs.com/zhuchuanliang/p/7784772.html

    6. HttpServletRequest 请求中都有什么?剖析?

     

    最新回复(0)