使用过滤器Filter做一个简单的登录验证

1.需求

要做简单的登录验证,只有特定的路径需要登录其他路径不需要(一旦配置不会修改,变化很小),且路径是可配置的。参考了其他文章,做了一个简单的登录验证。

2.总体的思路.

在属性文件中填写需要过滤的路径,在过滤器中初始化时候加载路径且储存,防止每次加载。在过滤器中对路径进行判断。

3.代码

filterUrls.properties 如下:

#url判断过程是将实际路径根据“/” 分割,分割后url字符串,同属性文件以逗号分割的每个路径进行比较 #修改需要重启项目,只在初始化拦截器的时候执行一次 # 注意:*****必须是以逗号分割*****

equalsUrl=system,user,else

xml中新增


    loginFilter
    ************.filter.LoginFilter


    loginFilter
    /*
LoginFilter.java

/**
 * 

文件名称: LoginFilter.java

*

描述: 登录过滤,凡是filterUrl.properites 属性文件拥有的路径,都会判断是否登录,没有登录则进行跳转登录页面 * 判断过程是将 路径根据“/” 分割判断,分割后url字符串,同属性文件每个进行比较

* @author 郭航飞 * @version v1.0 * @update [序号][日期2018/11/8] [郭航飞][变更描述] */ public class LoginFilter implements Filter { private String filterUrlString; // 初始化获得属性文件中的url过滤信息,只执行一次 @Override public void init(FilterConfig filterConfig) throws ServletException { InputStream res= LoginFilter.class.getResourceAsStream("/filterUrl.properties"); Properties pro = new Properties(); try { pro.load(res); filterUrlString = pro.getProperty("equalsUrl").trim(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(); } } /** * @title:doFilter * @description: 过滤器登录验证模块,验证filterUrl.properties文件中的路径,如果未登录,跳转登录页面 * @param servletRequest : * @param servletResponse : * @param filterChain : * @return: void * @author: 郭航飞 * @update: [1.0][日期:2019/7/17 9:35] [郭航飞][优化验证流程,一旦存在停止循环,立即跳转登录页面] */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; //TODO 这里需要自己进行实现,登录的时候将用户信息放到session中 User user = request.getSession().getAttribute("user"); String urlString = request.getRequestURL().toString(); //获得Servlet路径 /user/else String serUrl = request.getServletPath().trim(); String[] urlFragments; // 只有一个数据时候直接放入urlFragments中 if (serUrl.lastIndexOf("/") == 0) { urlFragments=new String[]{serUrl.substring(1, serUrl.length())}; }else{ urlFragments = serUrl.substring(1, serUrl.length()).split("/"); } // css.png.等和登录检验等不过滤 if (urlString.contains(".css") || urlString.contains(".js") || urlString.contains(".png") || urlString.contains(".jpg") || urlString.contains(".ttf") || urlString.contains(".woff") || urlString.contains(".woff2") || urlString.contains("login/check") urlString.contains(".html")) { filterChain.doFilter(request, response); } if (user == null) { // 获得属性中的url,进去判断 String[] filterUrls = filterUrlString.split(","); boolean state =false; for (String urlFragment : urlFragments) { for (String filterUrl : filterUrls) { if (filterUrl.equals(urlFragment)) { request.getRequestDispatcher("/login/main").forward(request, response); state = true; break; } } if (state){ break; }else{ filterChain.doFilter(request, response); } } } else { filterChain.doFilter(request, response); } } @Override public void destroy() { } }

你可能感兴趣的:(java)