整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

Java Filter过滤器------对未登录用户访问地址的控制

一、什么是Filter过滤器

在这里插入图片描述

二、 为什么要用Filter过滤器

场景: 防止用户未登录就随意访问了网站内部

在实际场景中,我们在开发完成后,为了保证网站的安全性,只有登录后才能访问某些网站内部的页面,如果不进行一层登录的过滤,那么任何人都能通过URL来随意的访问到网站内部的页面,这是不合理的。例如此刻的我网站内部一个页面URL是

http://localhost:8080/sis/public/page/main.html

但是我想让只有登录过的人才能合法的访问到这个页面,此时使用Filter过滤器就能解决这个问题。实现逻辑是通过Session信息判断是否登录了,如果未登录就重定向到登录的首页。

其他:通过对JSP、Servlet、静态图片文件、或静态HTML文件进行拦截,以实现URL级别的权限控制、过虑敏感词汇、压缩响应信息等一些高级功能。

三、如何使用 1. 重写过滤器的三个方法

public class QuickFilter  implements Filter{
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("qucikFilterRunning");
        //放行请求
        chain.doFilter(request, response);
    }
    @Override
    public void destroy() {
    }
}

java 过滤器实现登录_登录过滤器怎么写_过滤器登录状态才能操作

三个方法都是可以表现 Filter 生命周期的方法,其中 init() 方法在 Web 应用程序加载时会被调用,destroy() 方法在 Web 应用程序卸载(或关闭)时被调用,这两个方法都只会被调用一次,而 () 方法会被调用多次(只要客户端有请求时就会被调用),Filter 所有的工作集中在 () 方法中。

2.使用案例

防止未登录用户访问到网站内部页面,未登录的情况下访问,会进行一个重定向跳转到登录页面。而请求后端非登录接口,不允许访问,一律设置为401

 @WebFilter("/*")//模糊匹配 所以的路径都会过滤 
public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
/**  只要是匹配到了路径,①都先执行doFilter ,②再去执行Servlet*/
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        HttpServletResponse res = (HttpServletResponse) servletResponse;
        String uri = req.getServletPath();
// 校验:①前端html拦截    ②非前端的就是后台接口,除了登录接口之外
        HttpSession session = req.getSession(false);//没有session时候 返回null
        if (session == null) { //没有登录
            //首页重定向到登录页面
            if (  "/public/page/main.html".equals(uri) ) {
                res.setContentType("text/html;charset= UTF-8");
//开始重定向
                String schema = req.getScheme();//HTTP
                String host = req.getServerName();//服务器ip
                int port = req.getServerPort();//端口号
                String ctx = req.getContextPath();//项目部署路径 应用上下文 sis
                // 错误写法①res.sendRedirect("/public/page/main.html");②res.sendRedirect("public/page/main.html");

过滤器登录状态才能操作_java 过滤器实现登录_登录过滤器怎么写

String basePath = schema+"://"+host+":"+port+ctx; res.sendRedirect(basePath+"/public/index.html");//正确写法 return; //请求后端非登录接口, 未登录不允许访间的请求,一般返回401状态码 }else if ( (!uri.startsWith("/public/") && !uri.startsWith("/static/") && !"/user/login".equals(uri))) { res.setContentType("application/json"); PrintWriter pw = res.getWriter(); Response r = new Response(); r.setCode("ERR401"); r.setMessage("不允许访问"); res.setStatus(401);//设置响应的状态码 pw.println(JSONUtil.write(r)); //响应打到前端 pw.flush(); return; } } filterChain.doFilter( servletRequest,servletResponse); } @Override public void destroy() { } }