实现用户登录过程的验证,用拦截器可以拦截用户没有登录的情况下,不能进行访问系统页面
以下是自定义拦截器工程目录实现的过程:
1:新建一个 interceptor 拦截器包,创建一个 LoginInterceptor 拦截器类
2:将这个类,继承 HandlerInterceptor 接口,并实现 HandlerInterceptor 这个接口的三个方法
-
public class LoginInterceptor implements HandlerInterceptor {
-
@Override
-
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
-
throws Exception {
-
// 执行完毕,返回前拦截
扫描二维码关注公众号,回复: 12427736 查看本文章 -
}
-
@Override
-
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
-
throws Exception {
-
// 在处理过程中,执行拦截
-
}
-
@Override
-
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
-
// 在拦截点执行前拦截,如果返回true则不执行拦截点后的操作(拦截成功)
-
// 返回false则不执行拦截
-
HttpSession session = request.getSession();
-
//String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的
-
//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("ssm/login")!=-1) {// 说明登录成功 或者 执行登录功能
-
if(session.getAttribute("LOGIN_USER")!=null) {
-
// 登录成功不拦截
-
return true;
-
}else {
-
// 拦截后进入登录页面
-
response.sendRedirect(request.getContextPath()+"/login.html");
-
return false;
-
}
-
}
-
}
3:拦截器是要配置的,将这个类,配置在 spring-mvc.xml 的配置文件中,如下:
-
<!-- 配置拦截器 -->
-
<mvc:interceptors>
-
<mvc:interceptor>
-
<!-- 拦截所有mvc控制器 -->
-
<mvc:mapping path="/**"/>
-
<!-- mvc:exclude-mapping是另外一种拦截,它可以在你后来的测试中对某个页面进行不拦截,这样就不用在
-
LoginInterceptor的preHandler方法里面获取不拦截的请求uri地址了(优选) -->
-
<!-- <mvc:exclude-mapping path="login.do" /> -->
-
<bean class="com.ssm.interceptor.LoginInterceptor"></bean>
-
</mvc:interceptor>
-
</mvc:interceptors>
将登陆拦截器类 LoginInterceptor,配置到里面
这个拦截器有2个知识要点:
①:
<mvc:mapping path="/**"/> 是已经拦截了所有请求,包括登录,如果后来想不拦截某个页面,就在拦截配置里面配置
<mvc:exclude-mapping path="/system/login" />
②:也可以不在配置文件里拦截某个页面请求,在拦截类里面获取拦截路径,然后做个判断
eg:
-
//String uri = request.getRequestURI(); // 获取登录的uri,这个是不进行拦截的
-
//if(session.getAttribute("LOGIN_USER")!=null || uri.indexOf("system/login")!=-1)
4:页面:
-
<div align="center">
-
<br><br><br>
-
<form action="${pageContext.request.contextPath}/user/login" method="post">
-
<p>用户登录</p>
-
账号:<input name="account" type="text" />
-
<br><br>
-
密码:<input name="password" type="password" />
-
<br><br>
-
<input type="reset" value="撤 销" />
-
<input type="submit" value="提 交" />
-
</form>
-
</div>
拦截器已经实现了。
二:过滤器
过滤器就分两步:新建过滤器类,接着配置web.xml
1:
建一个LoginFilter 类,继承 Filter 类
-
public class LoginFilter implements Filter {
-
@Override
-
public void destroy() {
-
// TODO Auto-generated method stub
-
}
-
@Override
-
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
-
throws IOException, ServletException {
-
// TODO Auto-generated method stub
-
HttpServletRequest request = (HttpServletRequest)arg0;
-
HttpServletResponse response = (HttpServletResponse)arg1;
-
HttpSession session = request.getSession();
-
if(session.getAttribute("LOGIN_USER")==null
-
&& request.getRequestURI().indexOf("/ssm/login") == -1){
-
// 没有登录
-
response.sendRedirect(request.getContextPath()+"/login.html");
-
}else{
-
// 已经登录,继续请求下一级资源(继续访问)
-
arg2.doFilter(arg0, arg1);
-
}
-
}
-
@Override
-
public void init(FilterConfig arg0) throws ServletException {
-
// TODO Auto-generated method stub
-
}
-
}
2:配置 web.xml ,在字符过滤器下面接着配置一个过滤器
-
<!-- 使用filter实现登录控制 -->
-
<filter>
-
<filter-name>sessionFilter</filter-name>
-
<filter-class>com.lingshi.bookstore.filter.LoginFilter</filter-class>
-
</filter>
-
<filter-mapping>
-
<filter-name>sessionFilter</filter-name>
-
<!-- 所有的管理页面需要登录后才能访问 -->
-
<url-pattern>*.html</url-pattern>
-
</filter-mapping>
将过滤器类 LoginFilter.class 配置到过滤器配置文件中,即可完成 .
过滤器也实现了