这篇里面来介绍一个完整的企业级登录(非Demo),本来想做一个完成的商品管理系统,后来做到登录完成后,觉得做下去意义不是很大,登录校验这里已经将所有的技术都包含了,做一个完整的系统无非就是多一些增删查改,登录这节已经全部都包含了,所以就只做到了登录这里。下面来介绍一下这个系统。
系统采用springmvc+mybatis+mysql完成
登录时对密码做校验,如果三次密码错误,帐号将被锁定。帐号如果被锁定,需要管理员来解锁帐号,下面来截图展示下系统。
用户管理
这是系统的展示页面,代码太多,这里就不将所有代码贴出来了,源代码已经上传到资源里面了,这里主要来介绍一下登录校验时所需注意的几个点。框架搭建这里也不做介绍,如果不会,可以参考前面的博客
1、资源项配置
<mvc:resources mapping="/resources/**" location="/resources/" />
mvc:resources在配置时,location指的是WebContent下,mapping指匹配到哪级目录,配置这个是来干什么的呢,这个是资源项配置,jsp页面中需要引用到css,js,图片等等,这个属于资源,不需要进行过滤,这个配置后,/resources/下的文件就不进行拦截,所以这里建议单独建立一个文件夹,将所有的资源放入
2、视图解析器配置
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/pages/" />
<property name="suffix" value=".jsp" />
</bean>
配置这个是当action返回页面时所查找的目录和给名称添加的后缀,controller代码如下
@RequestMapping("/loginpage")
public String returnLogin() {
return "login";
}
这段代码就是action返回字符串login,经过视图解析器解析后,会进入到WebContent/pages/下,查找字符串login添加了.jsp后缀的视图,就是login.jsp,所以这里也是建议建立一个文件夹用来放置jsp页面。
3、登录校验
登录密码校验对一个需要权限验证的系统来说都是重点中的重点,所以我们在登录校验时一定要注意以下几点:
>字符串校验:对登录框中的字符做长度,非空等第一步校验
>黑名单校验:为防止sql注入式漏洞等等,我们应该对登录输入字符串做黑名单校验,例如登录所填写的字符中含有insert,update,delete,select等等时认为是非法登录
>密码加密:为防止数据泄密事件发生,对密码应该在数据库中进行加密存储,加密算法采用业界公认的算法,不要自定义算法
>登录次数限制:应该对输入的错误次数进行限制,当错误次数达到相应次数后,将该帐号锁定,使其不可登录
>登录日志:对每次登录应记录登录日志
以上步骤是业界工人的比较安全的做法,当然还可以在增加其它校验
4、url过滤器
为防止没有登录的帐号,通过url来直接访问需要登录权限才可以访问的页面,我们应该访问的url进行校验,校验时排除我们的资源项,比如js,css,图片等,这里没有什么要说的,过滤器代码和xml配置如下
/**
*
* @Package: com.cailei.cms.filter
* @author: cailei
* @date: 2018年7月3日 下午2:16:33
*/
package com.cailei.cms.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
/**
* @ClassName: LoginFilter
* @Description: TODO
* @author: cailei
* @date: 2018年7月3日 下午2:16:33
*/
public class LoginFilter implements Filter {
private String excludedPages;
private String[] excludedPageArray;
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String url = req.getServletPath();
boolean isExcludedPage = isExcludedPage(url);
if (isExcludedPage) {// 在过滤url之外
chain.doFilter(request, response);
} else {// 不在过滤url之外,判断session是否存在
HttpSession session = ((HttpServletRequest) request).getSession();
if (session == null || session.getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("/cms/v1/loginpage");
} else {
chain.doFilter(request, response);
}
}
}
@Override
public void init(FilterConfig fConfig) throws ServletException {
excludedPages = fConfig.getInitParameter("excludedPages");
if (!StringUtils.isEmpty(excludedPages)) {
excludedPageArray = excludedPages.split(",");
}
return;
}
/**
*
* @Title: isExcludedPage
* @Description: TODO 判断url是否在不过滤范围内
* @param path
* @return boolean
* @author cailei
* @date 2018年7月3日下午7:09:55
*/
private boolean isExcludedPage(String path) {
for (String page : excludedPageArray) {
if (path.startsWith(page)) {
return true;
} else if (path.endsWith(page)) {
return true;
}
}
return false;
}
}
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>
com.cailei.cms.filter.LoginFilter
</filter-class>
<init-param>
<param-name>excludedPages</param-name>
<param-value>/v1/loginpage,/v1/logincheck,/resources,.js,.css,.jsp</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
这就是一个系统在登录校验过程中应该注意的事项,代码上传到了我的下载里面了