page contents

java web教程——Java Web之三大利器

本文讲述了Java web教程——Java Web之三大利器!具有很好的参考价值,希望对大家有所帮助。一起跟随六星小编过来看看吧,具体如下:

attachments-2023-06-pkiEtROH64827ea74e83c.png本文讲述了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 {

    @Override

    public void init(FilterConfig filterConfig) throws ServletException {

        System.out.println("init......");


    }


    @Override

    public 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();

    }


    @Override

    public 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

     */

    @Override

    public 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;

    }



    @Override

    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

        // System.out.println("视图渲染之后的操作");

    }


}



WebConfig.java


@Configuration

public class WebConfig implements WebMvcConfigurer {


    @Autowired

    private AuthInterceptor authInterceptor;


    @Override

    public 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;

 

    @Override

    public synchronized void sessionCreated(HttpSessionEvent httpSessionEvent) {

        logger.info("新用户上线了");

        count++;

        httpSessionEvent.getSession().getServletContext().setAttribute("count", count);

    }

 

    @Override

    public 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编程语言,推荐大家关注一个微信公众号:Java圈子。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Java入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2023-03-2AoKIjPQ64014b4ad30a3.jpg

  • 发表于 2023-06-09 09:22
  • 阅读 ( 171 )
  • 分类:Java开发

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
王昭君
王昭君

209 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 1478 文章
  3. Pack 1135 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章